順序表的操作(靜態)

順序表的操作(靜態)

以菜單的形式,顯示線性表的各種操作,界面大概如下圖所示:

image-20200324102113569

各個功能的具體實現

1.聲明順序表

順序表通常有兩種形式,一種靜態的,即通過確定長度的數組來存儲元素。另一種則是動態的,通過動態內存分配,來控制順序表的容量。

#define MAXSIZE 100 //最大容量
typedef int ElemType; //元素的基本數據類型,方便更改
typedef struct SeqList //SeqList可以省略
{ 
    ElemType elem[MAXSIZE];/定長數組;
    int length; //有效數字的個數,順序表當前存儲元素的個數;  

}SeqList; //這裏的SeqList相當於 struct SeqList 即可以通過SeqList L;直接聲明順序表變量

2.順序表的初始化

由於靜態的順序表在聲明的時候就確定了容量,所以就不用再開闢空間,直接把表長設爲0即可。

void InitList(SeqList *L)
{
    L->length=0; //把順序表的長度設置爲0
}

靜態順序表的這一步跟清空順序表的操作一樣,都是把表長設置爲0;

3.判斷順序表是否爲空

如果線性表的長度爲0,那麼這個線性表就爲空;

//判斷線性表是否爲空
int ListEmpty(SeqList L)
{
    if(L.length==0)//如果長度爲0,返回1
        return 1;
    return 0;//默認非空,返回0;
}

4.查找順序表指定位置的元素

順序表的位置比數組的下標大1,要記住的關係。也就是第i個元素的下標爲i-1

//查找指定位置的元素
int GetElem(SeqList L,int i,ElemType *e) //i 表示查詢的位置 ,e用來存儲查詢到的元素
{
    if(i<=L.length&&i>=1) //判斷查詢的位置是否合法
    {
        *e=L.elem[i-1];
        return 1;
    }
    return -1;
}

5.查找指定元素的位置

int LocateElem(SeqList L,ElemType e)//e用來保存指定的元素
{
    int i;
    for(i=0; i<L.length; i++)
    {
        if(L.elem[i]==e)
            return i+1; //返回值爲元素的位置即第幾個元素

    }
    return 0;
}

6.向順序表的指定位置插入元素

也就是把要插入的位置空出來,把原來的位置整體右移1位。最後再把順序表的長度加一


int InsertList(SeqList *L,int i,ElemType e) //i 插入的位置 e 插入的元素
{
    int j;//移動元素的標號
    if(i<1||i>L->length+1)
    {
        printf("插入位置不合法\n");
        return -1;
    }
    else if (L->length>=MAXSIZE)
    {
        printf("順序表已滿,不能插入元素\n");
        return 0;
    }
    else
    {
        for(j=L->length; j>=i; j--)
        {
            L->elem[j]=L->elem[j-1];//從最右開始依次向右移動一個位置

        }
        L->elem[i-1]=e;//第i個元素存放我們要插入的元素
        L->length=L->length+1;//順序表的長度加1
        return 1;
    }
}

7.刪除指定位置的元素;

int DeleteList(SeqList *L,int i,ElemType *e)
{
    int j;
    if(L->length<=0)
    {
        printf("順序表已被清空,不能進行刪除\n");
        return 0;
    }
    else if(i<1||i>L->length)
    {
        printf("刪除位置不合適\n");
        return -1;
    }
    else
    {
        *e=L->elem[i-1];
        for (j=i; j<=L->length; j++)
        {
            L->elem[j-1]=L->elem[j];
        }
        L->length=L->length-1;
        return 1;
    }
}

8.順序表的長度

int ListLength(SeqList L)
{
    return L.length;
}

9.打印順序表

void PrintList(SeqList L)
{
    int i;
    if(L.length==0)
    {

        printf("該順序表爲空!\n");
    }
    else
    {   ElemType *p=0;
         p=L.elem;
        for(i=1; i<=L.length; i++)
        {


            printf("%d  ",*p);
            p++;
        }
        printf("\n");
    }

}

