类C语言--线性表习题:已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B 的差集(即仅由在A中而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合长度

此代码可以正常运行
分析:从第一个结点开始进行比较,当两个链表La和Lb均为到达表尾结点时,如果La表中的元素小于Lb表中的元素,pre置为La表的工作指针pa删除Lb表中的元素;如果其中一个表中的元素较小时,删除此表中较小的元素,此表的工作指针后移。当链表La和Lb有一个为空时,依次删除另一个非空表中的所有元素。

#include<stdio.h>
#include<stdlib.h>
 
typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode, *LinkList;
 
// 尾插法建立链表
void CreateList(LinkList &L, int n)
{
	L = new LNode;
	L->next = NULL;
	LNode *r;
	r = L;
	for (int i = 0; i < n; i++)
	{
		printf("请输入链表第%d个元素的值:", i + 1);
		LNode *s;
		s = new LNode;
		scanf("%d", &s->data);
		s->next = NULL;
		r->next = s;
		r = s;
	}
}
 
void Diff(LinkList &La,LinkList &Lb)
{
	LNode *p1,*p2,*p3,*q;
	p1=La->next;
	p2=Lb->next;
	p3=La;
	La->data=0;
	while(p1&&p2)
	{
		if(p1->data < p2->data)
		{
			p3->next=p1;
			p3=p1;
			p1=p1->next;
			La->data++;
		}
		else if(p2->data < p1->data)
		{
			q=p2;
			p2=p2->next;
			free(q);
		}
		else
		{
			q=p1;
			p1=p1->next;
			free(q);
			q=p2;
			p2=p2->next;
			free(q);
		}
	}
	while(p1)
	{
		p3->next=p1;
		p3=p1;
		p1=p1->next;
		La->data++;
	}
	p3->next=NULL;
	while(p2)
	{
		q=p2;
		p2=p2->next;
		free(q);
	}
	free(Lb);
}

void TraveList(LinkList L)
{
	LNode *p;
	p = L->next;
 
	while (p)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

int main()
{
	int n,m;
	LinkList La,Lb;
	LNode *p;
	printf("输入La,Lb长度\n");
	scanf("%d %d",&n,&m);
	if(n==0 && m==0) 
		printf("创建失败\n");
	CreateList(La,n);
	CreateList(Lb,m);
	Diff(La,Lb);
	printf("此时的La为\n");
	TraveList(La);
	printf("此时La长度:%d\n",La->data);
	return 0;
}

版权声明:本文为September_C原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。