與帶頭結點的單鏈表相比,不帶頭結點的單鏈表沒有頭結點,可以簡單的理解為,帶頭結點的單鏈表的的頭結點一般資料域不存元素,指標域指向第乙個結點,頭指標(假設為phead
)指向頭結點,而不帶頭結點的單鏈表,頭指標指向單鏈表的第乙個結點,如果把鍊錶中的結點進行編號,帶頭結點的鍊錶的頭結點可以理解為是其第0個結點,頭指標phead
指向頭結點即第0個結點,不帶頭結點的指標指向第1個結點。
源**link_list.h不帶頭結點的鍊錶基本操作的函式宣告
#ifndef __link_list_h__
#define __link_list_h__
typedef int datatype;
typedef struct node
node, *linklist;
void initlist(linklist* phead); //鍊錶初始化
int emptylist(linklist phead); //判斷鍊錶是否為空
void pushfornt(linklist* phead, datatype data); //頭插
int popfornt(linklist* phead, datatype* data); //頭刪
void pushback(linklist* phead, datatype data); //尾插
int popback(linklist* phead, datatype* data); //尾刪
void dellist(linklist* phead, int i, datatype* data); //刪除操作
void inslist(linklist* phead, int i, datatype data); //插入操作
node* get(linklist phead, int i); //按序號查詢
int locate(linklist phead, datatype data); //安值查詢
int length(linklist phead); //求表長
void printlist(linklist phead); //列印表中元素
#endif
link_list.c基本操作函式的實現**
#include
#include
"link_list.h"
//初始化,將頭指標phead置空
void initlist(linklist* phead)
//判斷表是否為空
int emptylist(linklist phead)
return0;}
//頭插,在鍊錶的表頭插入乙個新的元素data
void pushfornt(linklist* phead, datatype data)
pnewnode->
data
=data;
pnewnode->next =
*phead;
*phead = pnewnode;
}//頭刪,刪除鍊錶中的第乙個結點
int popfornt(linklist* phead, datatype*
data)
//只有乙個頭結點,將指向頭結點的指標置空
if ((*phead)->next ==
null)
node* pdel =
*phead;
*data
= pdel->
data;
*phead = pdel->next;
free(pdel);
return
*data;
}//尾插,在表尾插入乙個元素data
void pushback(linklist* phead, datatype data)
//跳出迴圈時pcur指向鍊錶的尾結點
while (pcur->next !=
null)
pnewnode->
data
=data;
pcur->next = pnewnode;
pnewnode->next =
null;
}//尾刪,刪除煉表表尾的元素data
int popback(linklist* phead, datatype*
data)
while (pcur->next->next)
*data
= pcur->next->
data;
pcur->next =
null;
free(pcur->next);
return
*data;
}//刪除操作,i為要刪除的元素序號,data為要刪除的元素值
void dellist(linklist* phead, int i, datatype*
data)
node* pcur =
*phead;
node* pdel;
//刪除第乙個結點元素,呼叫頭刪函式
if (i ==
1)
while ((!(emptylist(*phead))) && k < i -
1)
pdel = pcur->next;
*data
= pdel->
data;
pcur->next = pdel->next;
free(pdel);
}//插入操作,在鍊錶的第i個結點插入乙個值為data的新結點
void inslist(linklist* phead, int i, datatype data)
node* pnewnode = (node*)malloc(sizeof(node));
pnewnode->
data
=data;
pnewnode->next = pcur->next;
pcur->next = pnewnode;
}//按序號查詢,查詢鍊錶中第i個元素對應的值
node* get(linklist phead, int i)
node* pcur = phead;
while ((pcur->next !=
null) && k < i)
if (k == i)
return0;}
//按值查詢,查詢data在表中的位置
int locate(linklist phead, datatype data)
node* pcur = phead;
while (pcur)
break;
}return k;
}//求表長,求煉表中元素的個數
int length(linklist phead)
int count =
0; node* p;
p = phead;
while (p)
return count;
}//列印表中元素
void printlist(linklist phead)
printf("\n");
}
main.c函式的簡單測試**
#include
#include
#include
#include "link_list.h"
int main()
雙迴圈鍊錶的基本操作(不帶頭結點)
node.h ifndef node h define node h include include typedef struct node node,dnode endiflist.h ifndef list h define list h include node.h 初始化鍊錶 void in...
資料結構 帶頭結點鍊錶和不帶頭結點鍊錶操作比較
帶頭結點的鍊錶和不帶頭結點的鍊錶主要不同點在插入和刪除操作上。同時要注意,帶頭結點的鍊錶初始化操作時建立頭結點。下面我們來看一下 中的異同 include include includetypedef int elemtype typedef struct nodenode int insertla...
帶頭結點和不帶頭結點的鏈棧基本操作
c 資料結構 把鏈棧想象成單鏈表頭結點的後插和後刪操作 不帶頭結點的鏈棧 include include include using namespace std typedef struct linknode1 listack1 void initstack1 listack1 l 進棧 lista...