線性表的總結:順序存儲線性表的初始化,創建,插入,刪除,清空,銷毀等操作


      由於數據結構放置了很久,對一些基本的操作有些遺忘,於是近期重新開啟了數據結構的學習模式。本文只要講述了順序存儲線性表的一些基本操作,對於老鳥老說可能偏簡單,但是對於新手或者很久沒碰線性表的讀者來說,還是比較有價值的,代碼我都一一調試過。且必要的地方,我也做了詳細的注釋,這樣也為自己后期學習做了一個remark。歡迎有興趣的小伙伴跟我在站內交流互動,后期我會持續更新。

      這是我的學習代碼:

#include "stdafx.h"
#include "malloc.h"
#include "stdio.h"

#define MAXSIZE 20    //一般順序線性表的最大長度是固定的
#define LIST_INI_LENGTH 5    //初始化時線性表的長度                    
#define OK 1
#define ERROR 0
#define TRUE 0
#define FALSE 0
typedef int Status;//函數的類型,其值是函數結果狀態代碼
typedef int ElemType;//定義線性表元素類型

typedef struct     //定義一個順序存儲結構類類型
{
    ElemType data[MAXSIZE];//線性表的數據元素
    int cur_length;//線性表的當前長度
}SqList;

Status ListInitial(SqList *L)//線性表的初始化
{
    L =(SqList*) malloc(MAXSIZE*sizeof(SqList));//為線性表分配內存,注:這里一定要強制類型轉換
    if (L == NULL)
        printf("初始化失敗!");
    L->cur_length = 0;//初始化時線性表分配的長度
    //for (int i = 0; i < LIST_INI_LENGTH;i++)
    //    L->data[i] = 0;
    return OK;

}

Status ListCreate(SqList *L)//線性表的創建,一般發生在初始化之后
{
    int i, n=0;
    printf("請在鍵盤輸入即將創建的線性表長度:\n");
    scanf_s("%d", &n);//讀者可以嘗試把這條語句改成scanf_s("%d\n", &n),看運行結果
    L->cur_length = n;
    printf("請在鍵盤輸入即將創建的線性表中的元素:\n");
    for (i = 0; i <n; i++)
    {
        scanf_s("%d", &L->data[i]);//注意小細節,讀者可以把這條語句改成scanf_s("%d\n", &L->data[i]),然后分析運行結果
    }
        
    return OK;
}
Status ListClear(SqList *L)//線性表的清空
{
    int i;
    for (i = 0; i < L->cur_length; i++)
        L->data[i] = 0;
    L->cur_length = 0;
    return OK;
}

Status ListDestory(SqList L)//線性表的銷毀
{
    free(L.data);
    return OK;
}
Status ListInsert(SqList *L, int i, ElemType e)//在L中的第i個位置之前插入新的數據元素e,L的長度加1
{
    int k;
    if (L->cur_length == MAXSIZE)//順序表已滿
        return ERROR;
    if (i<1 || i>L->cur_length)//當插入位置i不在線性表范圍內時
        return ERROR;
    if (i < L->cur_length)//若插入數據的位置不在表尾
    {
        for (k = L->cur_length - 1; k >= i - 1; k--)
            L->data[k + 1] = L->data[k];
    }
    L->data[i - 1] = e;//將新元素插入
    L->cur_length++;//新元素插入后,線性表的長度加1
    return OK;
}

Status ListDelete(SqList *L, int i, ElemType *e)//刪除線性表L的第i個元素,並用e返回其值,L的長度減1
{
    int k;
    if (L->cur_length == 0)
        return ERROR;
    if (i<1 || i>L->cur_length)//當刪除位置i不在線性表范圍內時
        return ERROR;
    *e = L->data[i - 1];
    if (i < L->cur_length)//若刪除的數據的位置不在表尾
    {
        for (k = i; k<L->cur_length; k++)
            L->data[k-1] = L->data[k];
    }
    L->cur_length--;//刪除元素后,線性表的長度減1
    return OK;
}

Status GetElem(SqList L, int i, ElemType *e)//獲得第i個元素的操作
{
    if (L.cur_length == 0 || i<1 || i>L.cur_length)
        return ERROR;
    *e = L.data[i - 1];
    return OK;
}
int main()//主測試函數
{
    SqList L1 = {NULL};//還可以定義為*L1
    Status ListInitial(SqList &L1);//初始化線性表
    printf("初始化后線性表的長度為:");
    printf("%d\n", L1.cur_length);
    ListCreate(&L1);//創建線性表

    printf("當前線性表的長度為:");
    printf("%d\n", L1.cur_length);
    //SqList L2;
    ElemType f;
    ElemType a=1,b=2,e;
    ListInsert(&L1, 1, a); 
    ListInsert(&L1, 2, b);
    printf("插入元素后輸出當前的線性表的實際長度為:");
    printf("%d\n", L1.cur_length);
    
    ListDelete(&L1, 2, &f);
    printf("輸出被刪除的元素:");
    printf("%d\n", f);
    
    printf("刪除元素后線性表的實際長度為:");
    printf("%d\n", L1.cur_length);
    
    printf("輸出線性表最后剩下的元素:\n");
    for (int j = 0; j < L1.cur_length; j++)
    {    
        
        printf("%d\n", L1.data[j]);
    }
    
    GetElem(L1, 2, &e);//獲取線性表中的第二個元素
    printf("輸出獲取的第2個元素:");
    printf("%d\n", e);

    ListClear(&L1);//清空線性表,這個函數需要采用地址傳遞,而不能定義為Status ListClear(SqList L)
    printf("輸出線性表此刻的長度:");
    printf("%d\n", L1.cur_length);

    return 0;
}

    下面是根據鍵盤提示輸入數據后,我創建的順序線性表的長度為5,下面代碼的具體運行結果,代碼的運行過程我再這里就不贅述了:

初始化后線性表的長度為:0
請在鍵盤輸入即將創建的線性表長度:
5
請在鍵盤輸入即將創建的線性表中的元素:
1
2
3
4
5
當前線性表的長度為:5
插入元素后輸出當前的線性表的實際長度為:7
輸出被刪除的元素:2
刪除元素后線性表的實際長度為:6
輸出線性表最后剩下的元素:
1
1
2
3
4
5
輸出獲取的第2個元素:1
輸出線性表此刻的長度:0
請按任意鍵繼續. . .

  本文為作者原創,歡迎轉載,轉載請注明出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM