类C语言--线性表习题 :已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,写出算法change(p),交换p所指向的结点和它的前缀结点的顺序。

这是一个关于双向循环链表的问题,要求编写change(p)算法,交换p指向的节点及其前驱节点的位置。解决方案需关注两部分:实际节点交换操作和找到前驱节点。

此代码可以正常运行
分析:两个重点,一个是核心算法(改变两个节点),第二个是找到那个节点

#include<stdio.h>
#include<stdlib.h>
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) 
{
	DLnode *p;
	p = L->next;
	
	while (p != L) 
	{
		printf("%d ", p->data);
		p = p->next;
	}
	
	printf("\n");
}
 
int ListLength(LinkList &L) 
{
	DLnode *p;
	p = L->next;
	int length = 0;
	while (p!=L) 
	{
		length++;
		p = p->next;
	}
	
	return length;
}
 
void CreateList(LinkList &L, int &n)   //尾插法创造
{
	L = new DLnode;
	L->next = L;
	L->prior = L;
	DLnode *p;
	p = L;
	
	for (int i = 0; i < n; i++) 
	{
		printf("请输入第%d个元素的值:", i + 1);
		DLnode *s;
		s = new DLnode;
		scanf("%d", &s->data);
		p->next = s;
		s->next = L;
		s->prior = p;
		p = s;
	}
}
 
void Change(LinkList p)   //核心算法
{
	DLnode *q;
	q = p->prior;
	
	q->prior->next = p;          // p的前驱的前驱之后继为p
	p->prior = q->prior;    // p的前驱指向其前驱的前驱。
	
	q->next = p->next;    // p的前驱的后继为p的后继。 
	p->next->prior = q;   // p的后继的前驱指向原p的前驱
	
	q->prior = p;     // p与其前驱交换
	p->next = q;    // p的后继指向其原来的前驱
}
 
int main() 
{
	LinkList L;
	
	if (InitList(L)) 
	{
		printf("L初始化成功\n");
	}
	else 
	{
		printf("L初始化失败.\n");
	}
 
	printf("请输入链表元素个数:");
	int n;
	scanf("%d", &n);
	CreateList(L, n);
	TraveList(L);
	printf("链表长度:%d\n", ListLength(L));
	
	printf("请输入要交换的结点的值:");
	DLnode *s;
	s = new DLnode;
	scanf("%d", &s->data);
	DLnode *p;
	p = L->next;
	while (p != L) 
	{
		if (p->data == s->data)     //寻找节点
		{
			Change(p);
 
			break;
		}
		else 
		{
			p = p->next;
		}
	}
	
	TraveList(L);
 
	return 0;
}
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值