頭指標:鍊錶中第乙個結點的儲存位置就叫做頭指標
在實現鍊錶操作時,有兩種方法去實現:一種是帶頭結點的,一種是不帶頭結點的,即只有頭指標的情況。
這種情況下,頭指標是指向頭結點的。接著頭結點才指向我們的首結點,即真正我們要插入的第乙個結點。
頭結點的資料域一般是不存任何資料的,但是也可以儲存鍊錶的長度之類的。
有了頭結點後,對在第乙個元素結點插入結點和刪除結點,其操作與對其它結點的操作統一了。
對於這種情況,我們的頭指標就直接指向了我們要插入的元素的,因此我們可以發現乙個問題,即我們插入或刪除的時候,需要區分一下要插入或者刪除的是否是第乙個元素,假如是第乙個元素,我們需要改變頭指標的值,假如不是第乙個元素,我們要改變的值則是前乙個元素所指向的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...