设单链表A和B均非递减有序,试设计算法,将A和B合并成非递增有序的单链表C,并要求利用原表A和B的结点空间构造表C。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Linklist; //单链表结点
void main()
{
Linklist *A,*B,*C;
Linklist * Merge(Linklist *A,Linklist *B);
Linklist *CreateLinkList();
void sort_increase(Linklist* head);
void OUT(Linklist *head);
printf("Input data of list A:\n");
A=CreateLinkList(); //生成单链表A
printf("Output list A:\n");
OUT(A); //输出单链表A
printf("After Sort:\n");
sort_increase(A);
OUT(A);
printf("Input data of list B:\n");
B=CreateLinkList(); //生成单链表B
printf("Output list B:\n");
OUT(B); //输出单链表B
printf("After Sort:\n");
sort_increase(B);
OUT(B);
printf("合并:\n");
C = Merge(A,B); //将升序链表A、B合并成降序链表C
printf("Output list C:\n");
OUT(C);
}
//生成单链表
Linklist *CreateLinkList()
{
Linklist *head,*p,*q;
int i,n;
head=(Linklist*)malloc(sizeof(Linklist)); //生成头结点
head->next=NULL ;
q=head;
printf("Input length of list: \n");
scanf("%d", &n);
printf("Input data of list: \n");
for(i=1;i<=n;i++)
{
p=(Linklist*)malloc(sizeof(Linklist));
scanf("%d",&p->data);
p->next=NULL;
q->next=p; //在链尾插入
q=p;
}
return head; //返回指向单链表的头指针head
}
//递增排序
void sort_increase(Linklist* head)
{
int t;
Linklist *r;//串联链表
Linklist *temp;//记录每一轮指针走到哪里了
for(r = head->next;r;r=r->next)
{
for(temp = r->next;temp;temp=temp->next)
{
if(r->data > temp->data)
{
t = temp->data;
temp->data = r->data;
r->data = t;
}
}
}
}
Linklist * Merge(Linklist *A,Linklist *B)
{
Linklist *pa,*pb,*s;
Linklist *C;
pa=A->next; // p始终指向链表A的第一个未比较的数据结点
pb=B->next; // q始终指向链表B的第一个未比较的数据结点
C=A; //生成链表的C的头结点
C->next=NULL;
free(B); //回收链表B的头结点空间
while(pa && pb)
{
if(pa->data <= pb->data)
{
s=pa;
pa=pa->next;
}
else
{
s=pb;
pb=pb->next;
}
s->next=C->next; //用头插法将结点*s插到C的头结点之后
C->next=s;
}
if(pb)
pa=pb;
while(pa)
{
s=pa;
pa=pa->next;
s->next=C->next;
C->next=s;
}
free(B);
return C;
}
//输出
void OUT(Linklist *head)
{
head = head->next;
while(head)
{
printf("%6d",head->data);
head = head->next;
}
printf("\n");
}