问题描述
解题思路
涉及链表的遍历,查询,插入,删除等基本操作
代码实现
- 链表定义:
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;
}