1. 程式人生 > >線性表的順序存儲結構

線性表的順序存儲結構

switch urn 查詢 print update 賦值 tlist 頭文件 -s

順序存儲線性表的結構體:

#define MAXSIZE 100        //數組最大長度
typedef int ElemType;        //元素類型

typedef struct            //定義線性表結構體
{
    ElemType date[MAXSIZE];        //線性表存儲元素的數組
    int length;                    //記錄線性表的長度
}sqList;                        //線性表的名稱

順序存儲的插入函數:

/*
線性表的插入函數
*p  指向線性表的指針
i   需要插入的位置
e   將要插入的元素
Status未返回值類型,在頭文件處定義,格式為:typedef int Status; //返回值類型,操作成功返回1(OK),失敗返回0(ERROR)
*/ Status ListInsert(sqList *p, int i, ElemType e) { if(p->length == MAXSIZE) //如果表長度已經等於最大值,則表已滿,返回ERROR return ERROR; if(i < 1 || i > p->length + 1) //如果i<1或i>表長+1,則位置有誤,返回ERROR return ERROR; if(i <= p->length) //判斷i是不是表尾位置 {
for(int k = p->length; k >= i - 1; k--) //將表中i之後的元素全部後移一個位置 p->date[k+1] = p->date[k]; } p->date[i-1] = e; //將第i個位置的元素賦值為e p->length++; //將表長+1 return OK; //操作成功,返回OK }

順序存儲的刪除函數:

/*
線性表的刪除操作函數
*p  指向線性表的指針
i   需要刪除的位置
*e  將刪除的元素存入*e中返回
*/ Status ListDel(sqList *p, int i, ElemType *e) { if(p->length == 0) //判斷線性表是否為空 return ERROR; if(i < 1 || i > p->length) //判斷i的位置是否合理 return ERROR; *e = p->date[i-1]; //將表中第i個元素的值賦值給*e printf("刪除的元素為 %d\n", *e); if(i <= p->length) //判斷i是不是表尾元素 { for(int k = i-1; k <= p->length; k++) //將表中i後的元素全部向前移一位 p->date[k] = p->date[k+1]; } p->length--; //將表長-1 return OK; //操作成功返回OK }

順序存儲的索引查找函數:

/*
線性表的查詢操作
p  表的形參
i  需要得到的位置
*e 將所查位置的元素賦值給*e返回
*/
Status GetElem(sqList p, int i, ElemType *e)
{
    if(p.length == 0 || i < 1 || i > p.length)        //判斷表是否為空,i位置是否合理
        return ERROR;
    *e = p.date[i-1];        //將表的第i個元素賦值給*e
    printf("此處的元素為 %d\n", *e);
    return OK;                //操作成功返回OK
}

順序存儲的修改函數:

/*
修改表中i位置的元素內容
*/
Status UpdateList(sqList *p, int i, ElemType e)
{
    if(p->length == 0 || i < 1 || i > p->length)
        return ERROR;
    p->date[i-1] = e;
    return OK;
}

順序存儲的遍歷打印函數:

/*
遍歷打印表中元素
*/
Status PrintList(sqList p)
{
    int i = 0;
    if(p.length == 0)
        return ERROR;
    while(i < p.length)
    {
        printf("%d ", p.date[i]);
        i++;
    }
    printf("\n");
    return OK;
}

主函數:

void main()
{
    sqList list;        //聲明線性表的變量
    list.length = 0;    //設置表長為0,相當於初始化
    int i, e;            //i為元素位置,e為元素內容

    while(true)
    {
        printf("請選擇對線性表的操作:\n");
        printf("1.插入\n");
        printf("2.刪除\n");
        printf("3.查找\n");
        printf("4.輸出\n");
        printf("5.修改\n");
        printf("6.退出\n");
        int a;
        scanf("%d", &a);
        switch(a)
        {
            case 1:
                printf("請輸入需要插入的位置:");
                scanf("%d", &i);
                printf("請輸入需要插入的元素:");
                scanf("%d", &e);
                if(ListInsert(&list, i, e))
                    printf("插入成功\n");
                else
                    printf("插入失敗\n");
                break;
            case 2:
                printf("請輸入需要刪除的位置:");
                scanf("%d", &i);
                if(ListDel(&list, i, &e))
                    printf("刪除成功\n");
                else
                    printf("刪除失敗\n");
                break;
            case 3:
                printf("請輸入需要查找的位置:");
                scanf("%d", &i);
                if(GetElem(list, i, &e))
                    printf("查詢成功\n");
                else
                    printf("查詢失敗\n");
                break;
            case 4:
                PrintList(list);
                break;
            case 5:
                printf("請輸入需要修改的位置:");
                scanf("%d", &i);
                printf("請輸入新的的元素:");
                scanf("%d", &e);
                if(UpdateList(&list, i, e))
                    printf("修改成功\n");
                else
                    printf("修改失敗\n");
                break;
            case 6:
                return;
            default:
                printf("選擇錯誤\n");
                break;
        }
    }
}

經檢測,所有代碼均可執行!

線性表的順序存儲結構