參考清華大學軟體學院 諶衛軍 《c語言程式設計》課件
1、鍊錶
1.1 鍊錶的基本概念
定義如下的結構體型別
struct train_tag
2、對鍊錶的操作
2.1、建立動態鍊錶
例:建立乙個鍊錶,並輸入每乙個結點的各種描述資訊(貨櫃編號、貨物名稱、貨物重量、發貨地點、到貨時間等),
直到使用者輸入的貨物重量等於0,表示鍊錶結束。
struct train_tag
;struct train_tag *head,*p,*q;
建立鍊錶的過程可歸納為如下三個步驟:
①只要使用者輸入的weight不為0,就要構建鍊錶。基本思路是將乙個乙個的結點新增至鍊錶中。首先用指標p來申請乙個結構體變數的記憶體空間,並且裝入使用者輸入的各種描述資訊,然後將指標q和head都指向它,如下圖:
②後續結點的建立:如果使用者輸入的weight又不為0,就要構建鍊錶的第二個結點。首先用指標p來申請乙個結構體變數的記憶體空間,並且裝入使用者輸入的各種描述資訊,然後要執行q->next=p,把第乙個結點的next指標去指向它,從而建立兩個結點之間的鏈結關係。最後再把q指向新的結點。如下圖:
第三個結點加入鍊錶的過程:
③鍊錶建立過程的結束:如果使用者輸入的weight等於0,意味著鍊錶建立過程的結束,此時指標q所指向的就是鍊錶的最後乙個結點,所以要把該結點的next指標賦值為null,即執行q->next=null,表示這裡已是鏈尾,後面不會再鏈結點。如下圖:
}2.2、訪問鍊錶
在建立好乙個鍊錶之後,可以依次地訪問該鍊錶當中的各個結點的資料。
void display(struct train_tag *head)
}
2.3、刪除鍊錶結點
情形一、待刪除的是首結點
情形二、待刪除的不是首結點
while((p!=null) && strcmp(p->to,"湖南"))
if((p != null) && !strcmp(p->to,"湖南"))
}2.4、插入鍊錶結點
原則:①插入操作不應破壞原有鏈結關係;
②需要插入的這個結點應該把它放在合適的位置上,即有乙個插入位置的查詢過程。
定義:
struct train_tag *head;//頭指標
struct train_tag *p; //鍊錶當前結點
struct train_tag *q; //鍊錶上一結點
struct train_tag *pnode;//待插入的結點
第一種情況:鍊錶為空,即head=null
待插入的pnode結點就是鍊錶中的第乙個結點,head = pnode;
第二種情況:若pnode->weight<=head->weight,則
pnode->next = head;
head = pnode;
第三種情況:pnode結點插入在鍊錶的中間,設指標q和指標p分別指向相鄰的兩個結點,q在前p在後。
首先讓q=head,讓p=head->next,然後讓它們順序往後移動,每次移動乙個結點。當滿足q->weightweight<=p->weight時,pnode就插在q與p之間。
//移動指標
q = p;
p = p->next;
//插入結點
pnode->next = p;
q->next = pnode;
void insert(struct train_tag *pnode)
// 第二種情形,新結點的weight小於等於首結點
if(pnode->weight <= head->weight)
// 第三種情形,迴圈地查詢正確的插入位置
q = head;
p = head->next;
while(p != null)
}// 將pnode結點插入在正確的位置(q和p之間)
pnode->next = p;
q->next = pnode;
}
2.5、鍊錶的釋放
void destroy(struct train_tag *head)
}// head = null;
3、環形鍊錶
定義乙個名為student的結構體型別
struct student
struct student *head,*tail,*p,*prev;
int n,m,i,j;
模組1:輸入學生的個數n和不吉利的數字m,然後驗證它們的有效性;
模組2:建立乙個環形鍊錶,模擬眾同學圍成一圈的情形;
模組3:進入迴圈淘汰環節,模擬從1到m報數,讓n-1個同學逐一退出圈子的過程;
模組4:輸出結果。
C語言 鍊錶基礎 整表建立
指標是鍊錶的基礎,鍊錶是乙個c語言的重難點,是學習作業系統還有資料結構演算法的基礎。大師兄簡單做乙個鍊錶的整表建立程式,倆種方法,頭插法還有尾插法。基礎的同學可以仔細品味一下,include typedef struct node node typedef struct node linklist ...
c語言 鍊錶 C語言鍊錶例項 玩轉鍊錶
下圖為最一簡單鍊錶的示意圖 第 0 個結點稱為頭結點,它存放有第乙個結點的首位址,它沒有資料,只是乙個指標變數。以下的每個結點都分為兩個域,乙個是資料域,存放各種實際的資料,如學號 num,姓名 name,性別 和成績 score 等。另乙個域為指標域,存放下一結點的首位址。鍊錶中的每乙個結點都是同...
c語言鍊錶 鍊錶
在儲存一大波數的時候,我們通常使用陣列,但有時候陣列顯得不夠靈活,比如有一串已經從小到大排序好的數 2 3 5 8 9 10 18 26 32 現在需要往這串數中插入6使其得到的新序列仍符合從小到大排列。如果我們使用陣列來實現這一操作,則需要將8和8後面的數字都依次往後挪一位,如果你覺得這幾個數不算...