代碼里面的一些 define先了解一下:
#define LIST_INIT_SIZE 100 //線性表的初始建立長度 #define LISTINCREMENT 10 //每次增加的長度
#define ElemType int //線性表的存儲的基本數據型 #define OK 1 #define OVERFLOW -2 #define ERROR -1 #define Status int
我用的書是嚴蔚敏的《數據結構(C語言版)》 紫色書。
書上的代碼都很好理解,學習時候碰到過的小問題會總結提醒一下。
1. 函數會出現 類似於 void MergeList(List La,List Lb, List &Lc) 這樣的函數定義,一開始我也是直接照着抄上了,記着在用C++時用過,結果一直報錯,
百度一下發現,C語言是沒有&Lc這種形式的形參的,在C++中叫做引用。
2. 所以傳入函數的應該是線性表的地址,函數里面對線性表的操作都要用指針實現 例如:L.length 要改成 L->length
1 Status InitList_Sq(Sqlist *L) 2 { //構造一個空的線性表 3 L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); 4 if(!L->elem) exit(OVERFLOW); //儲存分配失敗 5 L->length = 0; //空表長度為0 6 L->listsize = LIST_INIT_SIZE; //初始存儲容量 7 return OK; 8 }//InitList_Sq
1 Status ListInsert_Sq(Sqlist *L, int i, ElemType e) 2 { 3 //在順序線性表L中第i個位置之前插入新的元素e 4 //i的合法值為1<=i<=ListLength_Sq(L) + 1 5 ElemType *newbase, *q, *p; 6 7 if(i < 1 || i > L->length + 1) return ERROR;//i值不合法 8 if(L->length >= L->listsize) //當前存儲空間已滿,增加分配 9 { 10 newbase = (ElemType *)realloc(L->elem, 11 (L->listsize + LISTINCREMENT)*sizeof(ElemType)); 12 if(!newbase) return ERROR; //分配失敗 13 L->elem = newbase; //新基址 14 L->listsize += LISTINCREMENT; //增加存儲容量 15 } 16 q = &L->elem[i-1]; //q為插入位置 17 for(p = &L->elem[L->length-1]; p >= q; --p) 18 *(p+1) = *p; //插入位置及之后的元素后移 19 *q = e; //插入e 20 L->length++; //表增長1 21 return OK; 22 }//ListInsert_Sq
1 Status ListDelete_Sq(Sqlist *L, ElemType i, ElemType *e) 2 { 3 //在順序線性表L中刪除第i個元素,並用e返回其值 4 //i的合法值為1<=i<=ListLength_Sq(L) 5 ElemType *p, *q; 6 if(i < 1 || i > L->length + 1) return ERROR;//i 值不合法 7 8 p = &L->elem[i-1]; //p為被刪除元素的位置 9 *e = *p; //被刪除元素的值賦給e 10 q = &L->elem[i] + L->length - 1;//表尾元素的位置 11 for(++p; p <= q; p++) //++p為要移動元素的第一個 12 *(p-1) = *p; //元素左移 13 L->length--; //表長減一 14 return OK; 15 }//ListDelete_Sq
下面的完整代碼,可以試一試:

#include <stdio.h> #include <stdlib.h> #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define ElemType int #define OK 1 #define OVERFLOW -2 #define ERROR -1 #define Status int typedef struct{ ElemType *elem;//存儲空間基址 int length; //當前長度 int listsize; //當前分配的存儲容量 }Sqlist; Status InitList_Sq(Sqlist *L) { //構造一個空的線性表 L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L->elem) exit(OVERFLOW); //儲存分配失敗 L->length = 0; //空表長度為0 L->listsize = LIST_INIT_SIZE; //初始存儲容量 return OK; }//InitList_Sq Status ListInsert_Sq(Sqlist *L, int i, ElemType e) { //在順序線性表L中第i個位置之前插入新的元素e //i的合法值為1<=i<=ListLength_Sq(L) + 1 ElemType *newbase, *q, *p; if(i < 1 || i > L->length + 1) return ERROR;//i值不合法 if(L->length >= L->listsize) //當前存儲空間已滿,增加分配 { newbase = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT)*sizeof(ElemType)); if(!newbase) return ERROR; //分配失敗 L->elem = newbase; //新基址 L->listsize += LISTINCREMENT; //增加存儲容量 } q = &L->elem[i-1]; //q為插入位置 for(p = &L->elem[L->length-1]; p >= q; --p) *(p+1) = *p; //插入位置及之后的元素后移 *q = e; //插入e L->length++; //表增長1 return OK; }//ListInsert_Sq Status ListDelete_Sq(Sqlist *L, ElemType i, ElemType *e) { //在順序線性表L中刪除第i個元素,並用e返回其值 //i的合法值為1<=i<=ListLength_Sq(L) ElemType *p, *q; if(i < 1 || i > L->length + 1) return ERROR;//i 值不合法 p = &L->elem[i-1]; //p為被刪除元素的位置 *e = *p; //被刪除元素的值賦給e q = &L->elem[i] + L->length - 1;//表尾元素的位置 for(++p; p <= q; p++) //++p為要移動元素的第一個 *(p-1) = *p; //元素左移 L->length--; //表長減一 return OK; }//ListDelete_Sq int main() { Sqlist L; if(!InitList_Sq(&L)) exit(OVERFLOW); int a[ ] = {12, 13, 21, 24, 28, 30, 42, 77};//線性表的元素 for(int i=0; i<8; i++) //建表 { L.elem[i] = a[i]; L.length++; //記錄長度 } printf("~~~~~~\n"); for(int i=0; i < L.length; i++) printf("%d ",L.elem[i]); printf("\nlength = %d\n",L.length); printf("\n~~~~~~\n"); ListInsert_Sq(&L, 5, 25); //在第五個位置插入值 25 for(int i=0; i < L.length; i++) printf("%d ",L.elem[i]); printf("\nlength = %d\n",L.length); printf("\n~~~~~~\n"); int e; ListDelete_Sq(&L, 5, &e); //在第五個位置刪除值 25 for(int i=0; i < L.length; i++) printf("%d ",L.elem[i]); printf("\nlength = %d\n",L.length); printf("e = %d\n",e); printf("\n~~~~~~~\n"); return 0; }