bb都在代码里哈哈哈哈
对了这里有个要求,不能破坏原来的链表
#include<iostream>
#include<cstring>
using namespace std;
typedef struct LNode {
int data;
struct LNode* next;
}LinkNode;
void Create(LinkNode*& L, int a[], int l)//首先建链表一定要SqList *L表示指针,加&是代表可以修改实值
{
L = (LinkNode*)malloc(sizeof(LinkNode));//建立头结点并分配链表空间也可以写成LinkNode*L=malloc(sizeof(LinkNode))
//头结点是永远不会被用到的
LinkNode* q = L;//q指针指向表头?是的!
for (int i = 0; i < l; i++) {
LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));//这样写才对,左边要声明,右边带两个LinkNode
p->data = a[i];
q->next = p;
q = p;//这个跟图1很像,可以看后面的步骤就是图1
}
q->next = NULL;//完整一点
/*我一开始是这样写的:没有设置q,直接用表头L
p->data = a[i];
L->next = p;
L = p;
L->next=NULL结果不行,哦哦我知道了,因为我最后一步,把L的下一个置空了,怪不得建的表只有最后一个数组元素
*/
}
void Union1(LinkNode* A, LinkNode* B, LinkNode*& C) {//不用排序简单并集也要注意不可以重复元素
LinkNode* pa, * pb, * pc2;
pa = A->next;//因为我们建的表都是有头结点的,所以一开始指针应该指向头结点的下一个,也就叫首结点
pb = B->next;
C = (LinkNode*)malloc(sizeof(LinkNode*));//因为A,B都是已经建好了的表,所以要给C分配空间
pc2 = C;
int t;//用于判断是否有重复元素的,把A表中每一个元素都和B的每个元素for循环遍历比较一下
while (pa != NULL) {
/*pa->next = C->next;
C->next = pa;这样不就把A表改变了吗,我们应该要数据*/
for (pb = B->next; pb != NULL; pb = pb->next)//pb=pb->next是每一次都把指针向后移一位
{
t = 1;
if (pa->data == pb->data) {
pa = pa->next;
t = 0;
break;
}
}
if (t) {
LinkNode* pc1 = (LinkNode*)malloc(sizeof(LinkNode));//pc1是一个临时表,每次用来装要放的A表中的值,就是为了不改变A表值
pc1->data = pa->data;
pc2->next = pc1;
pc2 = pc1;//如图1所示
pa = pa->next;
}
}//这个已经把A中所有没有和B重合的放好了,接下来只用把B无脑装入
pb = B->next;//刚刚遍历了嘛
while (pb != NULL)
{
LinkNode* pc1 = (LinkNode*)malloc(sizeof(LinkNode));
pc1->data = pb->data;
pc2->next = pc1;
pc2 = pc1;
pb = pb->next;
}
pc2->next = NULL;
}
void display(LinkNode* L) {
LinkNode* p = L->next;//因为都是有头结点的嘛
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
}
int main() {
int a1[] = { 5,2,3,1 }, b1[] = { 1,8,9 };
LinkNode* A, * B, * C;
Create(A, a1, 4);
display(A);
cout << endl;
Create(B, b1, 3);
display(B);
cout << endl;
Union1(A, B, C);
display(C);
return 0;
}
图一: