假设两个按元素值非递减有序排列的线性表A和B,均以单链表作为存储结构,试编写程序,将A表和B表归并成一个按元素值非递增有序排列的线性表C,并要求利用原表(即A表和B表的)结点空间存放表C。 |
第一行输入两个正整数m,n(m,n<=100),用空格分开,表示线性表A和B中元素个数,其后两行分别输入单链表A和B。 |
输出单链表C。 |
5 5 1 3 7 12 16 2 6 7 13 20 |
20 16 13 12 7 7 6 3 2 1 |
#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}listnode,*linklist;
linklist creatlist(int a[],int n)//创建单链表
{
int i;
linklist head=(linklist)malloc(sizeof(listnode));
linklist p,q;
q=head;
for(i=0;i<n;i++)
{
p=(linklist)malloc(sizeof(listnode));
p->data=a[i];
q->next=p;
q=p;
}
q->next=NULL;
return head;
}
void printlist(linklist head)//输出单链表
{
int i,c[100];
linklist p;
for(p=head->next,i=0;p;p=p->next,i++)
c[i]=p->data;
for(i=i-1;i>=0;i--)
printf("%d ",c[i]);
}
linklist listadd(linklist la,linklist lb)//两链表合并
{
linklist pb,pa,p,q;
linklist head=(linklist)malloc(sizeof(listnode));
q=head;
for(pa=la->next,pb=lb->next;pa&&pb;)
{
if(pa->data>=pb->data)
{
p=(linklist)malloc(sizeof(listnode));
p->data=pb->data;
q->next=p;
q=p;
pb=pb->next;
}
else if(pa->data<pb->data)
{
p=(linklist)malloc(sizeof(listnode));
p->data=pa->data;
q->next=p;
q=p;
pa=pa->next;
}
if(pa==NULL&&pb!=NULL)
{
while(pb!=NULL)
{
p=(linklist)malloc(sizeof(listnode));
p->data=pb->data;
q->next=p;
q=p;
pb=pb->next;
}
}
if(pa!=NULL&&pb==NULL)
{
while(pa!=NULL)
{
p=(linklist)malloc(sizeof(listnode));
p->data=pa->data;
q->next=p;
q=p;
pa=pa->next;
}
}
}
q->next=NULL;
return head;
}
int main()
{
int n,m,i;
int a[100],b[100];
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
linklist la=creatlist(a,n);
linklist lb=creatlist(b,m);
linklist lc=listadd(la,lb);
printlist(lc);
return 0;
}