#include<stdio.h> #include<malloc.h> #include<iostream> using namespace std; typedef int ElemType; #define MAXSIZE 100 typedef struct { ElemType data; int cur; }SLinkList[ MAXSIZE ]; void InitSpace_SL( SLinkList &space ) {//将一维数组space中各分量链成一个备用链表,space[0].cur为头指针,“0”表示空指针 int i; for( i = 0; i < MAXSIZE - 1; ++i ) space[ i ].cur =i + 1; space[ MAXSIZE -1 ].cur = 0; } int Malloc_SL( SLinkList &space ) {//若备用空间链表非空,则返回分配的结点下表,否则返回0 int i = space[ 0 ].cur; if( space[ 0 ].cur ) space[ 0 ].cur = space[ i ].cur; return i; } void Free_SL( SLinkList &space, int k ) {//将下表为k的空闲结点回收到备用链表 space[ k ].cur = space[ 0 ].cur; space[ 0 ].cur = k; } void show( SLinkList space, int S )//输出操作 { int p = space[ S ].cur; while( space[ p ].cur ) { cout << space[ p ].data << " "; p = space[ p ].cur; } cout << space[ p ].data; } void difference( SLinkList &space, int &S ) {//依次输入集合A和B的元素,在一维数组中建立表示集合 //(A - B ) U ( B - A )的静态链表,S为其头指针 InitSpace_SL( space ); S = Malloc_SL( space ); int r = S; int m;//A集合中元素个数 int n;//B集合中元素个数 int i,j; int p,k; ElemType b;//B集合中元素 cout << "输入m,n"; scanf("%d%d", &m, &n ); for( j = 1; j <= m; j++ )//建立集合A的链表 { i = Malloc_SL( space );//分配结点 scanf("%d", &space[ i ].data ); space[ r ].cur = i; r = i; } space[ r ].cur = 0; cout << "A链表输出:/n"; show( space, S ); for( j = 1; j <= n; j++ ) { scanf( "%d", &b ); p = S;//指向头结点 k = space[ S ].cur; while( k != space[ r ].cur && space[ k ].data != b )//在当前表中查找 { p = k; k = space[ k ].cur; } if( k == space[ r ].cur )//当前表中不存在该元素时,插入在r所指结点之后,且r的位置不变 { i = Malloc_SL( space ); space[ i ].data = b; space[ i ].cur = space[ r ].cur; space[ r ].cur = i; } else//该元素已在表中,删除之 { space[ p ].cur = space[ k ].cur; Free_SL( space, k ); if( r == k ) r =p; } }//for循环结束 cout << "集合运算之后输出:/n"; show( space, S ); } void main() { SLinkList space; int S; difference( space, S ); system( "pause"); } 继续考虑的部分:集合运算之后,集合中元素输出的顺序。