69,371
社区成员
发帖
与我相关
我的任务
分享
//创建一个虚拟的新链表,原链表升序有序
#include <stdio.h>
#include <stdlib.h>
#define M 5
#define N 7
//定义一个含有两个域的结点
typedef struct node{
int data;
struct node *next;
}ElemSN;
ElemSN * CombineLink(ElemSN *h1,ElemSN *h2)
{
ElemSN *h=NULL,*s;
if(h1 && h2 && h1->data < h2->data){
h = h1;
s = h1;
h1 = h1->next;
}
else{
h = h2;
s = h2;
h2 = h2->next;
}
while(h1&&h2)
{
if(h1->data <h2->data )
{
s->next = h1;
h1 = h1->next;
s = s->next;
}
else {
s->next = h2;
h2 = h2->next;
s = s->next;
} // 每次将较小的节点加入新链表中
}
if(h1) s->next =h1;
else s->next =h2; // 判断哪个比较长,把剩余部分接到尾结点
return h;
}
//创建正向链表(尾插)
ElemSN * CreatLink1(int a[],int n)
{
ElemSN *h,*p,*t;
for(int i=0;i<n;i++)
{
p=(ElemSN *)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
if(!i) h=t=p;//是第一个结点
else t=t->next=p;
}
return h;
}
//输出单向链表
void PrintLink(ElemSN *h)
{
ElemSN *p;
printf("\n输出的链表为:\n");
for(p=h;p;p=p->next)
printf("%5d",p->data);
printf("\n\n");
}
//主函数调用
int main(void)
{
ElemSN *head1,*head2,*head;
int a[M]={0},b[N]={0};
int i;
printf("\n请依次输入第一个链表每个结点的值:\n");
for(i=0;i<M;i++)
scanf_s ("%d",a+i);
head1=CreatLink1(a,M);
printf("\n请依次输入第二个链表每个结点的值:\n");
for(i=0;i<N;i++)
scanf_s ("%d",b+i);
head2=CreatLink1(b,N);
head=CombineLink(head1,head2);
PrintLink(head1);
system("pause");
return 0;
}