結點類型:spa
typedef int datatype;指針
typedef struct NODE{code
datatype data;blog
struct NODE *next;作用域
}Node,*LinkList;io
一、不帶頭結點的頭插入法建立鏈表。class
每建立一個結點,都使該結點成爲頭結點,這樣頭結點不斷地向前移動,就能夠建立一個沒有特定頭結點的鏈表。變量
首先建立的結點,會出如今整個鏈表的最末端,因此數據的寫入是逆序的。List
【開始的時候,head要初始化爲NULL】方法
LinkList LinkListCreate(const int n) { int i; LinkList head; Node *p; head = NULL; for(;i<n;i++) { p = (Node*)malloc(sizeof(Node)); if(NULL == p) perror("ERROR"); scanf("%d",&p->data);
p->next = head; head = p; } }
開始時候,head 是一個空指針,建立一個結點p。如今head是指向一個鏈表的頭結點,建立了一個新的結點p,向前插入。因此要p->next = head;而後再使head成爲新鏈表的頭結點。
二、不帶頭結點的未插入法建立鏈表。
建立這樣的鏈表,首先指向頭結點的指針不能移動,因此須要建立一個一直指向尾結點的指針rear。
LinkList LinkListCreate(const int n) { int n= 0; //建立一個一直指向頭結點,一直指向尾結點的指針。 LinkList head; Node *p,*rear; rear = head = NULL; for(;i<n;i++) { p = (Node*)malloc(sizeof(Node)); scanf("%d",&p->data); if(NULL == head) //建立的第一個結點。 else rear->next = p;//鏈表非空 rear = p;//移動尾指針 }
rear->next = NULL;//最後將鏈表的結尾設置爲NULL。 }
【值的注意的就是,最後設置鏈表的結尾爲NULL】
三、建立帶結點的頭插入鏈表。
所謂的頭結點是不存儲數據的,他只是個指針結點。能夠在該頭結點存儲一些這個鏈表的總體信息。好比鏈表的結點數量。
這種
建立方法跟第一種方法是同樣的思路。
1 LinkList LinkListCreate(const int n) 2 { 3 int i = 0;LinkList p; 4 LinkList head = (Node*)malloc(sizeof(Node)); 5 head->next = NULL; 6 7 for(;i<n;i++) 8 { 9 p = (Node*)malloc(sizeof(Node)); 10 scanf("%d",&p->data); 11 p->next = head->next; 12 head->next = p; 13 } 14 15 return head; 16 }
【純C語言,是要求全部的變量在使用的時候,必須在做用域的開始處定義。】
四、帶頭結點的尾插入法建立鏈表。
開始建立的時候,rear = head. rear->next = p; rear = p;最後要使的rear->next = NULL;
LinkList LinkListCreate(const int n) { int i = 0;Node *p,*rear; LinkList head = (Node*)malloc(sizeof(Node)); rear = head; for(;i<n;i++) { p = (Node*)malloc(sizeof(Node)); scanf("%d",&p->data); rear->next = p; //尾指針 指向新建結點 rear = p;//rear指針移動 } rear->next = NULL; return head; }
歡迎指正……
有的吧友給我建議說一下有頭結點的好處,下面是個人我的所思:、
頭結點:若是在鏈表的開始結點以前附加一個結點,並稱它爲頭結點,那麼會帶來如下兩個優勢:
a、 因爲開始結點的位置被存放在頭結點的指針域中,
因此在鏈表的第一個位置上的操做就和在表的其它位置上
的操做一致,無需進行特殊處理;
b、不管鏈表是否爲空,其頭指針是指向頭結點在的
非空指針(空表中頭結點的指針域爲空),所以空表和
非空表的處理也就統一了。
基於上述兩點優勢,跟人以爲之後在創建鏈表的時候,建立帶頭結點的鏈表。