两个线性表A,B,均以单链表做存储结构,编写算法将表A和表B合并成一个按元素值递增有序排列的线性表C,要求用原表的结点空间存放表C
#define NULL 0
#include"stdio.h"
#include"malloc.h"
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
//*带头结点的尾插法建立单链表,返回表头指针*/
LinkList CREATLIST()
{
int data;
LinkList head,s,r;
head=(LinkList)malloc(sizeof(LNode)); /*生成头结点*/
r=head; /*尾指针初值指向头结点*/
scanf("%d",&data);
while(data!=0) /*0为输入结束符*/
{
s=(LinkList)malloc(sizeof(LNode)); /*生成新结点*/
s->data=data;
r->next=s; /*新结点插入表尾*/
r=s; /*尾指针r指向新的表尾*/
scanf("%d",&data); /*读下一结点*/
}
r->next=NULL;
return (head);
}
///
//两个有序链表的合并!!注意是升序
LinkList CONNECT(LinkList head1,LinkList head2)
{
LinkList p,p1,p2;
p=head1;
p1=head1->next;
p2=head2->next;
while(p1&&p2)
{
if(p1->data<=p2->data)
{
p->next=p1;p=p1;p1=p1->next;
}
else
{
p->next=p2;p=p2;p2=p2->next;
}
}
p->next=p1?p1:p2;//连接剩下的链表
free(head2);
return(head1);
}
/*遍历线性表a中的元素*/
void output(LinkList head)
{
LinkList p;
p=head;
while(p->next!=NULL)
{
printf("%8d",p->next->data);
p=p->next;
}
printf("\n");
}
main()
{
/*定义*/
LinkList head1,head2;
/*尾插建表*/
printf("\n\nInput list In increase a:(input integral end by 0)\n");
head1=CREATLIST();
/*线性表b*/
printf("\n\n\nInput list In increase b:(input integral end by 0)\n");
head2=CREATLIST();
/*两个链表的合并*/
printf("\n\n\nlist a:\n");
output(head1);
printf("\n\n\nlist b:\n");
output(head2);
printf("\n\nLinearlist after connect:\n");
head1=CONNECT(head1,head2);
/*遍历线性表的元素*/
output(head1);
printf("\n\n\npress any key to exit!\n");
}
#define NULL 0
#include"stdio.h"
#include"malloc.h"
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
//*带头结点的尾插法建立单链表,返回表头指针*/
LinkList CREATLIST()
{
int data;
LinkList head,s,r;
head=(LinkList)malloc(sizeof(LNode)); /*生成头结点*/
r=head; /*尾指针初值指向头结点*/
scanf("%d",&data);
while(data!=0) /*0为输入结束符*/
{
s=(LinkList)malloc(sizeof(LNode)); /*生成新结点*/
s->data=data;
r->next=s; /*新结点插入表尾*/
r=s; /*尾指针r指向新的表尾*/
scanf("%d",&data); /*读下一结点*/
}
r->next=NULL;
return (head);
}
///
//两个有序链表的合并!!注意是升序
LinkList CONNECT(LinkList head1,LinkList head2)
{
LinkList p,p1,p2;
p=head1;
p1=head1->next;
p2=head2->next;
while(p1&&p2)
{
if(p1->data<=p2->data)
{
p->next=p1;p=p1;p1=p1->next;
}
else
{
p->next=p2;p=p2;p2=p2->next;
}
}
p->next=p1?p1:p2;//连接剩下的链表
free(head2);
return(head1);
}
/*遍历线性表a中的元素*/
void output(LinkList head)
{
LinkList p;
p=head;
while(p->next!=NULL)
{
printf("%8d",p->next->data);
p=p->next;
}
printf("\n");
}
main()
{
/*定义*/
LinkList head1,head2;
/*尾插建表*/
printf("\n\nInput list In increase a:(input integral end by 0)\n");
head1=CREATLIST();
/*线性表b*/
printf("\n\n\nInput list In increase b:(input integral end by 0)\n");
head2=CREATLIST();
/*两个链表的合并*/
printf("\n\n\nlist a:\n");
output(head1);
printf("\n\n\nlist b:\n");
output(head2);
printf("\n\nLinearlist after connect:\n");
head1=CONNECT(head1,head2);
/*遍历线性表的元素*/
output(head1);
printf("\n\n\npress any key to exit!\n");
}