算法思想:用冒泡法,對鏈表1和2進行排序,對排序後的兩個鏈表,從小到大進行循環,裝入鏈表3中。
#include<stdio.h>
#include<stdlib.h>
struct stud/*定義鏈表*/
{
int data;
struct stud *next;
};
void pai_xue(struct stud *head1,struct stud *head2,int count1,int count2)/*冒泡排序法*/
{
int i,j,temp=0;
struct stud *p;
for(i=0;i<count1-1;++i)
for(p=head1->next;p->next!=NULL;p=p->next)/*對鏈表1進行排序*/
{
if(p->data>p->next->data)
{
temp=p->data;
p->data=p->next->data;
p->next->data=temp;
}
}
for(i=0;i<count2-1;++i)
for(p=head2->next;p->next!=NULL;p=p->next)/*對鏈表2進行排序*/
{
if(p->data>p->next->data)
{
temp=p->data;
p->data=p->next->data;
p->next->data=temp;
}
}
printf("\n鏈表1排完序後\n");/*輸出鏈表1和2*/
p=head1->next;
while(p)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
printf("\n鏈表2排完序後\n");
p=head2->next;
while(p)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
void main()
{
struct stud *head1,*head2,*p,*q,*head3;
int count1=1,count2=1;
head3=(struct stud *)malloc(sizeof(struct stud *));/*定義鏈表頭結點,並分配空間*/
head3->next=NULL;
head1=(struct stud *)malloc(sizeof(struct stud *));
head2=(struct stud *)malloc(sizeof(struct stud *));
p=(struct stud *)malloc(sizeof(struct stud *));
q=(struct stud *)malloc(sizeof(struct stud *));
head1->next=NULL;
head2->next=NULL;
printf("輸入一個數據以999結束\n");
scanf("%d",&p->data);
while(p->data!=999)/*鏈表1輸入數據*/
{
count1++;
p->next=head1->next;
head1->next=p;
printf("輸入一個數據以999結束\n");
p=(struct stud *)malloc(sizeof(struct stud *));
scanf("%d",&p->data);
}
printf("現在開始給第二個鏈表輸入數據\n");
printf("輸入一個數據以999結束\n");
scanf("%d",&q->data);
while(q->data!=999)/*鏈表2輸入數據*/
{
count2++;
q->next=head2->next;
head2->next=q;
printf("輸入一個數據以999結束\n");
q=(struct stud *)malloc(sizeof(struct stud *));
scanf("%d",&q->data);
}
pai_xue(head1,head2,count1,count2);
head1=head1->next;
head2=head2->next;
while(head1!=NULL&&head2!=NULL)/*將排序好的鏈表1和2 的數據導入鏈表3*/
{
if(head1->data<=head2->data)
{
p=head1->next;
head1->next=head3->next;
head3->next=head1;
head1=p;
}
else
{
q=head2->next;
head2->next=head3->next;
head3->next=head2;
head2=q;
}
}
if(head1!=NULL)/*如果有鏈表1或2的數據不為空,將剩下的數據導入鏈表3中*/
{
p=head1;
while(p!=NULL)
{
q=p->next;
p->next=head3->next;
head3->next=p;
p=q;
}
}
if(head2!=NULL)
{
q=head2;
while(q!=NULL)
{
p=q->next;
q->next=head3->next;
head3->next=q;
q=p;
}
}
q=head3->next;/*將鏈表倒置,原來是由大到小,倒置成由小到大*/
head3->next=NULL;
while(q!=NULL)
{
p=q->next;
q->next=head3->next;
head3->next=q;
q=p;
}
printf("兩個鏈表合並後由小到大為\n");
p=head3->next;
while(p)
{
printf("%d",p->data);
p=p->next;
}
}