鏈表的插入是指在鏈表的某一個位置上插入一個新的結點。根據新結點的位置不同,其插入操作也有所不同,主要分以下四種情況(假設指針變量new指向新結點,head指向頭結點,tail指向尾結點,p0和p1分別為鏈表中間的某兩個相鄰的結點,其中p0為前結點,p1為後結點):
(1)在空表中插入新結點,隻需令head=new;new->next=NULL;即可。
(2)在第一個結點前麵插入新結點,此時需要將新結點的指針域改為原來的第一個結點的地址,並使頭指針變量指向新結點,即new->next=head;head=new;。
(3)在尾結點後麵插入新結點,此時需要將原尾結點的指針域指向新結點,新結點的指針域的值置為NULL,即tail->next=new;new->next=NULL;。也可以寫成new->next=tail->next;tail->next=new;。
(4)將新結點插在鏈表中某兩個相鄰的結點p0和p1中,此時需要將p0指針變量所指向結點的指針域改為新結點的地址,而將新結點的指針域改為p1,即new->next=p1;p0->next=new;,也可以寫成new->next=p0->next;p0->next=new;。
由上可見,第(3)種和第(4)種情況實際上處理方法是相同的,因此在編程時其實隻需分三種情況考慮,一是在空表中插入新結點,二是在第一個結點之前插入新結點,三是在鏈表中間某個結點(包括最後一個結點)之後插入新結點。
以下通過舉例說明如何在鏈表中插入新結點。
[例118]在學生數據鏈表中,要求按學號從小到大的順序插入一個新結點。
structstu*insert(structstu*head,structstu*new)
{
structstu*p0,*p1;
p1=head;
if(head==NULL)/*空表插入*/
{
head=new;
new->next=NULL;
}
else
if(new->num
num)
{
new->next=head;
head=new;
}/*在第一結點之前插入*/
else
{
while(new->num>p1->num)
{
p0=p1;
p1=p1->next;
}
new->next=p0->next;/*在其他位置插入*/
p0->next=new;
}
returnhead;
}
本函數有兩個形參均為指針變量,head指向鏈表,new指向被插入結點。函數首先判斷鏈表是否為空,若為空則使head指向被插入結點,否則,判斷是否在第一個結點之前插入,若是,則使被插入結點的指針域指向原第一個結點,再使head指向被插入結點。若不是在第一個結點之前插入,則用while語句循環查找插入位置,找到之後則在該結點之後插入新結點。本函數執行完後返回鏈表的頭指針。