将两个单向有序链表合并成一个单向有序链表

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student                                                          //声明结构体
{
	int num;
	struct student *pnext;
}stu,*pstu;
void link_sort_insert(pstu *,pstu *,int);                                       //建立有序链表
void link_show(pstu );                                                         
void link1_merge_link2(pstu *phead1,pstu *ptail1,pstu *phead2,pstu *ptail2);    //把链表2合并到1
void main(){
	pstu phead1,ptail1,phead2,ptail2;
	int i;
	phead1 = NULL;
	ptail1 = NULL;
	phead2 = NULL;
	ptail2 = NULL;	
	while(scanf("%d",&i) != EOF){                                               //建立链表1
		link_sort_insert(&phead1,&ptail1,i);
		
	}
	link_show(phead1);
	while(scanf("%d",&i) != EOF){                                               //建立链表2
		link_sort_insert(&phead2,&ptail2,i);
		
	}
	link_show(phead2);
	link1_merge_link2(&phead1,&ptail1,&phead2,&ptail2);                        //合并
	link_show(phead1);                                                         
	system("pause");

}
void link_sort_insert(pstu *phead,pstu *ptail,int i){                            //建立有序链表
	pstu pnew,pcur,ppre;
	pnew = (pstu)malloc(sizeof(stu));
	memset(pnew,0,sizeof(stu));
	pnew->num = i;
	if(*phead == NULL){
		*phead = pnew;
		*ptail = pnew;
	}
	else if((*phead)->num > i){
		pnew->pnext = *phead;
		*phead = pnew;
		
	}
	else{
		pcur = *phead;
		ppre = *phead;
		while(pcur != NULL){
			if(pcur->num > i){
				pnew->pnext = ppre->pnext;
				ppre->pnext = pnew;
				break;
			}
			ppre = pcur;
			pcur = pcur->pnext;
		}
		if(pcur == NULL){
		(*ptail)->pnext = pnew;
		*ptail = pnew;
		}
	}
	
}
void link1_merge_link2(pstu *phead1,pstu *ptail1,pstu *phead2,pstu *ptail2){                   //把链表2合并到1
	pstu i,ppre,pcur;
	pcur = *phead1;                                                                         //pcur ppre 指向链表1头结点
	ppre = *phead1; 
	while(*phead2 != NULL){    
		i = *phead2;                                                                      //记录链表2头结点的当前位置
		*phead2 = (*phead2)->pnext;                                                       //链表头结点指向下1个结点
		if((*phead1)->num > i->num){                                                      //判断链表1头结点是否大于i
			i->pnext = *phead1;                                                       //如果大于,插入头结点
			*phead1 = i;
			pcur = *phead1;                                                           //pcur ppre 重新指向链表1头结点
			ppre = *phead1;
		}
		else{                                                                             //链表1头结点不大于i
			while(pcur != NULL){                                                         
				if(pcur->num > i->num){                                           //判断链表1当前节点pcur是否大于i
					i->pnext = ppre->pnext;                                    //若大于i 则插入,循环结束,pcur不动
					ppre->pnext = i;
					break;
				}
				ppre = pcur;                                                        //若cur <=i 记录当前pcur,pcur指向下一个位置
				pcur = pcur->pnext;
			}
			if(pcur == NULL){                                                          //如果链表1达到尾结点,i插入到链表1尾节点
				(*ptail1)->pnext = i; 
				*ptail1 = i;
			}
		}
	}
	*phead2 = NULL;                                                                           //释放
	*ptail2 = NULL;
}
void link_show(pstu phead){
	pstu pshow;
	pshow = phead;
	if(phead == NULL)
	{
		printf("no exsit\n");
		return;
	}
	while(pshow != NULL){
		printf("%d ",pshow->num);
		pshow = pshow->pnext;
	}
	putchar('\n');
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值