由於數據結構放置了很久,對一些基本的操作有些遺忘,於是近期重新開啟了數據結構的學習模式。本文只要講述了順序存儲線性表的一些基本操作,對於老鳥老說可能偏簡單,但是對於新手或者很久沒碰線性表的讀者來說,還是比較有價值的,代碼我都一一調試過。且必要的地方,我也做了詳細的注釋,這樣也為自己后期學習做了一個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 請按任意鍵繼續. . .
本文為作者原創,歡迎轉載,轉載請注明出處。