欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

双向循环链表的实践(C语言+详细注释)

程序员文章站 2022-03-15 20:25:20
...

要求:实现用户输入一个数使得26个字母的排列发生变化
例如用户输入3
输出结果:DEFGHIJKLMNOPQRSTUVWXYZABC
同时需要支持负数
例如用户输入-3,
输出结果:XYZABCDEFGHIJKLMNOPQRSTUVW

程序代码如下:

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

#define OK       1
#define ERROR    0

typedef  char  Elemtype;//数据类型重定义 
typedef int  Status;//状态类型重定义 

typedef struct DualNode{//双向链表存储结构描述 
	Elemtype data;//数据域 
	struct DualNode *prior;//节点前驱指针 
	struct DualNode *next;//节点后继指针 
}DualNode,*DuLinklist;

Status InitList(DuLinklist *L)//双向链表初始化 
{
	int i;
	DualNode *p,*q;
	*L=(DuLinklist)malloc(sizeof(DualNode));//创建头结点 
	if(!(*L))//异常判断 
	{
		return ERROR;
	}
	(*L)->prior=(*L)->next=NULL;//将头结点的前驱指针和后继指针指向为空 
	p=(*L);
	for(i=0;i<26;i++)
	{
		q=(DuLinklist)malloc(sizeof(DualNode));//创建新节点 
		if(!q)//异常判断 
		{
			return ERROR;
		}
		q->data='A'+i;
		q->prior=p;//将创建节点的前驱指针指向上一个节点 
		q->next=p->next;//将创建节点的后继指针指向为空 
		p->next=q;//将上一节点的后继指针指向新创建节点 
		p=q;//将指针指向尾节点	
	}
	p->next=(*L)->next;//将尾节点的后继指针指向首节点 
	(*L)->next->prior=q;//将首节点的前驱指针指向尾节点 
	
	return OK;
}

void Move(DuLinklist *L,int i)
{
	if(i>0)//将元素正向移动 
	{
		do{
			 (*L)=(*L)->next;//将指针移到链表正向第i个开始正向输出 
		  }while(--i);
	}
	if(i<0)
	{
		i=i-1;
		(*L)=(*L)->next;//将指针指向首节点 
		do{
			 (*L)=(*L)->prior;//后继转前继将指针移到链表逆向第i个开始正向输出
		  }while(++i);
	}
}
void Display(DuLinklist *L)//链表输出函数 
{
	int i;
	for(i=0;i<26;i++)
	{
		(*L)=(*L)->next;
		printf("%c",(*L)->data);
	}
}
int main()
{
	int n;
	DuLinklist L;
	InitList(&L);
	Display(&L);//输出初始化链表 
	printf("\n");
	printf("请输入移动元素的个数:"); 
	scanf("%d",&n);
	Move(&L,n);//移动操作 
	Display(&L);//输出移动后的链表 
	return 0;
}