主要利用双向链表实现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 Node{
Elemtype data;
struct Node *prior;
struct Node *next;
}Node,*Linked;
Status InitList(Linked *L){//初始化链表
Node *p,*q;
int i;
*L = (Linked)malloc(sizeof(Node));//生成一个指向头结点的指针
if(!(*L)){
return ERROR;
}
(*L)->next = (*L)->prior = NULL;
p = (*L);//p节点指向头结点,然后p在指向q,q在往后移动
for(i=0;i<26;i++){//添加26个英文字母
q = (Node *)malloc(sizeof(Node));//生成一个新节点,往里赋值,然后p指向q,
//在生成新节点,以此循环
if(!q){
return ERROR;
}
q->data = 'A'+i;
q->prior = p;
q->next = p->next;//把q的next置为null
p->next = q;
p=q;
}
//实现巡回的主要步骤
p->next = (*L)->next; //此时p,q都在最指的是最后一个节点,使p/q指向头结点的下一个节点
(*L)->next->prior=p;//然后头结点的下一个节点在指回p/q。
(*L) = p;//头结点在指向p/q
return OK;
}
void Casear(Linked *L,int i){//打印输出链表
if(i>0){
do{
(*L) = (*L)->next;
}while(--i);
}
if(i<0){
do{
(*L) = (*L)->prior;
}while(++i);
}
}
int main()
{
Linked L;
int i,n;
InitList(&L);
printf("输入一个整数:\n");
scanf("%d",&n);
Casear(&L,n);
for(i=0;i<26;i++){
L = L->next;
printf("%c",L->data);
}
return 0;
}