線性表的順序存儲結構(C語言實現)


  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 */

運行截圖:


免責聲明!

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



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