通常情況下,鏈結可分為單鏈表、雙向鍊錶和迴圈鍊錶三種常用型別。
一、單鏈表基本操作的實現
使用鏈式儲存結構來實現的線性表稱為鍊錶。首元結點、頭結點、頭指標、空指標。
1.單鏈表的型別定義
typedef struct lnode//結點型別
lelemtype data;//資料域
struct lnode * next;//指標域
} lnode, * linklist;
2.初始化操作initlinklist(&l)
status initlinklist(linklist &l)
return j;//返回計數器
4.取元素操作getelem(linklist l,int i,lelemtype &e)
status getelem(linklist l,int i,lelemtype &e)
lnode*p=l;int j=0;while(jnext)//不為i結點,且不為最後乙個
p=p->next;//向後查詢
j++;
}if(j==i)//若找到
e=p->data;//由e返回其值
returnok;
}else return error;//若沒找到,返回error
5.按值查詢locateelem(l,e)
linklist locateelem(linklist l,lelemtype e)
lnode*p=l->next;//p指向第乙個結點
while(p&&!equal(p->data,e))//若不等於e
p=p->next;//向後查詢
if(p) return p;//找到
else return null;//沒找到
6.插入操作listinsert(&l,i,e)
status listinsert(linklist &l,inti,lelemtype e)
if(j==i-1)//在j後插入新結點
q=(lnode *)malloc(sizeof(lnode));//生成新結點
if(!q) returnoverflow;
q->data=e;
q->next=p->next;
p->next=q;returnok;
}else returnerror;
7.刪除操作listdelete(&l,i,&e)
status listdelete(linklist &l,int i,lelemtype &e)
lnode*p=l,*q;int j=0;while(jnext)
p=p->next;
j++;
}if(j==i-1&&p->next)//判斷i結點是否存在
q=p->next;
p->next=q->next;
e=q->data;//由e返回刪除元素的值
free(q);
}else returnerror;
8.頭插法建立單鏈表操作createlist(&l,n)
void createlist(linklist &l,intn)
dlnode,* dlinklist;
2.插入操作演算法
status listinsert(dlinklist &l,inti,lelemtype e)
dlnode*p=l,*q;int j=0;while(p->next&&j
p=p->next;
j++;
}if(j==i-1)
q=(dlnode *)malloc(sizeof(dlnode));if(!q) returnoverflow;
q->data=e;
q->next=p->next;
q->prior=p;if(p->next) p->next->prior=q;
p->next=q;returnok;
}else returnfalse;
3.刪除操作演算法
status listdelete(dlinklist &l,int i,lelemtype &e)
dlnode*p=l;int j=0;while(p->next&&j
p=p->next;
j++;
}if(j==i)
e=p->data;
p->prior->next=p->next;if(p->next) p->next->prior=p->prior;free(p);returnok;
}else returnflase;
三、迴圈鍊錶的認識和使用
首尾相接的鍊錶就是迴圈鍊錶,單鏈表和雙鏈表均可以構成迴圈鍊錶。
1.迴圈鍊錶 表尾結點的判定p->next=l;2.迴圈單鏈表合併演算法
void unioncirlist(linklist &r1,linklist &r2)
lnode*q=r2->next;
r2->next=r1->next;
r1->next=q->next;free(q);
四、鍊錶例項——約瑟夫環問題
1.問題描述:
設編號為1、2、3...、n的n個人圍坐一圈,約定從編號為k(1=
2.演算法描述:
1 #include
2 #include
3 typedef structpersonnode4 personnode,*personlist;8 //由n個人組成的約瑟夫環問題,從第k個人開始,數到m就出列
9 void josephus(int n,int m,intk)10 20 for(i=2;i<=n;i++)21 28 p=r->next;//p指向第1個人員結點
29 for(i=1;inext;//p指向第k個結點
33 }34 for(i=1;inext;//p指向出列結點
40 }41 printf("%d",p->num);//輸出人員編號
42 r->next=p->next;43 free(p);//刪除已出列的結點
44 p=r->next;//下一計數為1的結點
45 }46 printf("%d\n",r->num);//輸出最後出列人員編號
47 free(r);//刪除最後乙個結點
48 }49
50 intmain()51
輸出結果:
資料結構(二) 線性表
線性表是最簡單最常用的資料結構,是一種典型的線性儲存結構。定義 線性表是由n n 0 個資料元素 結點 a1 a 2 an 組成的有限序列。n為表的長度。當n 0,為 空表 n 0時,為 a1,a 2,an 邏輯特徵 非空的線性表只有乙個頭結點,也只有乙個終結點,頭結點只有乙個直接後繼結點,而沒有直...
資料結構實驗二 線性表
一 實驗目的 鞏固線性表的資料結構,學會線性表的應用。1.回顧線性表的邏輯結構,線性表的物理儲存結構和常見操作。2.學習運用線性表的知識來解決實際問題。3.進一步鞏固程式除錯方法。4.進一步鞏固模板程式設計。二 實驗內容 1.建立乙個n個學生成績的順序表,對錶進行插入 刪除 查詢等操作。分別輸出結果...
ZJU資料結構 二 線性表
線性表 由同型別資料元素構成有序序列的線性結構 表中元素個數稱為線性表的長度線性表沒有元素時,稱為空表表起始位置稱為表頭,表結束為止稱為表尾型別名稱 線性表 list 資料物件集 線性表是n 0 個元素構成的有序序列 a1,a2,an 操作集 線性表l list,整數i表示位置,元素x elemen...