数据结构(静态链表)实现(A - B)U(B - A)算法

静态链表简单来说是指用数组型描述的链表

数组中为了达到和指针一样的效果,用到了游标 cur  ,例如: S[0].cur 是指头节点的第一个元素 或者 i = s  [0].sur 和 p = p -> next 相似的效果。

在静态链表中实现LocatElem 函数的效果 算法可以表示为:

// 2020.7.25 飞飞飞  LocalElem_LC() 函数 
int LocalElem_LC (SLinkList &S , ElemYype &e){
	//在S的链表中 找到第一个和e相等的数组位序
	i = S[0].cur ;
	while (i && S[i].data != e) 
	i = S [i].cur ;  //p = p -> next 
	return i ;  
}

由于静态链表和单链表的不同,需要用户自己实现 malloc 和 free 函数

例如,以集合运算(A - B)U(B - A)的算法的实现:

1. 定义一个 InitSpace_LC() 数组成静态链表函数

// 2020.7.25 飞飞飞 InitSpace_LC() 数组成静态链表函数 
void InitSpace_LC (SlinkList &space){
	 
	for (i =0 ; i < MAXSIZE - 1 ; i ++){
		space[i].cur = i + 1 ;    
	}
	space[MAXSIZE - 1].cur = 0 ; //空指针 
}

2. 定义一个 Molloc_LC() 开辟静态链表结点函数

int Molloc_LC (SlinkList & space){
	i = space [0].cur ;
	if(space[0].cur){
		space[0].cur = space[i].cur ;
	}
	return i ;
} 

3.实现(A - B)U(B - A)算法函数

// 2020.7.25 飞飞飞 different() 实现(A - B)U(B - A)算法函数
void different(SlinkList &sapce , int &S){
	//实现 (A - B)U(B - A) 的算法函数
	InitSpace_LC(space) ; //初始化备用空间
	Molloc_LC (space) ; //初始化备用空间的结点
	S = Molloc_LC(space) ; //S 指向头节点 
	r = S ;
	scanf(m , n) ;//A B 集合分别的数量 
	for(j =0 ; j < m - 1 ;j ++){ 
	i = Molloc_LC (space) ; 
	scanf(space[i].data) ; 
	space[r].cur = i ;
	r = i ;
	} space[r].cur = 0 ;//尾结点的cur空 ,以上是实现把A放到 space 静态链表里 
	for(j = 0 ; j < n -1 ; j ++){
		scanf(b);   //B element 
		p = S ;
		k = space[S].cur ; //定义类似指针 方便找到相同的元素进行删除操作 
		while (space[k].data != b && k != space[r].cur){
			p = k ;
			k = space[k].cur ;       //利用双重循环查找 ,时间复杂度 O(m*n) 
		}
		if(k == space[r].cur){
			i = Molloc_LC (space) ;    //找到底没有找到一样的,开辟结点。定义数据域 
			space[i].data = b ;
			space[i].cur = space[r].cur ;  //放到space静态链表的后面 
			space[r].cur = i ;
			r = i ;          //重新定义尾节点的指针 
		}
		else
		{
			space[p].cur = space[k].cur ;  //找到了结点一样,删除 
			if(r == k) 
			p = space[r].cur ; 
			r = p ;           //尾节点的指针 
		}
	} 
	   
}

以上没有定义Free函数 需要定义后在删除的后面添加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值