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);
}
}