---------------start reading---------------
頭結點是用來標記單鏈表的乙個標誌,有些時候我們可以不使用頭結點,這時候操作就完全不一樣了。
如何建立乙個無頭結點的單鏈表?不能在頭結點的資料域中放資料再變成假的第乙個資料節點在進行操作,那是自己騙自己。
在單鏈表中我們直接頭結點進行解引用,但無頭結點的鍊錶最初其實就是乙個指標,沒有指向任何結點,在進行插入時將這個指標指向第乙個資料結點。
單鏈表對結構體進行操作,我們引進乙個一級指標進行解引用,而無頭結點的單鏈表我們要對plist這個指標進行操作,所以要引進乙個二級指標,二級指標解引用才能對指標進行操作
下面就來看看無頭結點的單鏈表的一些基本操作
特別注意
初始化二級指標的使用,**pplist
2.尾插是否有第乙個資料結點,若無第乙個資料結點,null解引用會崩潰
標頭檔案
#pragma once
//不帶頭節點的單鏈表
typedef struct nnode
nnode,*nlist;
//鍊錶初始化
void initlist(nlist *pplist);//nnode*
//頭插
bool insert_head(nlist *pplist,int val);
//尾插
bool insert_tail(nlist *pplist,int val);
//查詢
nnode *srearch(nlist plist,int key);
//刪除
bool delete(nlist *pplist,int key);
int getlength(nlist plist);
bool isempty(nlist plist);
void clear(nlist *pplist);
void destroy(nlist *pplist);
void show(nlist plist);
具體實現
#include #include #include "nlist.h"
#include //鍊錶初始化
void initlist(nlist *pplist)//nnode*
//頭插
bool insert_head(nlist *pplist,int val)
//尾插
bool insert_tail(nlist *pplist,int val)
nnode *q;
for(q=*pplist;q->next!=null;q=q->next) ;
//p->next = q->next;//p->next = null;
q->next = p;
return true;
}//查詢
nnode *srearch(nlist plist,int key)
for(nnode *p = plist;p!=null;p=p->next) }
return null;
}//刪除
bool delete(nlist *pplist,int key)
nnode *p = *pplist;
if(p->data == key)//刪除第乙個點
for(p=*pplist;p->next!=null;p=p->next) }
return false;
}int getlength(nlist plist)
return count;
}bool isempty(nlist plist)
void clear(nlist *pplist)
void destroy(nlist *pplist)
nnode *p;
while(plist->next != null)//從第二個節點開始刪除
free(plist); //刪除第乙個資料節點
*pplist = null;
}void show(nlist plist)
printf("\n");
}
無頭結點的單鏈表測試與單鏈表的測試稍有不同,要引進二級指標
&list表示乙個指標的位址list表示乙個指標,所以&list就相當於傳了乙個二級指標,在函式中使用list就相當於乙個指標
int main() //不帶頭節點的單鏈表測試函式
delete(&list,-1);
delete(&list,18);
delete(&list,0);
delete(&list,5);
delete(&list,14);
show(list);
destroy(&list);
destroy(&list);
show(list);
return 0;
}
最後,我想說,頭結點其實挺好,就多了乙個空,讓我們避開了二級指標這個想著比較麻煩的東西,所以整個鍊錶當中一定要掌握好單鏈表,其他萬變不離其宗。 資料結構無頭單鏈表
template class slist node t data node head node tail int size public slist 複製建構函式 slist const slist sl slist 尾插 void slistpushback t data 尾刪 void slis...
無頭結點單鏈表實現 考研資料結構C C
屬於線性表的一種,採用鏈式儲存的儲存結構。優點 空間動態分配,不要求連續的大片空間。插入刪除方便 時間複雜度低 缺點 不能隨機訪問。相對於帶頭結點的單鏈表 插入 刪除不統一 實現比較複雜 演算法效能 include include 無頭結點的單鏈表的實現 typedef struct nodenod...
單鏈表的增加 無頭結點
單鏈表的增加 無頭結點 本文展示單鏈表的增加 1.從頭部新增 2.從尾部新增 初始化單鏈表 typedef struct listnode listnode typedef listnode list 頭結點為空的初始化 param head void initlist list head 單鏈表插...