两个递减单链表按照递增的顺序合并为一个单链表

在这里插入图片描述


#include<stdio.h>

//#include

typedef struct node{

int data;

struct node *next;

} linknode,*link;

//linknode mynode;//mynode是一个struct node结构体
//link ptr_node;//ptr_node是一个指向struct node结构体的指针。

//合并 
link Union(link la,link lb) /*合并链表*/
{
	link rt=NULL,now=NULL,nc=NULL;
	while (la&&lb)	//la,lb都不为空 
	{	
		if (la->data>=lb->data) 
		{	
			nc=la;//大的在前先赋值给nc	
			la=la->next;
		}
		else {	
			nc=lb;	
			lb=lb->next;	
		}
		if (rt) {	
			now->next=nc;	
			now=now->next;	
		}	
		else rt=now=nc;	
	}	
	if (la) 
		now->next=la;
	else 
		now->next=lb;	
	return rt;
}

//反转,因为现在la,lb都是递减的,题目要求递增 
link reverse(link *lp) /*反转列表*/
{	
printf("\nlp\n");
prt(lp); 
	link f=lp,m=NULL,l=NULL;	
	while (f)	//头->10 变成  头<-10 
	{	
		m=f->next;	//m为10的下一个指针 即m指向8 
		f->next=l;	//当前结点指向前一个节点 
		l=f;	//指针前移 和上面一句连起来看就是f->next指向f    
		f=m;	//f=f->next f是指向8的指针 
	}	
	return lp=l;//返回l 
}

//插入 
link insert(link la,int c)
{
	printf("insert\n");
	linknode *lb=NULL;	
	if (la) //如果la有值 
	{	
		la->next=insert(la->next,c);//la->next没有值,执行else,这里就是循环嵌套,知道next为空执行insert函数else条件 
		lb=la;
		prt(la);
		printf("link\n");
	}
	else // la为空 
	{
		lb=malloc(sizeof(linknode));		
		lb->data=c;		
		lb->next=NULL;
	}
	return lb;//返回lb 
}

void prt(link p)
{	
	while (p) {//p有值 	
	printf("%d ",p->data);
	p=p->next;
	}
}

int main(void)

{
	
	link la=NULL, lb=NULL;//定义指向结构体的两个指针 la lb是指针 
	
	int i;
	
	for (i = 10; i>0; i-=2) 
	{
		printf("la\t");
		la=insert(la,i);//10,8,6,4,2
		printf("lb\t");
		lb=insert(lb,i-1);//9,7,5,3,1

	}
	
	printf("A:\t");
	
	prt(la);
	
	printf("\nB:\t");
	
	prt(lb);
	
	la=reverse((la=Union(la,lb),la));
	
	printf("\nA+B:\t");
	
	prt(la);
	
	return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值