{
TYPE *pf,*pb;
if(head==NULL)
{
printf("\nempty list!\n");
goto end;
}
pb=head;
while (pb->num!=num && pb->next!=NULL)
{pf=pb;pb=pb->next;}
if(pb->num==num)
{
if(pb==head) head=pb->next;
else pf->next=pb->next;
printf("The node is deleted\n");
}
else
free(pb);
printf("The node not been found!\n");
end:
return head;
}
TYPE * insert(TYPE * head,TYPE * pi)
{
TYPE *pb ,*pf;
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;
else pf->next=pi;
pi->next=pb;
}
else
{
pb->next=pi;
pi->next=NULL;
}
}
return head;
}
void print(TYPE * head)
{
printf("Number\t\tAge\n");
while(head!=NULL)
{
printf("%d\t\t%d\n",head->num,head->age);
head=head->next;
}
}
main()
{
TYPE * head,*pnum;
int n,num;
printf("input number of node: ");
scanf("%d",&n);
head=creat(n);
print(head);
printf("Input the deleted number: ");
scanf("%d",&num);
head=delete(head,num);
print(head);
printf("Input the inserted number and age: ");
pnum=(TYPE *)malloc(LEN);
scanf("%d%d",&pnum->num,&pnum->age);
head=insert(head,pnum);
print(head);
}
本例中,print函數(shù)用于輸出鏈表中各個結(jié)點數(shù)據(jù)域值?男尾蝖ead的初值指向鏈表第一個結(jié)點。在while語句中,輸出結(jié)點值后,head值被改變,指向下一結(jié)點。若保留頭指針head, 則應(yīng)另設(shè)一個指針變量,把head值賦予它,再用它來替代head。在main函數(shù)中,n為建立結(jié)點的數(shù)目, num為待刪結(jié)點的數(shù)據(jù)域值;head為指向鏈表的頭指針,pnum為指向待插結(jié)點的指針。 main函數(shù)中各行的意義是:
第六行輸入所建鏈表的結(jié)點數(shù);
第七行調(diào)creat函數(shù)建立鏈表并把頭指針返回給head;
第八行調(diào)print函數(shù)輸出鏈表;
第十行輸入待刪結(jié)點的學號;
第十一行調(diào)delete函數(shù)刪除一個結(jié)點;
第十二行調(diào)print函數(shù)輸出鏈表;
第十四行調(diào)malloc函數(shù)分配一個結(jié)點的內(nèi)存空間, 并把其地址賦予pnum;
第十五行輸入待插入結(jié)點的數(shù)據(jù)域值;
第十六行調(diào)insert函數(shù)插入pnum所指的結(jié)點;
第十七行再次調(diào)print函數(shù)輸出鏈表。
從運行結(jié)果看,首先建立起3個結(jié)點的鏈表,并輸出其值;再刪103號結(jié)點,只剩下105,108號結(jié)點;又輸入106號結(jié)點數(shù)據(jù), 插入后鏈表中的結(jié)點為105,106,108。聯(lián)合“聯(lián)合”也是一種構(gòu)造類型的數(shù)據(jù)結(jié)構(gòu)。 在一個“聯(lián)合”內(nèi)可以定義多種不同的數(shù)據(jù)類型, 一個被說明為該“聯(lián)合”類型的變量中,允許裝入該“聯(lián)合”所定義的任何一種數(shù)據(jù)。 這在前面的各種數(shù)據(jù)類型中都是辦不到的。例如, 定義為整型的變量只能裝入整型數(shù)據(jù),定義為實型的變量只能賦予實型數(shù)據(jù)。
在實際問題中有很多這樣的例子。例如在學校的教師和學生中填寫以下表格: 姓 名 年 齡 職 業(yè) 單位 “職業(yè)”一項可分為“教師”和“學生”兩類。對“單位”一項學生應(yīng)填入班級編號,教師應(yīng)填入某系某教研室。 班級可用整型量表示,教研室只能用字符類型。要求把這兩種類型不同的數(shù)據(jù)都填入“單位”這個變量中, 就必須把“單位”定義為包含整型和字符型數(shù)組這兩種類型的“聯(lián)合”。
“聯(lián)合” 與“結(jié)構(gòu)”有一些相似之處。但兩者有本質(zhì)上的不同。在結(jié)構(gòu)中各成員有各自的內(nèi)存空間, 一個結(jié)構(gòu)變量的總長度是各成員長度之和。而在“聯(lián)合”中,各成員共享一段內(nèi)存空間, 一個聯(lián)合變量的長度等于各成員中最長的長度。應(yīng)該說明的是, 這里所謂的共享不是指把多個成員同時裝入一個聯(lián)合變量內(nèi), 而是指該聯(lián)合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則沖去舊值。如前面介紹的“單位”變量, 如定義為一個可裝入“班級”或“教研室”的聯(lián)合后,就允許賦予整型值(班級)或字符串(教研室)。要么賦予整型值,要么賦予字符串,不能把兩者同時賦予它。聯(lián)合類型的定義和聯(lián)合變量的說明一個聯(lián)合類型必須經(jīng)過定義之后, 才能把變量說明為該聯(lián)合類型。





