單鏈表也可以不設頭結點,如圖212 所示。顯然,基於這種結構的基本操作和帶有頭結點的線性鏈
表基本操作是不同的。bo2-8.cpp 是不帶頭結點的線
性鍊錶的基本操作。
// bo2-8.cpp 不帶頭結點的單鏈表(儲存結構由c2-2.h定義)的部分基本操作(9個)#define destroylist clearlist // destroylist()和clearlist()的操作是一樣的
void initlist(linklist &l)
void clearlist(linklist &l)
}status listempty(linklist l)
int listlength(linklist l)
return i;
}status getelem(linklist l,int i,elemtype &e)
if(j==i) // 存在第i個元素
else
return error;
}int locateelem(linklist l,elemtype e,status(*compare)(elemtype,elemtype))
return 0;
}status listinsert(linklist &l,int i,elemtype e)
else
if(!p) // i大於表長+1
return error;
s->next=p->next;
p->next=s;
}return ok;
}status listdelete(linklist &l,int i,elemtype &e)
else
if(!p->next||j>i-1) // 刪除位置不合理
return error;
q=p->next; // 刪除並釋放結點
// bo2-9.cpp 不帶頭結點的單鏈表(儲存結構由c2-2.h定義)的部分基本操作(2個)status priorelem(linklist l,elemtype cur_e,elemtype &pre_e)
p=q; // p向後移
}return infeasible;
}status nextelem(linklist l,elemtype cur_e,elemtype &next_e)
p=p->next;
}return infeasible;
}
// main2-8.cpp 檢驗bo2-8.cpp和bo2-9.cpp的主程式執行結果如下:#include"c1.h"
typedef int elemtype;
#include"c2-2.h"
#include"bo2-8.cpp"
#include"bo2-9.cpp"
#include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函式
void main()
printf("在l的表頭依次插入1~5後:l=");
listtr**erse(l,print); // 依次對元素呼叫print(),輸出元素的值
i=listempty(l);
printf("l是否空:i=%d(1:是0:否)\n",i);
clearlist(l);
printf("清空l後:l=");
listtr**erse(l,print);
i=listempty(l);
printf("l是否空:i=%d(1:是0:否)\n",i);
for(j=1;j<=10;j++)
listinsert(l,j,j);
printf("在l的表尾依次插入1~10後:l=");
listtr**erse(l,print);
i=getelem(l,5,e);
if(i==ok)
printf("第5個元素的值為%d\n",e);
for(j=0;j<=1;j++)
for(j=1;j<=2;j++) // 測試頭兩個資料
for(j=listlength(l)-1;j<=listlength(l);j++) // 最後兩個資料
k=listlength(l); // k為表長
for(j=k+1;j>=k;j--)
printf("依次輸出l的元素:");
listtr**erse(l,print);
destroylist(l);
printf("銷毀l後:l=%u\n",l);
}
/*在l的表頭依次插入1~5後:l=5 4 3 2 1
l是否空:i=0(1:是0:否)
清空l後:l=
l是否空:i=1(1:是0:否)
在l的表尾依次插入1~10後:l=1 2 3 4 5 6 7 8 9 10
第5個元素的值為5
沒有值為0的元素
第1個元素的值為1
元素1無前驅
元素2的前驅為1
元素9的後繼為10
元素10無後繼
刪除第11個元素失敗
刪除第10個元素成功,其值為10
依次輸出l的元素:1 2 3 4 5 6 7 8 9
銷毀l後:l=0
press any key to continue
*/
不帶頭結點的單鏈表
slist.h pragma once typedef int sldatatype typedef struct slistnode slistnode 不帶頭節點的單鏈表 鍊錶初始化 void slistinit slistnode phead 建立新結點 slistnode slistnewn...
不帶頭結點的單鏈表
不帶頭結點的鍊錶的實現 核心是直接設定頭指標指向第乙個節點 要注意此時的l的位址可能會發生改變.同時還要注意一級指標和二級指標的區別.注意linklist l和linklist l的區別 和帶結點的單鏈表的操作相比較,要考慮到頭指標就是頭結點,在一些會改變頭結點的情況下要仔細考慮.include i...
單鏈表的建立(帶頭結點以及不帶頭結點)
include stdio.h include stdlib.h typedef struct list list list headcreatlist 頭插法建立鍊錶,不帶頭結點 return head list tailcreatlist 尾插法建立鍊錶,不帶頭結點 r next s 將l指向的...