1.算法思想:
对于链表LA的每个元素,在LB中进行查找,如果找到了对其进行删除处理,使用指针指向节点,并使用两个循环进行嵌套,第一层循环遍历LB链表,并对指针指向LA的值与LB进行比较,相同则删除,第二层循环遍历LA循环,循环结束删除操作也结束。
2.核心函数代码
void deference(LinkList LA, LinkList LB) {//对LA中与LB元素相同的删除掉
LinkList pre = LA, p = LA->next,r;//pre指向头节点,p指向第一个链表第一个元素
while (p != NULL) {//判断是否遍历了LA链表
LinkList q = LB->next;
while (q != NULL && q->data != p->data) {/*判断是否遍历了LB链表并判断LB每个元素与p指针对应得元素是否相同*/
q = q->next;
}
if (q != NULL) {//此种情况p所指的元素与LB重复了,进行删除
r = p; pre->next = p->next; p = p->next; free(r);
}
else {
pre = p; p = p->next;
}
}
}
3.完整代码及程序实现
#include<iostream>
using namespace std;
typedef char elemtype;
typedef struct node {
elemtype data;
struct node* next;
}LNode, *LinkList;
void deference(LinkList LA, LinkList LB) {
LinkList pre = LA, p = LA->next,r;
while (p != NULL) {
LinkList q = LB->next;
while (q != NULL && q->data != p->data) {
q = q->next;
}
if (q != NULL) {
r = p; pre->next = p->next; p = p->next; free(r);
}
else {
pre = p; p = p->next;
}
}
}
LinkList CreateFromHead() {
LinkList L;
LNode *s;
char c;
int flag = 1;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
while (flag) {
c = getchar();
if (c != '$') {
s = (LinkList)malloc(sizeof(LNode));
s->data = c;
s->next = L->next;
L->next = s;
}
else {
flag = 0;
}
}
return L;
}
int ListLength(LinkList L) {
LinkList p;
p = L;
int j = 0;
for (; p->next != NULL; j++) {
p = p->next;
}
return j;
}
void printf(LinkList L) {
LinkList p;
p = L->next;
for (; p != NULL; p = p->next) {
cout << p->data << endl;
}
}
int main() {
LinkList LA=CreateFromHead();
LinkList LB= CreateFromHead();
deference(LA, LB);
printf(LA);
return 0;
}