1. 程式人生 > >C語言資料結構——一步步教會你尾插法和頭插法

C語言資料結構——一步步教會你尾插法和頭插法

連結串列也是線性表的一種,與順序表不同的是,它在記憶體中不是連續存放的。在C語言中,連結串列是通過指標相關實現的。而單鏈表是連結串列的其中一種,關於單鏈表就是其節點中有資料域和只有一個指向下個節點的指標域。 
建立單鏈表的方法有兩種,分別是頭插法和尾插法。

所謂頭插法,就是按節點的逆序方法逐漸將結點插入到連結串列的頭部。反之尾插法就是按節點的順序逐漸將節點插入到連結串列的尾部。

相對來說,頭插法要比尾插法演算法簡單,但是最後產生的連結串列是逆序的,即第一個輸入的節點實際是連結串列的最後一個節點。

而為了習慣,通常用尾插法來建立連結串列。這篇文章主要以尾插法為例,但是將頭插法的原始碼放在最後,看完頭插法後自己很好理解。

struct Snake
{
	int x;
	int y;
    struct Snake *next;
};

定義兩個指標 (snake一直相當於int void這種的資料型別)

snake *tail;
snake *head;

 

tail = (snake*)malloc(sizeof(snake));

給tail指標指向的這個結構體賦值 因為其中的next指標域不知道指向哪裡先將它指向NULL(類似於void型別的指標我們不知道它下面會指向哪裡) 

  tail ->x=30;
  tail ->y=10;
  tail ->next=NULL;

再以head指標開闢一個snake形式的記憶體 

head=(snake*)malloc(sizeof(snake));

將head指向的這個結構體中的next指標賦予tail指標

 

head->next=tail;

將尾指標賦予下一個頭指標的值 

tail=head;

 然後我們將以上程式碼寫入for迴圈

void initSnake()
{
  snake *tail;
  snake *head;
  tail = (snake*)malloc(sizeof(snake));新
  tail ->x=30;
  tail ->y=10;
  tail ->next=NULL;
  for(i = 0;i<4;i++)
  {
    head=(snake*)malloc(sizeof(snake));
	head->next=tail;//將
	tail=head;
  }
}

繼續以head開闢一個新的snake型別的結構體

此時是不是2中的next已經指向1,tail指向2,head指向了3

於是也就完成了1.2的連結,1.2形成一個連結串列

只需要繼續迴圈便可開闢記憶體並且連結起來形成連結串列

這樣就可以將很多分散但是結構相同的結構體關聯起來

下面是頭插法的原始碼

// 頭插法
int Insert_Last (Node* h, LinkData data)
{
    // 判斷資料傳入是否正確
    if (NULL == h)
    {
        return FALSE;
    }
     // 建立新結點並判斷建立是否成功
    Node* node = (Node*) malloc(sizeof(Node) / sizeof(char));
    if (NULL == node)
    {
        return FALSE;
    }

    // 給結點成員變數賦值
    node->data = data;
    node->next = h->next;   // 和頭指標的不同:node->next = *h;

    // 讓新結點變為連結串列的第一個節點
    h->next = node;

    return TRUE;
}