參考文檔:
1)《《大話數據結構》》
2)http://blog.chinaunix.net/uid-20680669-id-147844.html
3)http://blog.csdn.net/strommaybin/article/details/51919464
1. 線性表(list): 零個或多個數據元素的有限序列
線性表(Linear_list)是最常用也是最簡單的數據結構。簡言之,一個線性表是n個數據元素的有限序列。線性表是有線性結構的表。什麼是線性結構呢?線性結構是n個數據元素的有序集合。它有四個基本特征:
1.集合中必存在唯一的一個”第一個元素”;
2.集合中必存在唯一的一個”最後的元素”;
3.除最後元素之外,其它數據元素均有唯一的”後繼”;
4.除第一元素之外,其它數據元素均有唯一的”前驅”。
如(a1,a2,a3,…..,an),a1為第一個元素,an為最後一個元素,此集合極為一個線性結構的集合。
相對應於線性結構,非線性結構的邏輯特征是一個結點元素可能對應多個直接前驅和多個後驅。
常用的線性結構有:線性表,棧,隊列,雙隊列,數組,鏈表,串。
2. 功能及實現:
1 typedef int Status; 2 3 4 //1. 結構體的定義: 5 #define MAXSIZE 100 6 typedef int ElemType; 7 8 //結構體的定義 9 typedef struct list 10 { 11 ElemType data[MAXSIZE];//數據 12 int length ; //線性表的當前長度 13 } sqlist; 14 15 16 //2. 初始化 17 sqlist * init_sqlist() 18 { 19 //tmp=(TSeqList*)malloc(sizeof(TSeqList));//分配空間 20 sqlist *list=(sqlist*)malloc(sizeof(sqlist)); 21 list->length=0; 22 return list; 23 } 24 25 //3.尾部插值 26 int insert_rear_sqlist(sqlist *list,ElemType data) 27 { 28 int ret=0; 29 if(list->length==MAXSIZE||list->length==0) 30 { 31 ret=-1; 32 printf("func insert_rear_sqlist erro: %d",ret); 33 return -1; 34 } 35 list->length=list->length++;//長度+1 36 list->data[list->length]=data;//插入數據 37 return 0; 38 } 39 40 // 4. 打印節點的值 41 int print_sqlist(sqlist *list) 42 { 43 int ret=-1; 44 if(list->length==0) 45 { 46 printf("\nThe list is empty: %d \n",ret); 47 return ret; 48 } 49 50 else 51 { 52 for(int i=0;i<list->length;i++) 53 printf("%5d\n",list->data[i]); 54 } 55 return 0; 56 } 57 58 //5. 判斷是否為空 59 int is_empty_sqlist(sqlist *list) 60 { 61 return list->length==0?0:1; 62 } 63 64 //6. 查找值為x的節點的 位置(有問題 待改正) 65 int find_num_sqlist(sqlist* list,ElemType data) 66 { 67 int ret=0; 68 int temp=0; 69 if(list->length==MAXSIZE||list->length==0) 70 { 71 ret=-1; 72 printf("func insert_rear_sqlist erro: %d",ret); 73 return -1; 74 } 75 for (int i=0;list->length<MAXSIZE;i++) 76 { 77 if(list->data[i]==data) 78 temp=i; 79 } 80 81 return temp; 82 } 83 84 //7. 取得i節點的值 85 int get_elem(sqlist *list,int i) 86 { 87 if(list->length<=0||i<0||i>list->length) 88 { 89 return -1; 90 } 91 return list->data[i]; 92 } 93 94 // 8. 在i位置插入e值 95 int insert_list(sqlist *list,int i,ElemType e) 96 { 97 int k=0,ret=0; 98 if(list->length==MAXSIZE) 99 { 100 ret=-1; 101 printf("insert_list erro :%d ",ret); 102 } 103 if(i<0||i>list->length||list->length>MAXSIZE) 104 { 105 ret=-2; 106 printf("insert_list erro :%d ",ret); 107 } 108 109 for (k=list->length;k>=i;k--) 110 { 111 list->data[k]=list->data[k-1];//元素後移 112 } 113 list->data[i]=e; 114 list->length++; 115 116 return 0; 117 } 118 119 //9. 刪除i位置的節點 120 int delete_list(sqlist *list,int i,ElemType *e) 121 { 122 int k=0; 123 int ret=0; 124 if(list->length==0) 125 { 126 ret=-1; 127 printf("delete_list erro: %d",ret); 128 } 129 if(i<0||i>list->length) 130 { 131 ret=-1; 132 printf("delete_list erro: %d",ret); 133 } 134 // if(i<list->length) 135 //{ 136 *e=list->data[i]; 137 for(k=i;k<=list->length;k++) 138 { 139 list->data[k]=list->data[k+1];//元素前移 140 } 141 //} 142 list->length--; 143 return 0; 144 }
---------------------------------------
3. 測試代碼
1 int main() 2 { 3 int ret=0; 4 int t1=1; 5 int t2=2; 6 int t3=3; 7 int t4=4; 8 int t5=5; 9 10 //sqlist *list; 11 //void init_sqlist(sqlist *list) 12 sqlist *list=init_sqlist(); 13 14 //cout<<sizeof(*list); 15 //int insert_list(sqlist *list,int i,ElemType e); 16 //1. 頭插法 17 ret=insert_list(list,0,t1); 18 ret=insert_list(list,0,t2); 19 ret=insert_list(list,0,t3); 20 ret=insert_list(list,0,t4); 21 ret=insert_list(list,0,t5); 22 23 //2. 打印 遍歷 24 //int print_sqlist(sqlist *list) 25 printf("插入數據: \n"); 26 ret=print_sqlist(list); 27 int tmp=0; 28 29 //3. 刪除鏈表中所有的節點 30 printf("\n刪除節點數據: \n"); 31 while(list->length>0) 32 { 33 //int delete_list(sqlist *list,int i,ElemType *e) 34 ret=delete_list(list,0,&tmp); 35 printf("%5d\n",tmp); 36 } 37 38 //5. 判斷是否為空 39 //int is_empty_sqlist(sqlist *list) 40 ret=is_empty_sqlist(list); 41 printf("鏈表是否為空%5d\n",ret); 42 43 system("pause"); 44 return 0; 45 }
4。 運行結果