双向循环链表的实践(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;
}
下一篇: 双向循环链表