#include<stdio.h> //預編譯命令
#include<iostream.h>
strUCt list//定義結構體
{
int num;
list*next;
};
list*head,*end; //定義全局變量
list*creat()//創建鏈表的函數
{
list*p=NULL;
list*q=NULL;
head=NULL;
int num;
printf("Input number:
");
scanf("%d",&num);
while(num!=0)
{
p=new list; //開辟空間
p->num=num;
if(head==NULL)
head=p;
else
q->next=p;
q=p;
scanf("%d",&num);
}
end=q; //將鏈表的結尾最後一個結點賦給end
end->next=head; //讓最後一個結點的的下個結點的地址不為空而指向頭指針
return(head);
}
void print(list*head)//打印循環鏈表的函數
{
int k=0;
list*r=head;
do
{
cout.width(2);
k=k+1;
cout<<k<<":"<<r->num<<endl;
r=r->next;
}while(r!=head);
}
void insert(list*pHead,list*pNode) //插入接點的函數
{
list*q,*r;
//第一種情況,鏈表為空
if(pHead==NULL)
{
pHead=pNode; //鏈表頭指向pNode
return; //完成插入操作,返回
}
//第二種情況,pNode結點num的值小於鏈表頭結點num的值
//則將pNode的值插到鏈表頭部
if(pNode->num<=pHead->num)
{
pNode->next=pHead;
pHead=pNode;
return;
}
//第三種情況,循環查找正確位置
r=pHead;
q=pHead->next;
while(q!=pHead)
{
if(pNode->num>q->num)
{
r=q;
q=q->next;
}
else
break;
}
r->next=pNode;
pNode->next=q;
}
list*together(list*p1,list*p2) //定義兩個鏈表合並的函數
{
list*q,*r;
q=p2;
do
{
r=new list; //開辟空間
r->num=q->num; //將q的值賦給r
r->next=NULL; //讓r的下一個指針的地址為空,目的是使它成為一個獨立的結點
insert(p1,r); //調用插入結點的函數
q=q->next; //指針向後撥一個接點
}while(q!=p2); //當在最後一個結點時停止循環
return(p1); //返回頭指針
}
void main() //主函數
{
list*list1,*list2;
printf("Input list1
");
printf("If number is 0,stop inputing
");
printf("數據請從小到大輸入
");
list1=creat(); //調用創建鏈表的函數
print(list1); //打印第一個鏈表
printf("Input list2
");
printf("If number is 0,stop inputing
");
printf("數據請從小到大輸入
");
list2=creat(); //調用創建鏈表的函數
print(list2); //打印第二個循環鏈表
head=together(list1,list2); //調用合並兩個鏈表的函數
printf("The new list is:
");
print(head); //打印最後結果
}