1. 程式人生 > >數據結構之線性表

數據結構之線性表

鏈表 next size 實現 creat 隨機生成 結構 什麽 結點

  線性表是最簡單最常用的一種數據結構,在生活中各個方面都有應用。

  線性表的定義:線性表大多數情況下是除了第一個位置的數據元素只存在後繼元素,最後一個位置的數據元素只存在前驅元素外,所有數據元素都存在前驅和後繼的一個有限序列。舉個簡單的例子就是:字母表中除了 a 只存在後繼 b,z 只存在前驅 y之外,剩余的所有字母全部都有前驅和後繼。為什麽是大多數情況下,是因為線性表的鏈式存儲結構中除了單向鏈表,還有循環鏈表和雙向鏈表。

  線性表的存儲結構:順序存儲(數組實現,需要預先分配連續的內存空間)和鏈式存儲(鏈表實現,不需要預先分配內存空間)

  在本篇文章利用C語言對線性表進行實現存儲和相應算法。在線性表的鏈式存儲中,我們可以定義結點

的數據類型,結點包含兩個域,分別為數據域指針域,數據域是用來存儲要存儲的數據元素的信息,而指針域就是存儲下一個結點的地址,也就是指向下一個結點。碼一下代碼,方便以後回來看。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <math.h>
  4 
  5 typedef int ElemType;
  6 
  7 typedef struct node
  8 {
  9     ElemType data;
 10     struct node *next;
 11 }LNode,*LinkList;
12 13 14 /* 15 創建單鏈表頭結點 16 */ 17 LinkList createList(LinkList L) 18 { 19 L = (LinkList)malloc(sizeof(LNode)); 20 if(!L) 21 { 22 printf("內存申請失敗!"); 23 exit(-1); 24 } 25 L->next = NULL; 26 return L; 27 } 28 29 /* 30 初始化單鏈表 31 */ 32 void
InitList(LinkList L) 33 { 34 int i=0,n; 35 LinkList p,s; 36 p=L; 37 38 printf("請輸入要建立的線性表長度:"); 39 scanf("%d",&n); 40 41 for(i=0; i < n; i++) 42 { 43 s = (LinkList)malloc(sizeof(LNode)); 44 if(!s) 45 { 46 printf("內存分配失敗!"); 47 exit(-1); 48 } 49 50 /* 51 該函數實現的單向鏈表的數據元素是利用隨機函數隨機生成的, 52 若想自己手動輸入可把下面一句註釋打開 53 */ 54 // scanf("%d",&s->data); 55 s->data = rand() % 100; 56 s->next=NULL; 57 p->next = s; 58 p = s; 59 } 60 } 61 62 /* 63 遍歷單鏈表 64 */ 65 void TraverseList(LinkList L) 66 { 67 LinkList p; 68 69 if(!L) 70 { 71 printf("線性表不存在!\n"); 72 } 73 else 74 { 75 p = L->next; //指向線性表的第一個元素 76 while(p) 77 { 78 printf("%d -> ",p->data); 79 p=p->next; 80 } 81 printf("\n"); 82 } 83 } 84 85 /* 86 逆置單鏈表 87 */ 88 void ReverseList(LinkList L) 89 { 90 LinkList p,q,s; //創建三個結點指針來進行線性表的逆置 91 p = L->next; //p指向第一個元素 92 q=s=NULL; //q/s開始置NULL 93 while(p) //p是當前要逆置的結點 94 { 95 q = p->next; //q指向p的下一個結點,也就是要逆置的下一個結點 96 p->next = s; /* p為第一個結點:逆置後第一個結點變為最後一個結點,所以p的指針域為NULL 97 p不為第一個結點:p指向上一個結點 98 */ 99 s = p; //逆置成功後,s指向當前逆置成功的結點 100 p = q; //p指向要逆置的下一個結點 101 } 102 L->next = s; //頭指針L指向逆置成功後的第一個結點 103 TraverseList(L); 104 } 105 106 /* 107 刪除數據為偶數的節點 108 */ 109 void DeleteEven(LinkList L) 110 { 111 LinkList p,s,q; 112 p = L; 113 while(p) 114 { 115 s = p; 116 while(s->next) 117 { 118 if(s->next->data % 2 == 0) 119 { 120 q = s->next; 121 s->next = q->next; 122 free(q); 123 } 124 else 125 { 126 s = s->next; 127 } 128 } 129 p = p->next; 130 } 131 TraverseList(L); 132 } 133 134 /* 135 將單向鏈表排序 136 */ 137 void SortList(LinkList L) 138 { 139 LinkList p,q; 140 int s; 141 for(p = L->next; p->next != NULL; p = p->next) 142 { 143 for(q = p->next; q != NULL; q = q->next) 144 { 145 if(p->data > q->data) 146 { 147 s = p->data; 148 p->data = q->data; 149 q->data = s; 150 } 151 } 152 } 153 TraverseList(L); 154 } 155 156 /* 157 向有序表中插入數據 158 */ 159 void InsertList(LinkList L,ElemType n) 160 { 161 LinkList p,s,q; 162 s = (LinkList)malloc(sizeof(LNode)); 163 s->data = n; 164 165 if(L->next == NULL) 166 { 167 s->next = NULL; 168 L->next = s; 169 } 170 else if(L) 171 { 172 for(q = L,p = L->next; p != NULL; p = p->next,q = q->next) 173 { 174 if(s->data <= p->data) 175 { 176 s->next = p; 177 q->next = s; 178 break; 179 } 180 if(p->next == NULL) 181 { 182 s->next = NULL; 183 p->next = s; 184 break; 185 } 186 } 187 188 } 189 TraverseList(L); 190 191 } 192 193 /* 194 兩個線性表的合並 195 */ 196 void UnionList() 197 { 198 LinkList L1,L2,p,s; 199 int n,i = 0; 200 201 printf("\n\n創建線性表L1:\n"); 202 L1 = createList(L1); 203 InitList(L1); 204 SortList(L1); 205 206 printf("創建線性表L2:\n"); 207 L2 = createList(L2); 208 InitList(L2); 209 SortList(L2); 210 211 printf("合並後線性表:\n"); 212 p = L2->next; 213 while(p) 214 { 215 printf("第 %d 次插入: ",++i); 216 InsertList(L1,p->data); 217 p=p->next; 218 } 219 220 } 221 222 223 int main() 224 { 225 226 LinkList L; 227 ElemType n; 228 L = createList(L); 229 InitList(L); 230 TraverseList(L); 231 printf("逆置線性表:\n"); 232 ReverseList(L); 233 234 printf("刪除數據為偶數的節點:\n"); 235 DeleteEven(L); 236 237 printf("排序後的線性表:\n"); 238 SortList(L); 239 240 printf("請輸入要插入的數據:"); 241 scanf("%d",&n); 242 printf("插入數據後的線性表:\n"); 243 InsertList(L,n); 244 245 UnionList(); 246 return 0; 247 }

數據結構之線性表