线性表练习2——集合的并交差

问题描述

在这里插入图片描述

解题思路

涉及链表的遍历,查询,插入,删除等基本操作

代码实现

  • 链表定义:
typedef char ElemType;
typedef struct Node
{
	ElemType data;
	struct Node* next;
}Node,*LinkList;
  • 链表创建
bool CreateList(char* name,LinkList &L)
{
	L = (LinkList)malloc(sizeof(Node));
	L->next = nullptr;
	Node* p = L;
	int i = 0;
	while (true) 
	{
		if (name[i] == '\0')
		{
			break;
		}
		Node* newNode = (LinkList)malloc(sizeof(Node));
		newNode-> data = name[i];
		i++;
		p->next = newNode;
		p = newNode;
		p->next = nullptr;
	}
	return true;
}
  • 链表查找
bool Compare(ElemType a, ElemType b)
{
	return a == b;
}
bool SearchList(LinkList& a, ElemType n, bool(*Compare)(ElemType, ElemType))
{
	Node* p = a->next;
	for (; p != nullptr; p = p->next)
	{
		if (Compare(p->data, n))
			return true;
	}
	return false;
}
  • 链表插入(尾插)
//尾插法
void InsertList(LinkList& a,ElemType n)
{
	Node* p = a->next;
	while (p->next!= nullptr)
	{
		p = p->next;
	}
	Node* newNode = (LinkList)malloc(sizeof(Node));
	newNode->data = n;
	p->next = newNode;
	newNode->next = nullptr;
}
  • 链表删除
void DeleteList(LinkList& a,ElemType n)
{
	Node* p = a;
	while (p!= nullptr)
	{
		if (p->next->data == n)
			break;
		p = p->next;
	}
	if (p == nullptr) return;
	Node* q = p->next;
	p->next = q->next;
	free(q);
}
  • 链表输出
void showList(const LinkList& L)
{
	Node* p = L->next;
	for (; p != nullptr; p = p->next)
	{
		cout << p->data;
	}
	cout << endl;
}
  • 集合并操作
void ListOr(LinkList& a, LinkList& b)
{
	Node* p = b->next;
	for (; p != nullptr; p = p->next)
	{
		if (!SearchList(a, p->data, Compare))
		{
			InsertList(a, p->data);
		}
	}
	showList(a);
}
  • 集合交操作
void ListAnd(LinkList& a, LinkList& b)
{
	Node* p = a->next;
	while (p != nullptr)
	{
		if (!SearchList(b, p->data, Compare))
		{
			Node* tmp = p->next;
			DeleteList(a, p->data);
			p = tmp;
		}
		else
		{
			p = p->next;
		}
	}
	showList(a);
}
  • 集合差操作
void ListSub(LinkList& a, LinkList& b)
{
	Node* p = b->next;
	while (p != nullptr)
	{
		if (SearchList(a, p->data, Compare))
		{
			Node* tmp = p->next;
			DeleteList(a, p->data);
			p = tmp;
		}
		else
		{
			InsertList(a, p->data);
			p = p->next;
		}
	}
	showList(a);
}
  • 测试主函数
int main()
{
	char A[100] = "";
	char B[100]="";
	cin.getline(A,100);
	cin.getline(B,100);
	LinkList la;
	LinkList lb;
	LinkList la1;
	LinkList lb1;
	LinkList la2;
	LinkList lb2;
	CreateList(A, la);
	CreateList(B, lb);
	CreateList(A, la1);
	CreateList(A, la2);
	CreateList(B, lb1);
	CreateList(B, lb2);
	ListAnd(la, lb);
	ListOr(la1, lb1);
	ListSub(la2, lb2);
	return 0;
}
发布了33 篇原创文章 · 获赞 3 · 访问量 601

猜你喜欢

转载自blog.csdn.net/qq_43647628/article/details/104683689