将两个从小到大排列的链表合并为一个新链表(仍然有序排列),输出合并前的两个链表,输出合并后的链表,检查合并是否成功。

题目:将两个从小到大排列的链表合并为一个新链表(仍然有序排列),输出合并前的两个链表,输出合并后的链表,检查合并是否成功。

重点:将两个链表合并为一个有序链表;

1.定义一个链表结构体

struct Node{
	int  Data;//该节点的数据
	struct Node*next;//指向下一个节点的指针
     };

 2.创建一个链表:一定要注意链表是否带有头结点

struct Node* Creat(){
		struct Node*L;
		L=(struct Node*)malloc(sizeof(struct Node));
		L->Next=NULL;
		return L;
	}//创建带头空链表// 

3.向有序链表L插入一个数n且链表有序:

void Insert(struct Node*L,int n){
		struct Node*p,*q;
		p=L;
		q=(struct Node*)malloc(sizeof(struct Node));

		while(p->Next!=NULL&&p->Next->Data<n){
			p=p->Next;
		}
		q->Data=n;
		q->Next=p->Next;
		p->Next=q;	
		
	}

 4.将两个链表合二为一:

struct Node*a,*b,*c;
		a=L1->Next;
		b=L2->Next;
		c=L3;
		while(a!=NULL&&b!=NULL){
			if(a->Data < b->Data){
				Insert_sort(L3,a->Data);
				a=a->Next;
			}
			{
				Insert_sort(L3,b->Data);
				b=b->Next;
			}
		
		}
		if(a==NULL){
			while(b!=NULL){
				Insert_sort(L3,b->Data);
				b=b->Next;
			}
			
		}
		else if(b==NULL){
			while(a!=NULL){
				Insert_sort(L3,a->Data);
				a=a->Next;
			}
		
		}

实验源代码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
	struct Node{
		int Data;
		struct Node*Next;
	};
	struct Node* Creat(){
		struct Node*L;
		L=(struct Node*)malloc(sizeof(struct Node));
		L->Next=NULL;
		return L;
	}//创建带头空链表// 
	void Print(struct Node *L){
    	struct Node *q;
    	q=L->Next;
    	while(q!=NULL){
        	printf("%d   ",q->Data);
        	q=q->Next;
    	}
	}

	void Insert_sort(struct Node*L,int n){
		struct Node*p,*q;
		p=L;
		q=(struct Node*)malloc(sizeof(struct Node));

		while(p->Next!=NULL&&p->Next->Data<n){
			p=p->Next;
		}
		q->Data=n;
		q->Next=p->Next;
		p->Next=q;	
		
	}
	int main(){
		struct Node *L1,*L2,*L3;
		L1=Creat();
		L2=Creat();
		L3=Creat();
		srand((int)time(NULL));
		
		int i;
		for(i=0;i<10;i++){
			Insert_sort(L1,rand()%100); 
			Insert_sort(L2,rand()%100); 
			
		}
		struct Node*a,*b,*c;
		a=L1->Next;
		b=L2->Next;
		c=L3;
		while(a!=NULL&&b!=NULL){
			if(a->Data < b->Data){
				Insert_sort(L3,a->Data);
				a=a->Next;
			}
			{
				Insert_sort(L3,b->Data);
				b=b->Next;
			}
		
		}
		if(a==NULL){
			while(b!=NULL){
				Insert_sort(L3,b->Data);
				b=b->Next;
			}
			
		}
		else if(b==NULL){
			while(a!=NULL){
				Insert_sort(L3,a->Data);
				a=a->Next;
			}
		
		}
		
		Print(L1);
		printf("\n");
		Print(L2);
		printf("\n");
		Print(L3);
		return 0;
	}

拓展:将两个从小到大排列的链表合并为一个新链表(仍然有序排列),若遇到相同的元素,则在合并时去掉重复元素。输出合并前的两个链表,输出合并后的链表,检查合并是否成功。

去掉重复的元素:

int Delete(struct Node*L){
		struct Node*p1,*p2;
		p1=L;
		
		while(p1!=NULL&&p1->Next!=NULL){
			p2=p1->Next;
			if(p1->Data==p2->Data){
				p1->Next=p2->Next;
				free(p2);
			}
			p1=p1->Next;
		} 
		return L;
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值