数据结构例题7

1、设以带头结点的双向循环链表表示的线性表L=(a1,a2,…,an),试写一算法,将L改造为L=(a1,a3,…,an…,a4,a2)。

void Exchange_DLinkList(DLinkList &L){
	DLinkList p,q,tail;
	int count=0;          //count记录数组下标;当数组下标为偶数时,当前结点移动到an后 
	p=L->next;     
	tail=L->prior;     //tail指向表尾结点an
	while(p!=tail){
		count++;
		if(count%2==0){         //count是偶数  
			q=p;                //q指向p所指结点 
			p=p->next;         //p后移 
			q->prior->next=q->next;         //q的前驱结点的next指针指向q的后继 
			q->next->prior=q->prior;        //q的后继结点的prior指针指向q的前驱 (也就是将ai删除) 
			
			q->next=tail->next;              // 将ai插入到an后 
			tail->next->prior=q;
			q->prior=tail;
			tail->next=q; 
		}
		else                 //count不是偶数,p继续向后移 
			p=p->next;
	}
}

2、设计判断单链表中结点是否关于中心对称算法。

bool D(LinkList &L){
	char a[MaxSize];        //定义数组存放链表中元素 
	int len=0,i,j;
	LinkList p=L->next;
	while(p){
		a[len++]=p->data;
		p=p->next;
	}
	for(i=0,j=len-1;i<j;i++,j--){   //比较对称位置结点值是否相等,不相等则报错 
		if(a[i]!=a[j])
			return 0;
	}
	return 1;	//全部相等,关于中心对称 
} 

3、设计一个求结点x在二叉树中的双亲结点算法。

//利用先序遍历非递归算法寻找x的双亲结点 (递归不是很会) 
Btree  Find_Parent(BTree T,BTree x){
	BTree p=T;
	SeqStack S;
	S=Init_SeqStack();
	while(p||!Empty_Stack(S)){
		if(p){          //p不为空检测是否是x的双亲结点 
			if(p->lchild==x||p->rchild==x)
				return p; 
			Push_SeqStack(S,p);       //不是双亲结点则进栈 
			p=p->lchild;            //访问左子树 
		}
		else{
			Pop_SeqStack(S,&p);
			p=p->rchild;          //访问右子树 
		}
	}
}

4、试写一算法,判断以邻接表方式存储的有向图中是否存在由顶点Vi到顶点Vj的路径

//基于广度优先遍历算法实现
int Exist_Path(ALGraph G,int i,int j){
	EdgeNode *P;
	int w;
	PSeqQueue Q;
	Q=Init_SeqQueue();         //初始化队列Q 
	visited[i]=true;              //访问标志置为true 
	In_SeqQueue(Q,i);                 //i入队列 
	while(!Empty_SeqQueue(Q)){          //如果Q不为空,循环 
		Out_SeqQueue(Q,&i);              //队头元素出队 
		for(p=G->adjlist[i].firstedge;p;p=p->next){         //检查所以i的邻接点 
			w=p->adjvertex;                   //w为边结点p对应的顶点域(边结点p对应的顶点下标) 
			if(w==j)	return 1;                      //已找到vj 
			if(!visited[w])	 {              //w!=j,检查是否访问过,未访问则访问标志置为true,且入队列 
				visited[w]=true;
				In_SeqQueue(Q,w); 
			}			
		}
	}
	return 0;
} 

5、试写一算法,知L1、L2分别为两循环单链表的头结点指针,m,n分别为L1、L2表中数据结点个数。要求设计一算法将两表合并成一个带头结点的循环单链表。

void HB(LinkList &L1,int m,LinkList &L2,int n){
	LinkList r1=L1->next;
	LinkList r2=L2->next;
	int i;
	for(i=1;i<m;i++)    //r1移动到L1的尾部结点 
		r1=r1->next;
	for(i=1;i<n;i++)    //r2移动到L2的尾部结点 
		r2=r2->next;
	r1->next=L2->next;    //r1的next指针指向L2的第一个结点 
	r2->next=L1;         //r2的next指针指向L1的头结点
	free(L2);
}

 

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值