对于线性链表,也可用一维数组来进行描述。这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构。此处就是利用静态链表实现并集的基本操作:
void Unionnode(Node L1[], Node L2[], Node L3[], int num1, int num2)
{
int i = 0;
int j = 0;
int jug = 0;
int k = 0;
Initnode(L3);
for (i = 2; i < num2 + 2;i++)
{
L3[i].cur = L2[i].cur;
L3[i].data = L2[i].data;
}
L3[0].cur = num2 + 2;
k = L3[0].cur;
for (i = 2; i < num1 + 2; i++)
{
jug = 0;
for (j = 2; j < num2 + 2; j++)
{
if (L1[i].data == L2[j].data)
{
break;
}
jug++;
}
if (jug == num2)
{
L3[k].data = L1[i].data;
k = L3[k].cur;
}
}
L3[k - 1].cur = 0;
L3[num2 + 1].cur = num2 + 2;
}
全部代码如下:
#include<stdio.h>
#define MAXSIZE 100
typedef struct Node
{
int data;
int cur;
}Node;
//静态链表初始化
void Initnode(Node L[])
{
int i = 0;
for (i = 1; i < MAXSIZE; i++)
{
L[i].cur = i + 1;
}
L[MAXSIZE - 1].cur = 0;
L[0].cur = -1;
}
//在静态链表中直接插入元素
void Setnode(Node L[], int num)
{
int a = 0;
int i = 0;
printf("请依次输入链表中的元素:\n");
for (i = 1; i < num + 1; i++)
{
a = L[i].cur;
scanf("%d", &L[a].data);
}
L[num + 1].cur = 0;
L[0].cur = num + 2;
}
//遍历静态链表
void Printnode(Node L[])
{
int i = 1;
printf("两者的并集为:");
while (L[i].cur)
{
i = L[i].cur;
printf(" %d", L[i].data);
}
}
//两个静态链表求并集
void Unionnode(Node L1[], Node L2[], Node L3[], int num1, int num2)
{
int i = 0;
int j = 0;
int jug = 0;
int k = 0;
Initnode(L3);
for (i = 2; i < num2 + 2;i++)
{
L3[i].cur = L2[i].cur;
L3[i].data = L2[i].data;
}
L3[0].cur = num2 + 2;
k = L3[0].cur;
for (i = 2; i < num1 + 2; i++)
{
jug = 0;
for (j = 2; j < num2 + 2; j++)
{
if (L1[i].data == L2[j].data)
{
break;
}
jug++;
}
if (jug == num2)
{
L3[k].data = L1[i].data;
k = L3[k].cur;
}
}
L3[k - 1].cur = 0;
L3[num2 + 1].cur = num2 + 2;
}
int main()
{
int i = 0;
Node L1[MAXSIZE], L2[MAXSIZE], L3[MAXSIZE];
int num1 = 0;
int num2 = 0;
printf("*********静态链表求并集*********\n");
Initnode(L1);
Initnode(L2);
printf("请输入创建链表1的元素个数:\n");
scanf("%d", &num1);
Setnode(L1, num1);
printf("请输入创建链表2的元素个数:\n");
scanf("%d", &num2);
Setnode(L2, num2);
Unionnode(L1, L2,L3,num1, num2);
Printnode(L3);
}