1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define OK 1 5 #define ERR 2 6 #define TRUE 1 7 #define FALSE 0 8 #define MAXSIZE 20 //定義線性表的最大長度 9 10 typedef int status; //定義函數返回的狀態,OK & ERR 11 typedef char datatype; //定義線性表中每個結點的數據類型,這里暫定為字符型 12 13 typedef struct { 14 datatype data[MAXSIZE]; //存儲着線性表中的每個結點 15 int length; //線性表當前的長度 16 } SequenceList; 17 18 /* 函數原型,線性表的基本操作 */ 19 SequenceList *createSequenceList(void); 20 status isEmpty(SequenceList *L); 21 void clear(SequenceList *L); 22 int getLength(SequenceList *L); 23 int locateNode(SequenceList *L,datatype node_to_locate); 24 datatype getNode(SequenceList *L, int index); 25 status insert(SequenceList *L, int index, datatype node_to_insert); 26 status delete(SequenceList *L, int index); 27 void showList(SequenceList *L); 28 29 int main(){ 30 /* 測試 */ 31 SequenceList *root; //指向線性表 32 root=createSequenceList(); //創建一個線性表 33 printf("Length = %d\n",getLength(root)); //打印線性表的當前長度 34 printf("isEmpty = %d\n",isEmpty(root)); //打印線性表是否為空 35 insert(root,0,'A'); //分別插入4個結點 36 insert(root,0,'B'); 37 insert(root,1,'C'); 38 insert(root,1,'D'); 39 printf("Length = %d\n",getLength(root)); 40 printf("isEmpty = %d\n",isEmpty(root)); 41 showList(root); //打印線性表 42 putchar('\n'); 43 delete(root,1); //刪除index=1(數組下標為1)的結點 44 showList(root); 45 putchar('\n'); 46 printf("Locate = %d\n",locateNode(root,'A')); //打印查找到的結點的位置 47 printf("getNode = %c\n",getNode(root,1)); //打印下標是1的結點的值 48 clear(root); //清空線性表 49 printf("isEmpty = %d",isEmpty(root)); 50 51 return 0; 52 } 53 54 SequenceList *createSequenceList(void){ 55 SequenceList *tmp; 56 tmp=malloc(sizeof(SequenceList));//void*類型指針能自動轉為其他類型的指針 57 tmp->length=0; //初始化線性表長度 58 return tmp; 59 } 60 status isEmpty(SequenceList *L){ 61 if (L->length==0) 62 return TRUE; 63 else 64 return FALSE; 65 } 66 void clear(SequenceList *L){ 67 L->length=0; 68 } 69 int getLength(SequenceList *L){ 70 return L->length; 71 } 72 int locateNode(SequenceList *L, datatype node_to_locate){ 73 //返回找到的結點的index 74 //node_to_locate應當是能唯一標識一個結點的數據,否則只返回匹配的第一個結點 75 int i; 76 for (i=0; i<L->length; i++){ 77 if (L->data[i]==node_to_locate) 78 return i; 79 } 80 return -1; //未找到任何匹配 81 } 82 datatype getNode(SequenceList *L, int index){ 83 //index表示線性表中第N個結點,頭結點的index是0 84 if (L->length==0 || index<0 || index>L->length-1) return (datatype)ERR; 85 return L->data[index]; 86 } 87 status insert(SequenceList *L, int index, datatype node_to_insert){ 88 //node_to_insert表示想要插入的結點 89 //當列表為空時,只有index=0才能插入 90 int k; 91 if (L->length == MAXSIZE) return ERR; //線性表已滿 92 if (index<0 || index>L->length) return ERR; //index不在有效范圍 93 if (index<L->length){ 94 //插入的位置不是最后一個結點的下一個結點 95 for (k=L->length-1; k>=index; k--){ 96 L->data[k+1]=L->data[k]; //將要插入結點后面的所有結點都往后移 97 } 98 } 99 L->data[index]=node_to_insert; //將新結點插入 100 L->length++; 101 return OK; 102 } 103 status delete(SequenceList *L, int index){ 104 int k; 105 if (L->length == 0) return ERR; //線性表為空 106 if (index<0 || index>L->length-1) return ERR; //index不在有效范圍 107 if (index<L->length-1){ 108 //刪除的位置不是最后一個結點 109 for (k=index; k<L->length-1; k++){ 110 L->data[k]=L->data[k+1]; //將刪除位置后面的結點都往前移 111 } 112 } 113 L->length--; 114 return OK; 115 } 116 void showList(SequenceList *L){ 117 int i; 118 for (i=0; i<L->length; i++){ 119 printf("%c\t",L->data[i]); 120 } 121 } 122 123 /* 124 順序存儲結構的線性表的優缺點: 125 優點: 126 1.不必為每個結點之間的邏輯關系增加額外的存儲空間 127 2.可以快速地讀和寫表中任意一個結點 128 缺點: 129 1.插入和刪除需要移動大量結點 130 2.線性表動態變化較大,難以確定所需的存儲空間 131 3.數組預設過長會造成空間浪費(存儲碎片) 132 */ 133 /* 環境: Code::Blocks with GCC 5.1 */
運行截圖:

