周末,小雨。用静态链表来玩一下:(A - B ) || (B - A), 代码:
#include <stdio.h>
#define MAXSIZE 100
typedef struct node
{
int iData;
int iNextIndex;
}SLinkList[MAXSIZE];
void InitSpace_SL(SLinkList space)
{
int i = 0;
for(i = 0;i < MAXSIZE; ++i)
space[i].iNextIndex = i + 1;
space[MAXSIZE - 1].iNextIndex = 0;
}
int Malloc_SL(SLinkList space)
{
int i = space[0].iNextIndex;
if(i)
space[0].iNextIndex = space[i].iNextIndex;
return i;
}
void Free_SL(SLinkList space, int k)
{
space[k].iNextIndex = space[0].iNextIndex;
space[0].iNextIndex = k;
}
//(A - B ) || (B - A)
void difference(SLinkList space, int &h, int a[], int lenA, int b[], int lenB)
{
int i = 0;
int j = 0;
int k = 0;
int r = 0; // 尾部
int p = 0;
int tmbB = 0;
InitSpace_SL(space);
h = Malloc_SL(space); // 头结点
r = h;
for(j = 0; j < lenA; ++j)
{
i = Malloc_SL(space);
space[i].iData = a[j];
space[r].iNextIndex = i;
r = i;
}
space[r].iNextIndex = 0;
for(j = 0; j < lenB; ++j)
{
tmbB = b[j];
p = h;
k = space[h].iNextIndex; // 链表第一结点
while(k != 0 && space[k].iData != tmbB)
{
p = k;
k = space[k].iNextIndex;
}
if(k == 0) // 没找到,插到尾部
{
i = Malloc_SL(space);
space[i].iData = tmbB;
space[i].iNextIndex = space[r].iNextIndex;
space[r].iNextIndex = i;
}
else
{
space[p].iNextIndex = space[k].iNextIndex;
Free_SL(space, k);
if(r == k)
r = p;
}
}
}
void print(SLinkList space, int h)
{
h = space[h].iNextIndex;
while(h)
{
printf("%d ",space[h].iData );
h = space[h].iNextIndex;
}
printf("\n");
}
int main()
{
int a[] = {1, 2, 3, 7, 5, };
int b[] = {0, 2, 4, 1, 9, 5, 8};
int lenA = sizeof(a) / sizeof(lenA);
int lenB = sizeof(b) / sizeof(lenB);
SLinkList space; // 可用结点池子链表的头结点的index始终为0
int h = 1; // 最终结果的头结点index始终为1
difference(space, h, a, lenA, b, lenB);
print(space, h);
return 0;
}
结果: 3 7 8 9 4 0
不多说。