有趣的数据结构算法7——双向循环链表的实例应用

有趣的数据结构算法7——双向循环链表的实例应用

问题复述

要求实现用户输入一个数字改变26个字母的排列顺序。正常情况下26个字母的排列顺序是A B C D E F G H I J K L M N O P Q R S T U V W X Y Z。
当用户输入3时,字母的排列顺序改为D E F G H I J K L M N O P Q R S T U V W X Y Z A B C。
当用户输入-3时,字母的排列顺序改为X Y Z A B C D E F G H I J K L M N O P Q R S T U V W 。
刚学完循环链表和双向链表的我看到这个问题,太简单了。我相信:
在这里插入图片描述

解题思路

我们可以将26个英文字母排列成一个双向循环链表,头指针指向A,此时如果输入的数字是正数,则

for (int i = 0; i < num; i++){	//num代表输入的数字
	s = s->Next;
}

此时如果输入的数字是负数,则

for (int i = 0; i < -num; i++){	 //num代表输入的数字
	s = s->Before;
}

此时再从s结点开始遍历整个链表,便可以得到全新排列的26个字母。

实现代码

#include <stdio.h>
#include <stdlib.h>

struct Node{
	char c;
	struct Node* Next;
	struct Node* Before;
};

typedef struct Node* List;

//声明函数
List createList();
void ScanList(List list);
void mission(int num, List list);

int main(void){
	List ok;
	int num;
	ok = createList();
	printf("请输入一个数字:");
	scanf("%d", &num);
	mission(num, ok);
}

List createList(){
	List s, p;
	List Head;
	char c = 'A';
	
	int i;
	Head= (List)malloc(sizeof(struct Node));
	s = Head;				//头结点节点初始化
	s->c = c;
	s->Next = s;		
	s->Before = s;
	for (i = 1; i < 26; i++){	
		c = c + 1;
		p = (List)malloc(sizeof(struct Node));
		s->Next = p;		//此处一共具有三个List节点,head始终指向头部
		p->Before = s;		//p节点是临时节点,用作每一次插入新节点。
		Head->Before = p;	//s节点每次都进行s=s->Next更新,始终指向尾节点。
		p->Next = Head;
		s = s->Next;
		p->c = c;
	}
	return Head;
}

void ScanList(List list){
	List s = list;
	printf("%c ", s->c);	//从头到尾遍历链表
	s = s->Next;
	while (s != list){
		printf("%c ", s->c);
		s = s->Next;
	}
}

void mission(int num, List list){
	List s = list;
	if (num > 0)
	{
		for (int i = 0; i < num; i++){	//num代表输入的数字
			s = s->Next;
		}
	}
	else{
		for (int i = 0; i < -num; i++){	//num代表输入的数字
			s = s->Before;
		}
	}
	ScanList(s);
}

GITHUB下载连接

https://github.com/bubbliiiing/Data-Structure-and-Algorithm

希望得到朋友们的喜欢。
有问题的朋友可以提问噢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bubbliiiing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值