函數(shù)編程如下:
TYPE * delete(TYPE * head,int num)
{
TYPE *pf,*pb;
if(head==NULL) /*如為空表, 輸出提示信息*/
{ printf("\nempty list!\n");
goto end;}
pb=head;
while (pb->num!=num && pb->next!=NULL)
/*當不是要刪除的結(jié)點,而且也不是最后一個結(jié)點時,繼續(xù)循環(huán)*/
{pf=pb;pb=pb->next;}/*pf指向當前結(jié)點,pb指向下一結(jié)點*/
if(pb->num==num)
{if(pb==head) head=pb->next;
/*如找到被刪結(jié)點,且為第一結(jié)點,則使head指向第二個結(jié)點,
否則使pf所指結(jié)點的指針指向下一結(jié)點*/
else pf->next=pb->next;
free(pb);
printf("The node is deleted\n");}
else
printf("The node not been foud!\n");
end:
return head;
}
函數(shù)有兩個形參,head為指向鏈表第一結(jié)點的指針變量,num刪結(jié)點的學號。 首先判斷鏈表是否為空,為空則不可能有被刪結(jié)點。若不為空,則使pb指針指向鏈表的第一個結(jié)點。進入while語句后逐個查找被刪結(jié)點。找到被刪結(jié)點之后再看是否為第一結(jié)點,若是則使head指向第二結(jié)點(即把第一結(jié)點從鏈中刪去),否則使被刪結(jié)點的前一結(jié)點(pf所指)指向被刪結(jié)點的后一結(jié)點(被刪結(jié)點的指針域所指)。如若循環(huán)結(jié)束未找到要刪的結(jié)點, 則輸出“末找到”的提示信息。最后返回head值。
[例7.13]寫一個函數(shù),在鏈表中指定位置插入一個結(jié)點。在一個鏈表的指定位置插入結(jié)點, 要求鏈表本身必須是已按某種規(guī)律排好序的。例如,在學生數(shù)據(jù)鏈表中, 要求學號順序插入一個結(jié)點。設被插結(jié)點的指針為pi。 可在三種不同情況下插入。
1. 原表是空表,只需使head指向被插結(jié)點即可。見圖7.7(a)
2. 被插結(jié)點值最小,應插入第一結(jié)點之前。這種情況下使head指向被插結(jié)點,被插結(jié)點的指針域指向原來的第一結(jié)點則可。即:pi->next=pb;
head=pi; 見圖7.7(b)
3. 在其它位置插入,見圖7.7(c)。這種情況下,使插入位置的前一結(jié)點的指針域指向被插結(jié)點,使被插結(jié)點的指針域指向插入位置的后一結(jié)點。即為:pi->next=pb;pf->next=pi;
4. 在表末插入,見圖7.7(d)。這種情況下使原表末結(jié)點指針域指向被插結(jié)點,被插結(jié)點指針域置為NULL。即:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |