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