c语言有序列表的合并,C语言求助_链表_合并有序列表(leetcode21题)

#include

#define LEN sizeof(struct Student *)

struct Student

{

int num;

float score;

struct Student *next;

};

int n;

//从键盘输入链表

struct Student *creat()

{

struct Student *head,*p1,*p2;

p1=p2=(struct student *)malloc(LEN);

scanf("%d %f",&p1->num,&p1->score);

head=NULL;

n=0;

while(p1->num!=0)

{

n++;

if(n==1) head=p1;

else p2->next=p1;

p2=p1;

p1=(struct student *)malloc(LEN);

scanf("%d %f",&p1->num,&p1->score);

}

p2->next=NULL;

return head;

}

//打印输出链表

void print(struct Student *p)

{

while(p!=NULL)

{

printf("%-8d%-8.2f\n",p->num,p->score);

p=p->next;

}

}

//第一种方法,常规思路

#if(0)

struct Student *combine(struct Student *a,struct Student *b)

{

struct Student *res,*p;

res=p;

while(a!=NULL&&b!=NULL)

{

if(a->num>b->num)

{

p->next=b;

b=b->next;

}

else

{

p->next=a;

a=a->next;

}

p=p->next;

}

if(a==NULL) p->next=b;

if(b==NULL) p->next=a;

return res->next;

}

#endif

//递归方法

#if(0)

struct Student *combine(struct Student *a,struct Student *b)

{

struct Student *res;

if(a==NULL) return b;

if(b==NULL) return a;

if(a->numnum)

{

res=a;

res->next=combine(a->next,b);

}

else

{

res=a;

res->next=combine(a,b->next);

}

return res;

}

#endif

//谭浩强代码

#if(1)

struct Student *combine(struct Student *ah,struct Student *bh)

{

struct Student *pa1,*pa2,*pb1,*pb2;

pa1=pa2=ah;

pb1=pb2=bh;

do

{

while((pb1->num>pa1->num)&&(pa1->next!=NULL))

{

pa2=pa1;

pa1=pa1->next;

}

if(pb1->num<=pa1->num)

{

if(ah==pa1) ah=pb1;

else pa2->next=pb1;

pb1=pb1->next;

pb2->next=pa1;//到这里看不懂了

pa2=pb2;

pb2=pb1;

}

}while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL));

if((pb1!=NULL)&&(pb1->num>pa1->num)&&pa1->next==NULL) pa1->next=pb1;

return ah;

}

#endif

int main()

{

struct Student *a,*b,*pt;

printf("请输入链表a:\n");

a=creat();

printf("请输入链表b:\n");

b=creat();

pt=combine(a,b);//调用合并函数

print(pt);//打印结果

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值