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語(yǔ)句后逐個(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值。
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語(yǔ)句后逐個(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值。
寫(xiě)一個(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)即可。見(jiàn)圖7.7(a)
2. 被插結(jié)點(diǎn)值最小,應(yīng)插入第一結(jié)點(diǎn)之前。這種情況下使head指向被插結(jié)點(diǎn),被插結(jié)點(diǎn)的指針域指向原來(lái)的第一結(jié)點(diǎn)則可。即:pi->next=pb;
head=pi; 見(jiàn)圖7.7(b)
3. 在其它位置插入。這種情況下,使插入位置的前一結(jié)點(diǎn)的指針域指向被插結(jié)點(diǎn),使被插結(jié)點(diǎn)的指針域指向插入位置的后一結(jié)點(diǎn)。即為:pi->next=pb;pf->next=pi;
4. 在表末插入,這種情況下使原表末結(jié)點(diǎn)指針域指向被插結(jié)點(diǎn),被插結(jié)點(diǎn)指針域置為NULL。即:
pb->next=pi;
pi->next=NULL; TYPE * insert(TYPE * head,TYPE *pi)
{
TYPE *pf,*pb;
pb=head;
if(head==NULL) /*空表插入*/
{
head=pi;
pi->next=NULL;
}
else
{
while((pi->num>pb->num)&&(pb->next!=NULL))
{
pf=pb;
pb=pb->next;
}/*找插入位置*/
if(pi->num<=pb->num)
{
if(head==pb)
head=pi;/*在第一結(jié)點(diǎn)之前插入*/
else
pf->next=pi;/*在其它位置插入*/
pi->next=pb;
}
else
{
pb->next=pi;
pi->next=NULL;
} /*在表末插入*/
}
return head;
}
本函數(shù)有兩個(gè)形參均為指針變量,head指向鏈表,pi 指向被插結(jié)點(diǎn)?惺紫擾卸狹幢硎欠裎?為空則使head指向被插結(jié)點(diǎn)。表若不空,則用while語(yǔ)句循環(huán)查找插入位置。找到之后再判斷是否在第一結(jié)點(diǎn)之前插入,若是則使head 指向被插結(jié)點(diǎn)被插結(jié)點(diǎn)指針域指向原第一結(jié)點(diǎn),否則在其它位置插入, 若插入的結(jié)點(diǎn)大于表中所有結(jié)點(diǎn),則在表末插入。本函數(shù)返回一個(gè)指針, 是鏈表的頭指針。 當(dāng)插入的位置在第一個(gè)結(jié)點(diǎn)之前時(shí), 插入的新結(jié)點(diǎn)成為鏈表的第一個(gè)結(jié)點(diǎn),因此head的值也有了改變, 故需要把這個(gè)指針?lè)祷刂髡{(diào)函數(shù)。
將以上建立鏈表,刪除結(jié)點(diǎn),插入結(jié)點(diǎn)的函數(shù)組織在一起,再建一個(gè)輸出全部結(jié)點(diǎn)的函數(shù),然后用main函數(shù)調(diào)用它們。
#define NULL 0
#define TYPE struct stu
#define LEN sizeof(struct stu)
struct stu
{
int num;
int age;
struct stu *next;
};
TYPE * creat(int n)
{
struct stu *head,*pf,*pb;
int i;
for(i=0;i<n;i++)
{
pb=(TYPE *)malloc(LEN);
printf("input Number and Age\n");
scanf("%d%d",&pb->num,&pb->age);
if(i==0)
pf=head=pb;
else pf->next=pb;
pb->next=NULL;
pf=pb;
}
return(head);
}
1. 原表是空表,只需使head指向被插結(jié)點(diǎn)即可。見(jiàn)圖7.7(a)
2. 被插結(jié)點(diǎn)值最小,應(yīng)插入第一結(jié)點(diǎn)之前。這種情況下使head指向被插結(jié)點(diǎn),被插結(jié)點(diǎn)的指針域指向原來(lái)的第一結(jié)點(diǎn)則可。即:pi->next=pb;
head=pi; 見(jiàn)圖7.7(b)
3. 在其它位置插入。這種情況下,使插入位置的前一結(jié)點(diǎn)的指針域指向被插結(jié)點(diǎn),使被插結(jié)點(diǎn)的指針域指向插入位置的后一結(jié)點(diǎn)。即為:pi->next=pb;pf->next=pi;
4. 在表末插入,這種情況下使原表末結(jié)點(diǎn)指針域指向被插結(jié)點(diǎn),被插結(jié)點(diǎn)指針域置為NULL。即:
pb->next=pi;
pi->next=NULL; TYPE * insert(TYPE * head,TYPE *pi)
{
TYPE *pf,*pb;
pb=head;
if(head==NULL) /*空表插入*/
{
head=pi;
pi->next=NULL;
}
else
{
while((pi->num>pb->num)&&(pb->next!=NULL))
{
pf=pb;
pb=pb->next;
}/*找插入位置*/
if(pi->num<=pb->num)
{
if(head==pb)
head=pi;/*在第一結(jié)點(diǎn)之前插入*/
else
pf->next=pi;/*在其它位置插入*/
pi->next=pb;
}
else
{
pb->next=pi;
pi->next=NULL;
} /*在表末插入*/
}
return head;
}
本函數(shù)有兩個(gè)形參均為指針變量,head指向鏈表,pi 指向被插結(jié)點(diǎn)?惺紫擾卸狹幢硎欠裎?為空則使head指向被插結(jié)點(diǎn)。表若不空,則用while語(yǔ)句循環(huán)查找插入位置。找到之后再判斷是否在第一結(jié)點(diǎn)之前插入,若是則使head 指向被插結(jié)點(diǎn)被插結(jié)點(diǎn)指針域指向原第一結(jié)點(diǎn),否則在其它位置插入, 若插入的結(jié)點(diǎn)大于表中所有結(jié)點(diǎn),則在表末插入。本函數(shù)返回一個(gè)指針, 是鏈表的頭指針。 當(dāng)插入的位置在第一個(gè)結(jié)點(diǎn)之前時(shí), 插入的新結(jié)點(diǎn)成為鏈表的第一個(gè)結(jié)點(diǎn),因此head的值也有了改變, 故需要把這個(gè)指針?lè)祷刂髡{(diào)函數(shù)。
將以上建立鏈表,刪除結(jié)點(diǎn),插入結(jié)點(diǎn)的函數(shù)組織在一起,再建一個(gè)輸出全部結(jié)點(diǎn)的函數(shù),然后用main函數(shù)調(diào)用它們。
#define NULL 0
#define TYPE struct stu
#define LEN sizeof(struct stu)
struct stu
{
int num;
int age;
struct stu *next;
};
TYPE * creat(int n)
{
struct stu *head,*pf,*pb;
int i;
for(i=0;i<n;i++)
{
pb=(TYPE *)malloc(LEN);
printf("input Number and Age\n");
scanf("%d%d",&pb->num,&pb->age);
if(i==0)
pf=head=pb;
else pf->next=pb;
pb->next=NULL;
pf=pb;
}
return(head);
}





