双向链表实现:输入一个数使得26个字母的排列发生变化

题目:


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

代码演示如下:

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0

typedef int Status;//将int定义为Status返回
typedef char Elemtype;//暂定Elemtype为char

//双向链表数据结构
typedef struct DualList
{
    Elemtype data;
    struct DualList *prior;
    struct DualList *next;
}DualNode,*DuaLinkList;//定义两个变量名,一个无指针,一个有指针

//初始化双向链表
Status Initlist(DuaLinkList *L)
{
    DualNode *p,*q;
    int i;
    //建立一个头节点指针
    (*L)=(DuaLinkList)malloc(sizeof(DualNode));
    //错误控制
    if (!(*L))
    {
        return ERROR;
    }
    //清零头节点
    (*L)->prior=(*L)->next=NULL;
    //这里使用p,q两个指针进行插入操作
    p=(*L);
    for (i=0;i<26;i++)
    {
        //建立一个节点指针
        q=(DuaLinkList)malloc(sizeof(DualNode));
        //错误控制
        if (!q)
        {
            return ERROR;
        }
        //以下操作进行节点的赋值与建立双向链表
        q->data='A'+i;
        q->next=p->next;
        q->prior=p;
        p->next=q;
        p=q;

    }
    //将最后一个结点链接回第一个结点,(注意,这里跳过头节点)建立循环链表
    p->next=(*L)->next;
    (*L)->next->prior=p;
    return OK;

}
//对双向循环链表的第一个结点与n进行同步操作
void caesar(DuaLinkList *L,int n)
{
    //假如n=0,此函数无法激活,即双向循环链表的第一个结点位置不变
    if (n>0)
    {
        //这里使用do while语句的原因是跳过头节点
        do
        {
            (*L)=(*L)->next;
        }while(--n);

    }
    if(n<0)
    {
        do
        {
            (*L)=(*L)->next;
        }while(++n);
    }

}
int main()
{
    DuaLinkList L;
    int n,i;
    //初始化链表
    Initlist(&L);
    printf("请输入N值:\n");
    scanf("%d",&n);
    printf("\n");
    //变更初始结点的位置
    caesar(&L,n);
    
    for(i=0;i<26;i++)
    {
        
        L=L->next;//此步用于跳过头节点
        printf("%c",L->data);//输出打他值
    }
    return 0;



}

猜你喜欢

转载自blog.csdn.net/qq_41686130/article/details/81517428