程序输入一个数,会使26个英文字母的顺序发生变化,比如原来为 ABCDEFGHIJKLMNUPQRSTUVWXYZ 输入3 字符串变为 DEFGHIJKLMNOPQRSTUVWXYZABC 还可以输入负数 比如-5 VWXYZABCDEFGHIJKLMNOPQRXTU
程序代码如下:
#include<stdio.h>
#include<stdlib.h>
#define OK 1 //宏定义 OK代表1 表示成功
#define ERROR 0 //EEEOR代表失败
typedef char ElemType; //typedef 使数据类型转换名字
typedef int Status;
typedef struct DualNode //定义链表
{
ElemType data; //定义data为ELemType也就是char类型
struct DualNode *prior; //定义前驱, struct(定义符号) DualNode(结构体名)
struct DualNode *next; //定义后继
} DualNode,*DuLinkList; //增加名字
Status InitList(DuLinkList *L) //初始化链表 构建二十六个字母的链表
{
DualNode *p,*q; //定义指针变量, p为链表中最后一个元素, q为添加的新元素
int i; //控制循环次数
*L=(DuLinkList)malloc(sizeof(DualNode)); //先给头结点分配地址
if(!(*L)) //分配失败,退出
return ERROR;
(*L)->next=(*L)->prior=NULL; //初始化 ,头结点的前驱和后继都为空
p=(*L); //先将p放在头结点上
for(i=0;i<26;i++) //开始进行循环
{
q=(DualNode *)malloc(sizeof(DualNode)); //给每一个新添加的元素分配空间
if(!q)
return ERROR;
q->data='A'+i; //利用i对添加的元素进行赋值
q->prior=p; //q的前驱指向p
q->next=p->next; //q的后驱指向p的后驱 (这一步主要是因为q还没有下一个元素,所以先借用p的后驱来代替,也呼应了后面
p->next=q; //p的后驱指向q
p=q; //进行循环替代,p重新成为链表的最后一个元素
}
p->next=(*L)->next; //循环结束,进行首尾相连,空出头结点
(*L)->next->prior=p;
return OK;
}
void Cassar(DuLinkList *L,int i) //定义字符串改变函数
{
if(i>0) //进行头结点转换,因为是循环链表,所以可以赋数比较大的值
{
do
{
(*L)=(*L)->next;
}while(--i);
}
if(i<0)
{
do
{
(*L)=(*L)->next;
}while(++i);
}
}
int main()
{
DuLinkList L;
int i;
while(1)
{
InitList(&L);
printf("请输入一个整数(输入0结束):");
scanf("%d",&i);
if(i==0)
break;
printf("\n");
Cassar(&L,i);
for(i=0;i<26;i++) //进行输出
{
L=L->next;
printf("%c",L->data);
}
printf("\n\n");
}
}