您的位置:首页 > 其它

链表求A与B的差集

2015-09-23 23:10 537 查看

集合A用单链表La表示,集合B用单链表Lb表示,设计算法求A与B两个集合的差,即A-B

分析

A-B即属于A而不属于B的元素,对集合A的每个元素x,在集合B中进行查找,如果存在与x相同的元素,删除x在A中的结点。

#include<stdio.h>
#include<stdlib.h>

typedef struct Lnode
{
	int data;
	struct Lnode *next;
}Lnode;
struct Lnode *create()//尾插法建立链表,不熟悉的请见数据结构之链表基础
{
	Lnode *head, *p, *p2;
	head = (Lnode *)malloc(sizeof(Lnode));
	head->next = NULL;
	p = head;
	int x;
	scanf_s("%d", &x);
	while (x != -1)
	{
	p2= (Lnode *)malloc(sizeof(Lnode));
	p2->data = x;
	p->next = p2;
	p = p2;
	scanf_s("%d", &x);
	}
	p->next = NULL;
	return head;
}

void outline(Lnode *head)
{
	Lnode *p;
	p = head->next;
	while (p != NULL)
	{
		printf(" %2d", p->data);
		p = p->next;
	}
}
Lnode *chaji(Lnode *La, Lnode *Lb)//属于La而不属于Lb的元素
{
	Lnode *p, *prep,*q,*r;
	prep = La;
	p = La->next;//p是La中的某一结点,prep是p的前驱结点;
	while (p != NULL)
	{
		q = Lb->next;//依次扫描Lb看是否有与La表中p指向的结点相同的结点
		while (q && q->data != p->data)q = q->next;
		if (q != NULL)//在Lb中找到与La中p指向的结点相同的结点,删除p指向的结点
		{
			r = p;
			prep->next = p->next;//删除结点
			p = p->next;//指向下一个结点
			free(r);
		}
		else  //未找到相同结点,继续在La中找,p指向下一个,s指向p前驱
		{
			prep = p; p = p->next;
		}
	}
	return La;

}
int main()
{
	Lnode *La,*Lb;
	printf("输入La元素,-1结束\n");
	La= create();
	outline(La);
	printf("\n输入Lb元素,-1结束\n");
	Lb = create();
	outline(Lb);
	printf("\nLa与Lb的差集\n");
	La = chaji(La, Lb);
	outline(La);
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: