單鏈表的兩種實現方式:帶頭結點和不帶頭結點
需要注意的地方:
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...