方法一(感觉有点取巧,不太推荐,但是实现简单):
算法思想:保留La的头节点,并用pcur指针指向La链中的第一个结点,通过pcur指针遍历La中的每一个元素,并判断该元素是否在Lb和Lc链中出现,如果没有同时出现在Lb和Lc中,这尾插到La的头节点后面;重复上述步骤,直到遍历完La中的每一个元素。
cpp
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LinkNode {
ElemType data;
LinkNode* next;
}LinkNode, * LinkList;
//尾插法建立单链表(不改变链表输入顺序)
void creatLinkList(LinkList& L) {
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
LinkNode* pTail = L;
ElemType num;
while (scanf("%d", &num) && num!=-1) {
LinkNode* pnode = (LinkNode*)malloc(sizeof(LinkNode));
pnode->data = num;
pnode->next = pTail->next;
pTail->next = pnode;
pTail = pnode;
}
}
void printLinkList(LinkList L) {
LinkNode* pnode = L->next;
while (pnode != NULL) {
printf("%d ", pnode->data);
pnode = pnode->next;
}
}
bool FundSameNum(LinkList L, LinkNode* pnode) {
LinkNode* pcur = L->next;
while (pcur != NULL) {
if (pcur->data == pnode->data) {
return true;
break;
}
pcur = pcur->next;
}
return false;
}
void insert(LinkNode*& ptail, LinkNode* pnode) {
pnode->next = ptail->next;
ptail->next = pnode;
ptail = pnode;
}
void delectSameNum(LinkList& La, LinkList& Lb, LinkList& Lc) {
LinkNode* pcur = La->next;
La->next = NULL;
LinkNode* ptail = La;
while (pcur != NULL) {
if (FundSameNum(Lb, pcur) && FundSameNum(Lc, pcur)) {
pcur = pcur->next;
}
else {
LinkNode* pnode = pcur;
pcur = pcur->next;
insert(ptail, pnode);
}
}
}
int main() {
LinkList La,Lb,Lc;
creatLinkList(La);
creatLinkList(Lb);
creatLinkList(Lc);
delectSameNum(La, Lb, Lc);
printLinkList(La);
return 0;
}
方法二:
算法思想:每次在Lb和Lc链中找相同结点,然后在Lc中查找该相同结点;如果La中存在该相同结点,进行删除;重复上述步骤,直到三条链中任意一条链被搜索完,此时La中与其余两链的相同结点都被删除。
cpp
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LinkNode {
ElemType data;
LinkNode* next;
}LinkNode, * LinkList;
//尾插法建立单链表(不改变链表输入顺序)
void creatLinkList(LinkList& L) {
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
LinkNode* pTail = L;
ElemType num;
while (scanf("%d", &num) && num != -1) {
LinkNode* pnode = (LinkNode*)malloc(sizeof(LinkNode));
pnode->data = num;
pnode->next = pTail->next;
pTail->next = pnode;
pTail = pnode;
}
}
void printLinkList(LinkList L) {
LinkNode* pnode = L->next;
while (pnode != NULL) {
printf("%d ", pnode->data);
pnode = pnode->next;
}
}
/*算法思想:每次在Lb和Lc链中找相同结点,然后在Lc中查找该相同结点;如果La中存在该相同结点,进行删除;
重复上述步骤,直到三条链中任意一条链被搜索完,此时La中与其余两链的相同结点都被删除*/
void delectSameNum(LinkNode*& preA, LinkNode*& pcurA, ElemType e) {
while (pcurA != NULL && pcurA->data < e) {
preA = pcurA;
pcurA = pcurA->next;
}if (pcurA->data == e) {
preA->next = pcurA->next;
free(pcurA);
pcurA = preA->next;
}
}
void delectSameNum(LinkList& La, LinkList& Lb, LinkList& Lc) {
LinkNode* preA = La;
LinkNode* pcurA = La->next;
LinkNode* pcurB = Lb->next;
LinkNode* pcurC = Lc->next;
while (pcurA && pcurB && pcurC) {
if (pcurB->data < pcurC->data) {
pcurB = pcurB->next;
}
else if (pcurC->data < pcurB->data) {
pcurC = pcurC->next;
}
else {
ElemType e = pcurC->data;
pcurB = pcurB->next;
pcurC = pcurC->next;
delectSameNum(preA, pcurA, e);
}
}
}
int main() {
LinkList La, Lb, Lc;
creatLinkList(La);
creatLinkList(Lb);
creatLinkList(Lc);
delectSameNum(La, Lb, Lc);
printLinkList(La);
return 0;
}