算法设计题
问题描述
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
请按任意键继续. . .