需求
已知两个链表A和B分别表示两个集合,其元素按递增排列
1、求交集
2、求差集
1、基操
#include<iostream>
#define ok 1
#define error 0
typedef int Status;
typedef int ElemType;
using namespace std;
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode,*LinkList;
2、头插法
Status Create_List_Head(LinkList &L,int n) {
LNode *p = NULL;
L = new LNode;
L->next = NULL;
for(int i = 0; i < n; i++) {
p = new LNode;
cin >> p->data;
p->next = L->next;
L->next = p;
}
return ok;
}
3、尾插法
Status Create_List_Tail(LinkList &L,int n) {
L = new LNode;
L->next = NULL;
LNode *r = NULL,*p = NULL;
r = L;
for(int i = 0; i < n; i++) {
p = new LNode;
cin >> p->data;
r->next = p;
p->next = NULL;
r = p;
}
return ok;
}
4、打印链表
void PrintList(LinkList L) {
LNode *p = NULL;
p = L->next;
while(p) {
cout << p->data << " ";
p = p->next;
}
}
5、统计结点个数
int GetCount(LinkList L) {
LNode *p = NULL;
p = L->next;
int cnt = 0;
while(p) {
cnt++;
p = p->next;
}
return cnt;
}
6、交集
void PublicList(LinkList &A,LinkList &B) {
LNode *p = A,*q = B->next,*tmp = NULL;
LNode *w = p->next;
while(w) {
while(q && (w->data != q->data)) {
q = q->next;
}
if(!q) {
tmp = w;
w = w->next;
p->next = tmp->next;
delete tmp;
} else {
p = w;
w = w->next;
}
q = B->next;
}
}
7、差集
void DifferenceSet(LinkList &A,LinkList &B,LinkList &c) {
LNode *p = A,*q = B->next,*w = A->next;
LNode *head = new LNode;
head->next = NULL;
LNode *t = head;
while(w) {
while(q && (w->data != q->data)) {
q = q->next;
}
if(!q) {
t->next = w;
t = w;
w = w->next;
t->next = NULL;
} else {
p = w;
w = w->next;
}
q = B->next;
}
c = head;
}
8、main里调用
int main() {
LinkList A,B,C;
Create_List_Tail(A,6);
Create_List_Tail(B,3);
PublicList(A,B);
PrintList(A);
return 0;
}
9、完整代码
#include<iostream>
#define ok 1
#define error 0
typedef int Status;
typedef int ElemType;
using namespace std;
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode,*LinkList;
Status Create_List_Head(LinkList &L,int n) {
LNode *p = NULL;
L = new LNode;
L->next = NULL;
for(int i = 0; i < n; i++) {
p = new LNode;
cin >> p->data;
p->next = L->next;
L->next = p;
}
return ok;
}
Status Create_List_Tail(LinkList &L,int n) {
L = new LNode;
L->next = NULL;
LNode *r = NULL,*p = NULL;
r = L;
for(int i = 0; i < n; i++) {
p = new LNode;
cin >> p->data;
r->next = p;
p->next = NULL;
r = p;
}
return ok;
}
void PrintList(LinkList L) {
LNode *p = NULL;
p = L->next;
while(p) {
cout << p->data << " ";
p = p->next;
}
}
int GetCount(LinkList L) {
LNode *p = NULL;
p = L->next;
int cnt = 0;
while(p) {
cnt++;
p = p->next;
}
return cnt;
}
void PublicList(LinkList &A,LinkList &B) {
LNode *p = A,*q = B->next,*tmp = NULL;
LNode *w = p->next;
while(w) {
while(q && (w->data != q->data)) {
q = q->next;
}
if(!q) {
tmp = w;
w = w->next;
p->next = tmp->next;
delete tmp;
} else {
p = w;
w = w->next;
}
q = B->next;
}
}
void DifferenceSet(LinkList &A,LinkList &B,LinkList &c) {
LNode *p = A,*q = B->next,*w = A->next;
LNode *head = new LNode;
head->next = NULL;
LNode *t = head;
while(w) {
while(q && (w->data != q->data)) {
q = q->next;
}
if(!q) {
t->next = w;
t = w;
w = w->next;
t->next = NULL;
} else {
p = w;
w = w->next;
}
q = B->next;
}
c = head;
}
int main() {
LinkList A,B,C;
Create_List_Tail(A,6);
Create_List_Tail(B,3);
PublicList(A,B);
PrintList(A);
return 0;
}