C語言數據結構-建立鏈表的四種方法

結點類型: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、不管鏈表是否爲空,其頭指針是指向頭結點在的

     非空指針(空表中頭結點的指針域爲空),所以空表和

     非空表的處理也就統一了。

 

基於上述兩點優勢,跟人以爲之後在創建鏈表的時候,建立帶頭結點的鏈表。

相關文章
相關標籤/搜索