#include
#include
typedef struct Node
{
int data;
struct Node *next;
} Node, *LinkList;
LinkList initlist(LinkList L); // 初始化单链表,返回初始化地址
void CreateFromTail(LinkList L, int length); // 后插法建表
void DelLinkList(LinkList Ahead, LinkList Bhead, LinkList Chead); // 对A表中既在B表又在C表中的元素进行删除
int main()
{
LinkList Ahead, Bhead, Chead;
int Alength, Blength, Clength;
scanf("%d %d %d", &Alength, &Blength, &Clength);
Ahead = initlist(Ahead); // 初始化链表
Bhead = initlist(Bhead);
Chead = initlist(Chead);
CreateFromTail(Ahead, Alength); // 进行建表
CreateFromTail(Bhead, Blength);
CreateFromTail(Chead, Clength);
DelLinkList(Ahead, Bhead, Chead); // 进行删除操作
Node *start = Ahead->next; // start为遍历指针,将A表数据输出
while (start)
{
printf("%d ", start->data);
start = start->next;
}
return 0;
}
LinkList initlist(LinkList L) // 初始化单链表
{
L = (Node *)malloc(sizeof(Node));
L->next = NULL;
return L; // 返回初始化地址
}
void CreateFromTail(LinkList L, int length)
{
Node *end, *insert;
int data;
end = L;
for (int i = 0; i < length; i++) // 不可用while(scanf("%d",&data)),遇到回车不停止输入数据,遇到非数字字符才停止
{
scanf("%d", &data);
insert = (Node *)malloc(sizeof(Node));
insert->data = data;
end->next = insert;
end = insert;
}
end->next = NULL;
}
void DelLinkList(LinkList Ahead, LinkList Bhead, LinkList Chead)
{
Node *Asign, *Bsign, *Csign, *cur, *del[10]; // del[10]用于存储待删除的节点
int t = 0;
Csign = Chead; // Xsign指针用于遍历三个链表
Bsign = Bhead;
Asign = Ahead;
while (Asign->next)
{
cur = Asign; // cur指针代表Asign上一个节点
Asign = Asign->next;
while (Bsign->next)
{
Bsign = Bsign->next;
if (Bsign->data == Asign->data) // 若A表与B表元素相同,进入下一次比较
{
while (Csign->next)
{
Csign = Csign->next;
if (Csign->data == Asign->data) // 若A表与C表元素相同,进入下一个操作
{
del[t++] = Asign;
cur->next = Asign->next; // Asign的上一个节点与下一个节点连接,跳过该释放的节点
break;
}
}
Csign = Chead; // 使Csign返回原值,便于下一次遍历
break;
}
}
Bsign = Bhead; // 使Bsign返回原值,便于下一次遍历
}
for (int i = 0; i < t; i++) // 释放节点空间
{
free(del[i]);
}
}