用静态链表来玩(A - B ) || (B - A)

         周末,小雨。用静态链表来玩一下:(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 

      不多说。

猜你喜欢

转载自blog.csdn.net/stpeace/article/details/81453239
B
a^b
A/B
A*B