C语言实现双向巡回链表

主要利用双向链表实现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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值