C語言實現單鏈表的一些操作詳細說明(帶頭指標)

2021-10-06 10:57:22 字數 3091 閱讀 1740

頭指標:鍊錶中第乙個結點的儲存位置就叫做頭指標

在實現鍊錶操作時,有兩種方法去實現:一種是帶頭結點的,一種是不帶頭結點的,即只有頭指標的情況。

這種情況下,頭指標是指向頭結點的。接著頭結點才指向我們的首結點,即真正我們要插入的第乙個結點。

頭結點的資料域一般是不存任何資料的,但是也可以儲存鍊錶的長度之類的。

有了頭結點後,對在第乙個元素結點插入結點和刪除結點,其操作與對其它結點的操作統一了。

對於這種情況,我們的頭指標就直接指向了我們要插入的元素的,因此我們可以發現乙個問題,即我們插入或刪除的時候,需要區分一下要插入或者刪除的是否是第乙個元素,假如是第乙個元素,我們需要改變頭指標的值,假如不是第乙個元素,我們要改變的值則是前乙個元素所指向的next

從這裡我們可以看出,頭結點的實現相對於頭指標的實現會更加簡單一些,因為插入和刪除的操作統一了,不需要區分是否是第乙個元素。

我們這裡實現的是更為複雜一點的帶頭指標的情況

首先是結構體的定義:

struct node

;

然後還可以做乙個簡化

typedef

struct node* llist;

//將其重新命名為llist

//之後建立乙個新的結構體可以簡化為

llist r;

鍊錶的初始化

void

init

(struct node *

*phead)

鍊錶的遍歷

int

getlength

(struct node *head)

return len;

}

列印鍊錶

void

printlist

(struct node *head)

}

建立乙個指標,為後面插入和刪除提供方便,少寫點**

struct node*

createnode

(int x)

插入乙個結點,k表示插入的位置,x為插入的值

這裡有幾個注意的點:

1.需要判斷是否為第乙個結點,如果是,需要改變頭指標

2.在插入時,有兩種方法判斷k的合法性

(1)判斷k的大小,k<1或者k>getlength ,但是這樣不是很好,因為getlength會遍歷一遍鍊錶,有n的時間消耗

(2)直接找k-1,看看其是否存在,存在即可插入,不存在即插入不了,相比上面,時間消耗會減少一些,更加優秀一點

int

insert

(struct node*

*phead,

int k,

int x)

else

if(p)

else

}}

刪除乙個結點,k表示要刪除的位置,*px為被刪除元素存放的位置

基本思路與插入相同,同樣需要判斷是否要改變頭指標

int

removenode

(struct node*

*phead,

int k,

int*px)

else

return0;

}else

if(p==

null

||p-

>next==

null

)return0;

struct node*t;

t = p-

>next;

p->next = t-

>next;

*px = t-

>data;

//用完記得將t釋放掉

free

(t);

return1;

}}

完整**

#include

#include

using

namespace std;

//帶有頭指標的鍊錶

struct node

;//typedef struct node* llist; //簡化操作為llist r;

void

init

(struct node *

*phead)

intgetlength

(struct node *head)

return len;

}void

printlist

(struct node *head)

}struct node*

createnode

(int x)

intinsert

(struct node*

*phead,

int k,

int x)

else

if(p)

else}}

intremovenode

(struct node*

*phead,

int k,

int*px)

else

return0;

}else

if(p==

null

||p-

>next==

null

)return0;

struct node*t;

t = p-

>next;

p->next = t-

>next;

*px = t-

>data;

free

(t);

return1;

}}intmain()

關於單鏈表C語言實現的一些疑惑

單鏈表的c語言實現如下 typedef struct nodelistnode 即定義了乙個結構體 node,將他重新命名為listnode 我的疑惑是,結構體名為 node,但是在結構體的定義中,居然還有乙個 node 型別的變數,相當於在類myclass中定義乙個myclass型別的私有成員變數...

單鏈表的基本操作(C語言實現)

單鏈表的初始化,建立,插入,查詢,刪除。include include typedef int elemtype 定義結點型別 typedef struct node node,linkedlist 單鏈表的初始化 linkedlist linkedlistinit 單鏈表的建立1,頭插法建立單鏈表...

C語言實現單鏈表的基本操作

listnode.h ifndef listnode h define listnode h include stdio.h include assert.h include stdlib.h typedef int datatype typedef unsigned int size t type...