C语言实现双向循环链表

C语言实现双向循环链表

题目:要求实现根据要求的数字,使26个字母排序发生变化,例如数字为3,输出结果:

DEFGHIJKLMNOPQRSTUVWXYZABC

同时支持负数,如-3

XYZABCDEFGHIJKLMNOPQRSTUVW

代码

/*
 * @Author: xgh
 * @Date: 2020-06-16 21:16:26
 * @LastEditTime: 2020-06-17 10:09:12
 * @LastEditors: Please set LastEditors
 * @Description: 双向循环链表
 * @FilePath: \VS-CODE-C\.vscode\twoWayLinkedLists\twoWayLinkedLists.c
 */ 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define ERROR 0
#define SUCCESS 1 

typedef char ElemType;
typedef int Statue;

typedef struct DualNode
{
    ElemType data;
    struct DualNode *perior;  // 前驱结点
    struct DualNode *next;    // 后继结点 
}DualNode, *DualLinkList;

Statue InitList(DualLinkList *L);
void showList(DualLinkList L);
void Sortting(DualLinkList *L, int i);

int main(void)
{
    DualLinkList list;

    InitList(&list);
    showList(list);

    Sortting(&list, -29);
    showList(list);


    return 0;
}

/**
 * @description: 显示链表
 * @param {DualLinkList L: 一级指针} 
 * @return: NULL
 */
void showList(DualLinkList L){
    
    DualLinkList p = L->next;
    printf("双向循环链表数据为:");
    do
    {
        printf("%2c", p->data);
        p = p->next;
    }while(p != L->next);

    printf("\n\n");
    
}

/**
 * @description: 初始化双向链表, 初始化数据A~Z
 * @param {DualLinkList *L: 二级指针} 
 * @return: REEOR: 内存分配失败
 * @return: SUCCESS: 成功
 */
Statue InitList(DualLinkList *L)
{
    int i;
    // p用于记录尾结点, q用于记录新生成的结点
    DualLinkList p, q;
    // 分配内存, 创建头结点
    *L = (DualLinkList) malloc (sizeof(DualNode));
    // 判断内存分配是否成功
    if(!(*L)){
        return ERROR;
    }

    // p用于标识为结点
    p = (*L);

    // 生成结点, 初始化数据
    for(i= 0; i < 26; i++){

        // 生成新结点
        q = (DualLinkList) malloc (sizeof(DualNode));

        // 初始化结点数据, 从A~Z
        q->data = 'A' + i;
        // 将q的前驱结点标识为p
        q->perior = p;
        // 将q的后继结点改为p的后继结点
        q->next = p->next;
        // 将p的后继结点改为q
        p->next = q;

        // 将尾结点标识后移, 改为新生成的结点, 以便在表尾添加数据
        p = q;
    }

    // 构建循环, 首元结点的前驱结点为尾结点, 尾结点的后继结点为首元结点
    p->next = (*L)->next;
    (*L)->next->perior = p;

    return SUCCESS;
}

/**
 * @description: 根据用户输入数量进行重新排序
 * @param {type} 
 * @return: 
 */
void Sortting(DualLinkList *L, int i){

    int newdata;

    if(i > 0){
        newdata = i % 26;
        do{
            // 头指针移动
            (*L) = (*L)->next;
        }while(--newdata);
    }else{ 
        newdata = abs(i) % 26 ; 
        (*L) = (*L)->next->perior; // 负数从Z开始显示
        do
        {
            // 头指针移动
            (*L) = (*L)->perior;
        } while (--newdata); 
        
    }

}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值