10.求指定元素的前驅和後繼

void QianQv(SeqList L,ElemType i)
{
    if(i<1||i>L.length)
        printf("輸入不合法\n");

    else if(i==1)
        printf("該元素無前驅元素\n");
    else
        printf("該元素的前驅爲%d\n",L.elem[i-1-1]);
}

void HouJi(SeqList L,int i)
{
    if(i<1||i>L.length)
        printf("輸入不合法\n");
    else   if(i==L.length)
        printf("該元素無後繼元素\n");
    else
        printf("該元素的後繼元素爲%d\n",L.elem[i]);
}

完整的實現代碼

頭文件SeqList.h

#ifndef SEQLIST_H_INCLUDED
#define SEQLIST_H_INCLUDED
typedef struct
{
    ElemType elem[MAXSIZE];//存儲空間基址,相當於數組第一個元素的地址
    int length;    //表長。元素個數
} SeqList;
//初始化線性表
void InitList(SeqList *L)
{
    L->length=0; //把順序表的長度設置爲0
}

//判斷線性表是否爲空
int ListEmpty(SeqList L)
{
    if(L.length==0)
        return 1;
    return 0;
}
//查找指定位置的元素
int GetElem(SeqList L,int i,ElemType *e)
{
    if(i<=L.length&&i>=1)
    {
        *e=L.elem[i-1];
        return 1;
    }
    return -1;
}
//查找指定元素是第幾個
int LocateElem(SeqList L,ElemType e)
{
    int i;
    for(i=0; i<L.length; i++)
    {
        if(L.elem[i]==e)
            return i+1;

    }
    return 0;
}
//向順序表的指定位置插入元素
int InsertList(SeqList *L,int i,ElemType e)
{
    int j;//移動元素的標號
    if(i<1||i>L->length+1)
    {
        printf("插入位置不合法\n");
        return -1;
    }
    else if (L->length>=MAXSIZE)
    {
        printf("順序表已滿,不能插入元素\n");
        return 0;
    }
    else
    {
        for(j=L->length; j>=i; j--)
        {
            L->elem[j]=L->elem[j-1];//從最右開始依次向右移動一個位置

        }
        L->elem[i-1]=e;//第i個元素
        L->length=L->length+1;//順序表的長度加1
        return 1;
    }
}
//刪除指定位置的元素;
int DeleteList(SeqList *L,int i,ElemType *e)
{
    int j;
    if(L->length<=0)
    {
        printf("順序表已被清空,不能進行刪除\n");
        return 0;
    }
    else if(i<1||i>L->length)
    {
        printf("刪除位置不合適\n");
        return -1;
    }
    else
    {
        *e=L->elem[i-1];
        for (j=i; j<=L->length; j++)
        {
            L->elem[j-1]=L->elem[j];
        }
        L->length=L->length-1;
        return 1;
    }
}
//順序表的長度
int ListLength(SeqList L)
{
    return L.length;
}
void ClearList(SeqList *L)
{
    L->length=0;
}
void PrintList(SeqList L)
{
    int i;
    if(L.length==0)
    {

        printf("該順序表爲空!\n");
    }
    else
    {
        ElemType *p=0;
        p=L.elem;
        for(i=1; i<=L.length; i++)
        {


            printf("%d  ",*p);
            p++;
        }
        printf("\n");
    }




}
void QianQv(SeqList L,ElemType i)
{
    if(i<1||i>L.length)
        printf("輸入不合法\n");

    else if(i==1)
        printf("該元素無前驅元素\n");
    else
        printf("該元素的前驅爲%d\n",L.elem[i-1-1]);
}
void HouJi(SeqList L,int i)
{
    if(i<1||i>L.length)
        printf("輸入不合法\n");
    else   if(i==L.length)
        printf("該元素無後繼元素\n");
    else
        printf("該元素的後繼元素爲%d\n",L.elem[i]);
}
#endif // SEQLIST_H_INCLUDED

