数据结构-第二章线性表-算法设计题9

算法设计题

问题描述

        9.已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,写出算法change(p),交换p所指向的结点及其前驱结点的顺序。

算法分析

        

算法步骤

1.用q指向结点p的前驱结点。
2.结点q的前驱结点的后继指针指向结点p。
3.结点p的前驱指针指向结点q的前驱结点。
4.结点q的后继指针指向结点p的后继结点。
5.结点q的前驱指针指向结点p。
6.结点p的后继结点的前驱指针指向q。
7.结点p的后继指针指向结点q。

算法描述

        主要代码

void Exchange(DuLinkList &L)
{
    DuLinkList q=p->prior;//对应图2.14①
	q->prior->next=p;	//对应图2.14②
	p->prior=q->prior;	//对应图2.14③
	q->next=p->next;	//对应图2.14④
	q->prior=p;			//对应图2.14⑤
	p->next->prior=q;	//对应图2.14⑥
	p->next=q; 			//对应图2.14⑦
}

        完整代码

//******************************数据结构-第二章线性表-算法设计题9******************************// 
#include <stdio.h>
#include <iostream>
#define OK 1
#define ERROR 0
using namespace std;
typedef int Status;
//定义双向链表的结构类型
typedef int ElemType;
//------双向链表的存储结构-----// 
typedef struct DuLNode
{
	ElemType data;	     //结点的数据域
	struct DuLNode *prior;//指向直接前驱 
	struct DuLNode *next;//指向直接后继 
 }DuLNode,*DuLinkList;   //DuLNode是结点,DuLinkList是链表,DuLinkList为指向结构体DuLNode的指针类型 

//------双向链表的初始化-----//
  //【算法步骤】//
	//1.生成新结点作为头结点,用头指针L指向头结点。
	//2.头结点的指针域置空。
Status InitList(DuLinkList &L)
{
	//构造一个空的单链表L
	L=new DuLNode;  //生成新结点作为头结点,用头指针L指向头结点  或L=(DuLinkList)malloc(sizeof(DuLNode))
	L->next=L;     //头结点的后继指针指向头结点
	L->prior=L;		//头结点的前驱指针指向头结点
	return OK; 
 } 
 
//------尾插法创建双向链表-----// 
void CreateDuLinkList(DuLinkList &L,int &n)
{
	int i=0;	
    L=new DuLNode;
    L->next=L;
    L->prior=L;
    DuLNode *p=L;
	for(int i=0;i<n;i++)
	{
		DuLNode* s=new DuLNode;
		s->next=NULL;
		scanf("%d",&s->data);
		p->next=s;
		s->prior=p;
		p=p->next;	
	} 
}
 
//------在双向循环链表,交换p所指向的结点及其前驱结点的顺序-----// 
void Exchange(DuLinkList &L)
{
	int n; 
	printf("请输入要交换第几个结点:");
	scanf("%d",&n);
	DuLinkList p=L;
	while(n--)
	{
		p=p->next;
	}
	DuLinkList q=p->prior;//对应图2.14①
	q->prior->next=p;	//对应图2.14②
	p->prior=q->prior;	//对应图2.14③
	q->next=p->next;	//对应图2.14④
	q->prior=p;			//对应图2.14⑤
	p->next->prior=q;	//对应图2.14⑥
	p->next=q; 			//对应图2.14⑦
} 

//------打印单链表函数-----//  
void PrintDuList(DuLinkList L)
{
	printf("当前双向链表中所有元素为:");
	for(DuLinkList p=L->next;p!=NULL;p=p->next)
	{
		if(p->next==NULL)
			printf("<-%d",p->data);
		else
			printf("<-%d->",p->data);
	}
	printf("\n"); 
}

//------双向链表创建函数------//
void Create(DuLinkList &L,int n)
{
	printf("请输入要创建的双向链表L的长度:");
	scanf("%d",&n);
	printf("请依次输入%d个数(空格隔开):",n);
	CreateDuLinkList(L,n);
	printf("双向链表L创建成功!\n");
	PrintDuList(L);	
} 
 
//------在双向循环链表,交换p所指向的结点及其前驱结点的顺序------//
void ExchangeDuList(DuLinkList L)
{
 	Exchange(L);
 	printf("输出交换之后的链表元素:\n");
	PrintDuList(L);	
}

//------主函数-----//
int main()
{	
	int n;
	DuLinkList L,p; 
	InitList(L);
	Create(L,n);
	ExchangeDuList(L);
 } 

        运行结果

请输入要创建的双向链表L的长度:5
请依次输入5个数(空格隔开):1 2 3 4 5
双向链表L创建成功!
当前双向链表中所有元素为:<-1-><-2-><-3-><-4-><-5
请输入要交换第几个结点:3
输出交换之后的链表元素:
当前双向链表中所有元素为:<-1-><-3-><-2-><-4-><-5

--------------------------------
Process exited after 11.62 seconds with return value 0
请按任意键继续. . .

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值