数据结构顺序链栈的实际问题

7-1 找寻密码 (50 分)
这是一个密码问题,密码由10个小写字母构成,这10个密码均从所有的小写字母中按规律查找,其规律是:所有的字母按字典序从'a'~'z'排列从头开始进行1到n报数,凡是报到n的字母出列,剩下的向小序号方向靠拢,再从头开始进行1到(n+1)报数,凡报到(n+1)的出列,剩下的向小序号方向靠拢,以后一次从头开始轮流进行1到n、1到(n+1)报数,直到得到出列的字母有10个为止,这些字母就是所需要的密码。

输入格式:
输入奇数次报数的出列序号n。

输出格式:
输出10个字母密码

输入样例:
在这里给出一组输入。例如:

5
输出样例:
在这里给出相应的输出。例如:

ejotygnvfm

#include<stdio.h>
#include<malloc.h>
typedef struct list
{
char letter;
struct list* next;
}list;
typedef struct list* listptr;
void ReadList(struct list*P)
{
char n;
listptr P0;
P0 = P;
for (n = 'a';n <= 'z';n++)
{
listptr P1;
P1= (listptr)malloc(sizeof(struct list));P1->next = NULL;
P1->letter = n;
P0->next = P1;
P0 = P1;
}
}
void find(listptr P, int n)
{
int cout = 1, num = 0;
listptr P0;
P0 = P;
while(num<10)
{
if (cout)
{
int i = 1;
while ((P->next))
{
if (i == n)
{
listptr P1;
P1 = P->next;
printf("%c", P1->letter);
P->next = P1->next;
free(P1);
num++;
cout = 0;
i = 1;
}
else
{
i++;
P = P->next;
}
if (num == 10)break;

        }
        
    }
    else
    {
        int i = 1;
        while ((P->next))
        {
            if (i == n+1)
            {
                listptr P1;
                P1 = P->next;
                printf("%c", P1->letter);
                P->next = P1->next;
                free(P1);
                num++;
                cout = 1;
                i = 1;
            }
            else
            {
                i++;
                P = P->next;
            }
            if (num == 10)break;
        }
    }
    P = P0;
}

}
int main()
{
int n;
scanf("%d", &n);
listptr P;
P=(listptr)malloc(sizeof(struct list));P->next=NULL;
ReadList(P);
find(P,n);
}