main.c文件

typedef int ElemType;//數據類型
#define MAXSIZE 100  //線性表最大長度
#define OK 1
#define OVERFLOW -2
#define Error -1
typedef int Status;//返回值類型
#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h"
void Menu()
{
    printf("********順序表的操作*********\n");
    printf("0.菜單\n");
    printf("1.順序表的初始化\n");
    printf("2.判斷順序表是否爲空\n");
    printf("3.查詢順序表中第i個元素\n");
    printf("4.查詢指定元素是第幾個\n");
    printf("5.向指定位置插入指定元素!\n");
    printf("6.求出線性表的長度\n");
    printf("7.刪除指定位置的元素\n");
    printf("8.打印順序表的所有元素\n");
    printf("9.求指定元素的前驅和後繼\n");
    printf("輸入q退出本程序!\n");
}
int main()
{
    SeqList L;//聲明一個線性表L
    int i;
    char kb;//kb用來接收用戶輸入的序號
    ElemType e;//存儲某個位置的元素
    Menu();//菜單
    InitList(&L);
    while(1)
    {
        printf("請輸入你要進行的操作前面的序號:");
        scanf("%c",&kb);
        getchar();//拋棄回車符
        switch(kb)
        {
            case '0':
                Menu();
            case '1':
                InitList(&L);
                printf("順序表已初始化!\n");
                break;
            case '2':
                if(ListEmpty(L)==0)
                    printf("線性表不爲空!\n");
                else
                    printf("線性表爲空!\n");
                break;
            case '3':
                printf("請輸入你要查的元素是第幾個:");
                scanf("%d",&i);
                getchar();
                if(GetElem(L,i,&e)==1)
                    printf("你要查詢的元素的位置爲:%d\n",i);
                else
                    printf("你查詢的位置有誤!\n");
                break;
            case '4':
                     printf("請輸入你要查詢的元素:");
                     scanf("%d",&e);
                     getchar();
                     if(LocateElem(L,e))
                        printf("該元素是第%d個元素\n",LocateElem(L,e));
                     else
                        printf("該順序表中沒有該元素!\n");
                     break;
            case '5':
                    printf("請輸入你要插入的位置:");
                    scanf("%d",&i);
                    getchar();
                    printf("請輸入你要插入的元素:");
                    scanf("%d",&e);
                    getchar();
                    InsertList(&L,i,e);
                    printf("線性表的長度爲:%d\n",ListLength(L));
                    break;
            case '6':
                    printf("線性表的長度爲:%d\n",ListLength(L));
                    break;
            case '7':
                    printf("請輸入你要刪除的位置:");
                    scanf("%d",&i);
                    getchar();
                    DeleteList(&L,i,&e);
                    if(DeleteList(&L,i,&e)==1)
                    {
                        printf("刪除成功,你刪除的元素是%d\n",e);
                        printf("線性表的長度爲:%d\n",ListLength(L));
                    }

                    break;
            case '8':
                 PrintList(L);
                 break;
            case '9':
                  printf("請輸入你要查詢的位置:");
                  scanf("%d",&i);
                  getchar();
                  QianQv(L,i);
                  HouJi(L,i);
                  break;
            case 'q':
                exit(0);
            default:
                printf("請檢查你輸入的序號是否正確!\n");
                break;

        }

    }

    return 0;
}

最終運行結果

********順序表的操作*********
0.菜單
1.順序表的初始化
2.判斷順序表是否爲空
3.查詢順序表中第i個元素
4.查詢指定元素是第幾個
5.向指定位置插入指定元素!
6.求出線性表的長度
7.刪除指定位置的元素
8.打印順序表的所有元素
9.求指定元素的前驅和後繼
輸入q退出本程序!
請輸入你要進行的操作前面的序號:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章