單向鍊錶在C語言上的實現

2021-08-20 08:55:13 字數 2760 閱讀 7946

作為幾乎是初學c語言的人,在指標的問題還沒有完全搞明白的時候,就看到了資料結構裡面鍊錶這樣乙個龐然大物,完全不懂的怎麼操作。在閱讀了多方資料後,終於根據自己的理解,寫出了第乙個單向鍊錶程式,放在此處與大家分享,也讓自己在複習的時候可以再回顧一下。

程式實現了鍊錶的建立、新增單個元素、刪除單個元素的功能;物件為單個int型,即程式中的data。

因為都是用的函式,所以如果要新增其他的操作,只需要寫另外的函式就可以了。

下面點明幾個個人感覺比較重要的思想。

一、找到前乙個元素

想要處理某個元素的時候,要用指標指向該元素(方法是遍歷搜尋),但同時,如果要執行新增或刪除元素的操作,要用另外乙個指標找到被處理元素之前的乙個元素,這樣才能讓鍊錶中的指標連線起來,因為鍊錶的核心就是上乙個指向下乙個,下乙個再指向下乙個。舉個例子,在刪除元素的時候,要讓被刪除元素的上乙個元素的指標,指向被刪除元素指向的元素,所以在操作上需要找到被刪除元素的上乙個元素;新增同樣是如此,要讓上乙個元素指向新新增的元素。

在迴圈建立元素的過程中,用了乙個*current指標指向被建立元素的之前乙個元素,其作用是解決下面所述的乙個問題:

建立頭部之後進入迴圈,建立第乙個元素s1後,要把頭部的指標指向第乙個元素s1,即 head->next = s1;建立第二個元素s2後,要讓s1指向s2,即 s1->next = s2;但在迴圈中,因為s1和s2並不是陣列,所以並不能實現這樣換元素的操作,自然而然,程式中用了*current來解決這個問題。

進入迴圈之前建立*current,代表當前建立元素的前乙個元素,具體實現方法:

1、頭:current = head;(為了之後建立s1後,對head的指標進行操作;因為current也是指標,所以操作current就等於操作head);

2、建立第乙個元素s1後:current->next = s1;(剛建立的元素,利用current對head操作,使head指向s1);

current = s1;(因為接下來要建立s2了,為了建立s2後,對s1的指標進行操作

(使s1的指標指向s2),所以把s1的值賦給current,等下對current進行操作,就相當於操作s1);

3、建立第二個元素s2後:current->next = s2(此處的current即s1,實現了s1->next = s2);

current = s2;(再為接下來建立新的元素做準備);

n、建立最後乙個元素sn:current->next = null;(最後乙個指標指向null,鍊錶結束)。

雖然上面寫了s1,s2,看起來像是分開的,但在鍊錶中,每乙個元素都是*next,所以其實是一樣的東西,在迴圈中並沒有s1,s2之分,都是*next。

二、首位插入

本人解決首位插入的問題的方法很簡單,可能也比較笨,其實就是把新建立的元素先放在head和第二個元素之間,再交換該元素與頭元素的data資料。

1、新建立元素s1

2、s1插入到head後(與在鍊錶中間插入無異,即listinsert函式)

s1->next = head->next;

head->next = s1;

3、交換s1和head的data

s1->data = head->data;

head->data = new data;

即實現把新加入的data放在頭尾,head中的data放在第二位。

下面上程式:

#include #include struct cell ;

struct cell * listcreate()

head->data = value;

//current的作用在筆記上

current = head;

printf("是否要繼續新增?(y/n)\n");

scanf("%c", &flag);

getchar();

while(flag != 'n' && flag != 'n')

next->data = value;

current->next = next;

current = next;

printf("是否要繼續新增?(y/n)\n");

scanf("%c", &flag);

}current->next = null;

return head;

}//head把原函式中的頭傳進來作尋找用

void listinsert(struct cell *head)

else

//新節點賦值

next->data = value;

//找到鍊錶的頭

p = head;

//用值從頭尋找插入元素之前那個元素的值

while(p->data != front)

p = p->next;

//新插入的元素的指標指向下乙個元素,即等於前乙個元素的指標

next->next = p->next;

//前乙個元素的指標指向該新插入的元素

p->next = next;

}}void listdelete(struct cell *head)

//p前一元素front指標指向原來p指向的下乙個元素

front->next = p->next;

free(p);

}void listviewall(struct cell *p)

printf("%d\n", p->data);

}int main()

}return 0;

}

程式沒有糾錯,希望大家輸入的時候謹慎小心。

C語言單向鍊錶實現

include include typedef struct node listnode typedef listnode linklist 帶頭節點的單鏈表 初始化單鏈表只有頭節點 void initlinklist linklist linklist 建立乙個單鏈表 linklist creat...

C語言單向鍊錶的實現

乙個簡單結點的結構體表示為 struct note int data 資料成員可以是多個不同型別的資料 struct note next 指標變數成員只能是 個 乙個簡單的單向鍊錶的圖示 1 鍊錶是結構 指標相結合的 種應用,它是由頭 中間 尾多個鏈環組成的單方向可伸縮的鍊錶,鍊錶上的鏈環我們稱之為...

C語言單向鍊錶的實現

偶然間想起了n年前的乙個c語言的面試題目,現在做了乙個總結,完美解答。乙個簡單結點的結構體表示為 struct note 乙個簡單的單向鍊錶的圖示 1 鍊錶是結構 指標相結合的 種應用,它是由頭 中間 尾多個鏈環組成的單方向可伸縮的鍊錶,鍊錶上的鏈環我們稱之為結點。2 每個結點的資料可用 個結構體表...