两个有序链表求差集,合并为一个有序链表


小白今天刚入门数据结构,正在学习《数据结构高分笔记》,其中第35页仿真题目(2)完成情况如下,如有错误,不吝赐教。


题目要求:已知递增有序的单链表A,B,元素个数分别m,n,分别存储一个集合,请设计算法,求出A与B的差集(我这里定义的差集是指除共同元素以外的元素),将结果保存在A表中,保持元素递增有序。

测试结果如下:





由于程序比较基础,不处理内存分配失败情况,没有对错误输入情况进行筛查,默认输入数据均递增有序且合规。


#include <stdio.h>
#include <stdlib.h>
#define m 3
#define n 4

typedef struct Lnode
{
	int data;
	struct Lnode *next;
}Lnode,*Linklist;//节点类型和指向结构的指针类型

Linklist Creatnode(int temp);
void Creatlist(Linklist L,int x);//x为数据长度
void initlist(Linklist *L);
void printlist(Linklist L,int x);//x为数据长度
void printlist2(Linklist L);
void AchaB(Linklist L1,Linklist L2);
void jointprint(Linklist L1,Linklist L2,int x,int y);//x,y为数据长度

void main ()
{
	/*初始化*/
	Linklist L1;
	Linklist L2;
    initlist(&L1);
	L1->next=NULL;//初始状态头结点指针指向NULL
	initlist(&L2);
	L2->next=NULL;//初始状态头结点指针指向NULL
	Creatlist(L1,n);
	Creatlist(L2,m);
	jointprint(L1,L2,n,m);
	AchaB(L1,L2);
	printf("\n");
}
Linklist Creatnode(int temp)//单节点创建
{
	
	Linklist p;
	p=(Linklist)malloc(sizeof(Lnode));
	p->data=temp;
	p->next=NULL;//新创建的节点指向空
	return p;
}

void jointprint(Linklist L1,Linklist L2,int x,int y)//数据输入结果打印
{
	printf("构造链表如下:\n");
	printlist(L1,x);
	printlist(L2,y);
	printf("\n");
}

void initlist(Linklist *L)//内存分配
{
	*L=(Linklist)malloc(sizeof(Lnode));//等同于**L=返回的指针*p
	
}

void Creatlist(Linklist L,int x)//链表创建
{
	/*创建表*/
	Linklist f;
	f=L;
	printf("现在构造第链表\n");
    int temp;
	for (int i=0;i<x;i++)
	{
		printf("请输入第%d个节点值(整数)\n",i+1);
		scanf("%d",&temp);
		f->next=Creatnode(temp);//这一步完成了节点的内存分配和值的写入	
		f=f->next;
	}
	/*创建表*/
	//	printlist(L);
}

void printlist(Linklist L,int x)//打印单表
{
	Linklist print;
	print=L->next;
	for(int i=0;i<x;i++)
	{
		printf(" %d ",print->data);
		print=print->next;
	}
}

void printlist2(Linklist L)//操作结果打印
{
	Linklist print;
	print=L->next;
	for(int i=0;i<(2*n);i++)
	{
		printf(" %d ",print->data);
		print=print->next;
		if (print==NULL)break;
	}
	printf("\n");
}


void AchaB(Linklist L1,Linklist L2)//求差集

{
	Linklist p1;
	Linklist p2;
	Linklist r2;
	Linklist r1;
	Linklist del;
	p1=L1->next;
	p2=L2->next;
	r2=L2;
	r1=L1;
	while(p1!=NULL&&p2!=NULL)
	{
		if(p1->data>p2->data)
		{
			r2=r2->next;
			p2=p2->next;
			
		}
		else if (p1->data<p2->data)
		{
			p1=p1->next;
			r1=r1->next;
		}
		else 
		{
			del=p2;
			p2=p2->next;
			r2->next=p2;
			free (del);
			del=p1;
			p1=p1->next;
			r1->next=p1;
			free(del);
		if (p1==NULL||p2==NULL)break;
		}
	}
	//至此,差集求完

	//下面两个有序链表头插
	p1=L1->next;
	p2=L2->next;
	r2=L2;
	r1=L1;
	Linklist temp;

	while (p1!=NULL&&p2!=NULL)
	{
		if (p1->data>p2->data)
		{
			temp=p2;
			p2=p2->next;
			r2->next=p2;
			temp->next=p1;
			r1->next=temp;
			r1=r1->next;
		}
		else if (p1->data<p2->data)
		{
			p1=p1->next;
			r1=r1->next;
		}
	}
	if (p1==NULL)
	r1->next=L2->next;
		printf("两个链表的差集链表构造完毕,结果如下:\n");
		printlist2(L1);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值