資料結構 單鏈表的兩種實現方式

2021-10-04 06:12:55 字數 3219 閱讀 5443

單鏈表的兩種實現方式:帶頭結點和不帶頭結點

需要注意的地方:

1、帶頭結點和不帶頭結點在實現插入和刪除操作時的區別

2、封裝的方便之處(見insertpriornode(lnode *p,elemtype e)),能夠使**更簡潔,更加清晰

3、帶頭結點方式中,頭結點不裝入資料,並且看作成第0個結點。不帶頭結點方式,沒有頭結點,從第1個結點開始。

4、注意一些特判情況

例如:按位序插入(帶頭結點),listinsert(linklist &l,int i,elemtype e),在第i個位置插入資料時,判斷i的位置過大還是過小

刪除操作,listdelete(linklist &l,int i,elemtype &e),刪除第i個位置結點時,判斷i的位置過大還是過小

後插操作,insertnextnode(lnode *p,elemtype e),在p結點之後插入元素e時,需要判斷p是否為null

前插操作,insertpriornode(lnode *p,elemtype e),在p結點之前插入元素e時,需要判斷p是否為null

在分配記憶體空間給新結點s時,

node *s=(lnode *)malloc(sizeof(lnode));

if(s==null)//記憶體分配失敗

return false;

總的來說就是需要判斷,結點是否為null,插入或者刪除的位置是否合法,記憶體空間的判斷。

不帶頭結點的實現方式

/*寫**不方便*/

#includeusing namespace std;

struct lnodelnode,*linklist;//lnode結點,linklist單鏈表

/*linklist和lnode是等價的,linklist強調的是鍊錶,lnode強調的是結點,合適的地方使用合適的名字,**可讀性更高*/

bool inilist(linklist &l)

bool empty(linklist l)

/*按位序插入(不帶頭結點)*/

/*插入操作,在表l中的第i個位置上插入指定元素e*/

/*即找到第i-1個結點,將新結點插入其後*/

void listinsert(linklist &l,int i,elemtype e)

lnode *p;//指標p指向當前掃瞄到的結點

int j=1;//當前p指向的是第幾個結點

p=l;//l指向頭結點,頭結點是第0個結點(不存資料)

while(p!=null&&jnext;

j++;

}if(p==null)//i值不合法

return false;

lnode *s=(lnode *)malloc(sizeof(lnode));

s->data=e;

s->next=p->next;

p->next=s;//將結點s連到p之後

return true;//插入成功

}void test()

帶頭結點的實現方式

/*寫**更方便*/

#include#includeusing namespace std;

#define elemtype int

struct lnodelnode,*linklist;//lnode結點,linklist單鏈表

//初始化乙個單鏈表(帶頭結點)

/*頭結點看成第0個結點*/

bool inilist(linklist &l)

//判斷單鏈表是否為空(帶頭結點)

bool empty(linklist l)

/*按位序插入(帶頭結點)*/

/*插入操作,在表l中的第i個位置上插入指定元素e*/

/*即找到第i-1個結點,將新結點插入其後*/

void listinsert(linklist &l,int i,elemtype e)

if(p==null)//i值不合法

return false;

lnode *s=(lnode *)malloc(sizeof(lnode));

s->data=e;

s->next=p->next;

p->next=s;//將結點s連到p之後

return true;//插入成功

}/*指定結點的後插操作*/

/*後插操作:在p結點之後插入元素e*/

bool insertnextnode(lnode *p,elemtype e)

/*指定結點的前插操作*/

/*前插操作:在p結點之前插入元素e*/

bool insertpriornode(lnode *p,elemtype e)

/*刪除操作*/

/*刪除表l中第i個位置的元素,並用e返回刪除元素的值*/

/*即找到第i-1個結點,並將其指標指向第i+1個結點,並且釋放第i個結點*/

bool listdelete(linklist &l,int i,elemtype &e)

if(p==null)//i值不合法

return false;

if(p->data==null)//第i-1個結點之後已無其他結點

return false;

lnode *q=p->next;//令q指向被刪除結點

e=q->data;//用e返回被刪除的元素的值

p->next=q->next;//將*q結點從鏈中斷開

free(q);//釋放結點的儲存空間

//將結點s連到p之後

return true;//插入成功

}/*刪除指定結點p*/

/*如果p是最後乙個結點,則有bug,只能從表頭開始一次尋找p的前驅*/

bool deletenode(lnode *p)

/*封裝,避免重複**,簡潔、容易維護*/

/*按位查詢*/

/*按位查詢,返回第i個元素(帶頭結點)*/

lnode * getelem(linklist l,int i)

return p;

}/*按值查詢*/

/*找到資料域==e的結點*/

lnode *locateelem(linklist l,elemtype e)

/*求表的長度*/

int length(linklist l)

return len;

}void test()

資料結構 無頭單鏈表氣泡排序的兩種方式

交換節點資料的方式 交換節點指標的方式 include using namespace std typedef int elemtype typedef struct linklist linklist,node 建立無頭鍊錶 node createlist elemtype num 新增節點,頭插...

單鏈表建立的兩種方式

建立單鏈表 單鏈表就是一種特殊的結構體組合而成的資料結構,關於單鏈表的建立方式有很多種,大同小異。在這裡我們將詳細的介紹一下頭插法建立鍊錶和尾插法建立鍊錶。如上所示單鏈表就是由可能不連續的資料所組合而成的資料結構。其中每個資料分為兩部分,一部分是資料儲存的位置,稱為資料域 data 另外指標所儲存的...

關於單鏈表的兩種建立方式

第一種方式是將新建立的單鏈表結點加在煉表頭,這種方式要注意的是最先輸入的值是這個鍊錶尾的值 在 new linknode2 new linknode 1 第二種方式是將新建立的單鏈表結點加在鍊錶尾 include include typedef int datatype typedef struct...