1. 程式人生 > >單鏈表學習(一)

單鏈表學習(一)

   關於連結串列的概念,原理,具備的優點和缺點,以及示意圖等這裡就不過多介紹了。書本上或者百度上,其他博主上都可以瞭解學習。我主要分享連結串列的一些基礎演算法。

直接進入主題吧。

今天分享的是關於連結串列頭節點和資料節點的建立。

我們建立一個連結串列,一般來說都會建立一個頭節點,頭節點裡面不放然後資料,只需要在指標裡面放入下一個資料節點的記憶體地址就行了,當我們需要訪問資料節點的時候就從頭節點開始依次訪問後面的每一個數據節點。

下面就開始建立頭節點,

建立頭節點

#include<iostream>
#include<stdlib.h>     //呼叫malloc函式實現動態地址的分配
using namespace std;
struct node    //結構體
{
    int a;  //節點用來存放資料
    struct node *next;    //用來存放下一個節點的地址
};                                           
int main()
{
    node *head;  //定義了一個結構體指標始終用來指向頭節點
    node *p;  //定義了一個結構體指標P用來分配記憶體空間實現節點的建立
    p = (node *)malloc(sizeof(struct node));  //用malloc函式實現節點的建立,其中malloc函式前面需要指明資料型別,結構體是一個數據型別,後面是分配多大的記憶體,我們通過sizeof計算結構體的大小
    p->next = NULL;   //我們還沒有建立資料節點,所以頭節點的next不能存放下一個節點的地址,所以賦值NULL
    head = p;//將頭節點的地址給head,讓頭指標始終指向頭節點
    return(0);
}

上面的程式碼成功的建立了一個頭節點,並且頭節點裡面的next指標為NULL(空),head成功指向了頭節點。如果頭節點裡面放了下一個資料節點的記憶體地址,可以通過head->next去得到下一個資料節點的記憶體地址,從而實現訪問下一個資料節點。

 

頭節點建立好了之後,我們開始建立資料節點。

關於建立資料節點一般有兩種方法。

第一種每次建立一個數據節點的時候都直接在頭節點後面建立,這樣創建出來的連結串列它的資料節點是倒過來的。最後的在最前面,最先建的在最後面,大家可以想想這個畫面。

每次在頭節點後面建立資料節點,我們需要完成的操作有:

1.讓新建立的資料節點指向它後面的資料節點(也就是比他先建立的資料節點)

2.讓頭節點指向新建立的資料節點

這樣就實現了有序的連結串列建立

如下圖所示,首先建立了頭節點,然後再頭節點後面插入資料節點1,然後繼續再頭節點後面插入資料節點2

我將建立節點寫在了函式裡面,當然也可以直接放在主函式裡面,具體需要看你的程式碼複雜程度。

void node_creat(node *head,int n)   //第一個引數用來接收指向頭節點的head指標來找到頭節點的位置,第二個引數用來接收需要建立多少個數據節點
{
    node *p;
    int i;
    for (i = 1; i <= n; i++)
    {
        p = (node *)malloc(sizeof(struct node));
        cin >> p->a;    //建立的資料節點需要賦值
        p->next = head->next;  //將頭節點指向的資料節點地址給新節點,讓新節點指向頭節點指向的節點,如果頭節點後面沒有資料節點,則將NULL給建立的節點。
        head->next = p;//在將新建立的節點的地址給頭節點,使頭節點指向它
    }
}

通過上面程式碼實現了第一種資料節點的建立。

 

第二種資料節點的建立不是每次都在頭節點後面建立而是依次建立,如建立了第一個資料節點後,就在第一個資料節點後面繼續建立第二個資料節點,這樣我們的資料節點就不是倒著的了。

實現上面的建立方法也同樣很簡單,但是需要多用一個指標來指向每次建立的資料節點,通過這個指標來賦值記憶體地址。就好像是在頭節點後面建立的時候,我們都是用head指標實現建立是一樣的。

 

void node_creat(node *head,int n)
{
    node *p;
    node *q;  //q指標用來指向每次建立的新資料節點
    q = head;  //首先讓q指標指向頭節點
    int i;
    for (i = 1; i <= n; i++)
    {
        p = (node *)malloc(sizeof(struct node));
        cin >> p->a;
        p->next = q->next;   //將q指向的資料節點的值給新建立的資料節點,實際上就是將NULL給了新資料節點的next.因為這樣的建立新的資料節點每次都是在最後一個。
        q->next = p;//同樣的,讓q指向的資料節點指向新建立的資料節點
        q = q->next;//建立好了之後q移到到新建立的資料節點,又開始在它的後面繼續建立
    }
}

 

今天分享了關於單鏈表頭節點的建立和資料節點建立的兩種形式,後面將繼續分享單鏈表的其他基礎演算法

&n