您的位置:首页 > 理论基础 > 数据结构算法

《数据结构》交换双向循环链表的结点p和它的前驱结点

2016-04-06 17:01 423 查看
2.9 交换双向循环链表的结点p和它的前驱结点
题目描述:

已知p指向双向循环链表中的一个结点,其结点结构为data,prior,next三个域;

写出算法change(p),交换p所指向的结点及其前驱结点的顺序。

交换算法:

void Change(LinkList p){
struct DLnode *q;
q=p->prior;
q->prior->next=p;//p的前驱的前驱之后继为p
p->prior=q->prior;//p的前驱指向其前驱的前驱。
q->next=p->next;//∥p的前驱的后继为p的后继。
q->prior=p;//p与其前驱交换
p->next->prior=q;//p的后继的前驱指向原p的前驱
p->next=q;//p的后继指向其原来的前驱

}


实现:

/*
已知p指向双向循环链表中的一个结点,其结点结构为data,prior,next三个域;
写出算法change(p),交换p所指向的结点及其前驱结点的顺序。
*/
#include<stdio.h>
#define MAX 100
typedef struct DLnode{
int data;
struct DLnode *prior;
struct DLnode *next;
}DLnode,*LinkList;

int InitList(LinkList &L){
L=new DLnode;
L->next=L;
L->prior=L;
return 1;
}

void TraveList(LinkList L){
struct DLnode *p;
p=L->next;
while(p!=L){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}

int ListLength(LinkList &L){
struct DLnode *p;
int length=0;
while(p){
++length;
p=p->next;
}
return length;
}

void CreateList(LinkList &L,int &n){
L=new DLnode;
L->next=L;
L->prior=L;
struct DLnode *p;
p=L;
for(int i=0;i<n;i++){
printf("请输入第%d个元素的值:",i+1);
struct DLnode *s;
s=new DLnode;
scanf("%d",&s->data);
p->next=s;
s->next=L;
s->prior=p;
p=s;
}
}

void Change(LinkList p){ struct DLnode *q; q=p->prior; q->prior->next=p;//p的前驱的前驱之后继为p p->prior=q->prior;//p的前驱指向其前驱的前驱。 q->next=p->next;//∥p的前驱的后继为p的后继。 q->prior=p;//p与其前驱交换 p->next->prior=q;//p的后继的前驱指向原p的前驱 p->next=q;//p的后继指向其原来的前驱 }

int main(){
LinkList L;
if(InitList(L)){
printf("初始化成功\n");
}else{
printf("初始化失败.\n");
}

printf("请输入链表元素个数:");
int n;
scanf("%d",&n);
CreateList(L,n);
TraveList(L);

printf("请输入要交换的结点的值:");
struct DLnode *s;
s=new DLnode;
scanf("%d",&s->data);
struct DLnode *p;
p=L->next;
while(p!=L){
if(p->data==s->data){
Change(p);

break;
}else{
p=p->next;
}
}
TraveList(L);
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: