静态链表的基本操作——集合运算

利用静态链表计算集合(A-B)∪(B-A),由终端输入集合元素,先建立表示集合A的静态链表S,而后在输入集合B的元素的同时查找S表,若存在和B相同的元素,则从S表中删除之,否则将此元素插入S表。【算法2.16】

  • 1.将整个数组空间初始化成一个链表
  • 2.从备用空间取得一个结点
  • 3.将空闲结点链结到备用链表上

    

#include<stdio.h>
#include<stdlib.h>
#define	OVERFLOW	-2			//堆栈上溢
#define UNDERFLOW	-3			//堆栈下溢
#define MAXSIZE 1000
typedef int Status;	//状态码识别类型
typedef int ElemType;
//▲00静态链表的存储结构
typedef struct{
	ElemType data;	//数据
	int cur;		//游标(Cursor)
}component, SLinkList[MAXSIZE];
//▲01将一维数组space中各分量链成一个备用链表
void InitSpace_SL(SLinkList &space){//space[0].cur为头指针
	for(int i=0;i<MAXSIZE-1;i++){
		space[i].cur=i+1;//下标为i结点的后继为下标是i+1的结点
	}
	//space[MAXSIZE-2].cur=0;//备用链表的最后一个空元素的cur指向0 
	space[MAXSIZE-1].cur=0;// "0"表示空指针
} 
//▲02从备用空间申请结点空间
int Malloc_SL(SLinkList &space){
	//若备用空间链表非空,则返回分配的结点下标,否则返回0
	int i=space[0].cur;
	if(space[0].cur){
		space[0].cur=space[i].cur;//将备用链表的第一个结点抽出作待插入数据
		//space[0].cur重新指向新的备用链表的第一个结点的下标
	}
	return i;
}
//▲03将下标为k的空闲节点回收到备用链表中
void Free_SL(SLinkList &space,int k){
	space[k].cur=space[0].cur;//将被删除元素(即空闲结点)的游标指向备用链表的第一个结点的下标
	space[0].cur=k;
}
void difference(SLinkList &space,int &S){
	int i,j,r,p,k;
	ElemType b;	
	InitSpace_SL(space);
	S=Malloc_SL(space);	//生成S的头结点 
	r=S; 	//r指向S的当前最后结点(尾指针)
	space[r].cur=0;
	int len_a,len_b;
	scanf("%d%d",&len_a,&len_b);
	for(j=0;j<len_a;j++){
		i=Malloc_SL(space);	//分配结点
		scanf("%d",&space[i].data);	//输入A的元素值
		space[r].cur=i;	//插到表尾 
		r=i; 
	}
	space[r].cur=0;	//尾结点(最后一个结点)的指针为空 
	for(j=0;j<len_b;j++){
		scanf("%d",&b);
		p=S;	//p指向集合A的头结点
		k=space[S].cur;	//k指向集合A的第一个结点 
		while(k!=space[r].cur&&space[k].data!=b){
			p=k;
			k=space[k].cur;
		} 
		if(k==space[r].cur){//没找到,插入在r所指结点之后
			i=Malloc_SL(space);
			space[i].data=b;
			space[i].cur=space[r].cur;
			space[r].cur=i;
			r=i;
		}else{	//找到,做删除操作
			space[p].cur=space[k].cur;
			Free_SL(space,k);
			if(k==r){	//若删除的是r所指的结点,则需修改尾指针 
				r=p;
			}
		}
	} 
}
void PrintElem(ElemType e){
	printf("%d ", e);
}
//▲15遍历
Status ListTraverse_SL(SLinkList space,void (visit)(ElemType),int H){		
	if(!H){
		return 0;
	}
	int p=space[H].cur;
	while(p){
		visit(space[p].data);
		p=space[p].cur;
	}
	printf("\n");
	return 1;
}
int main(){
	SLinkList space;
	int S;
	difference(space,S);
	ListTraverse_SL(space,PrintElem,S);
	return 0;
}

 

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值