版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a1135004584/article/details/79331892
双向循环链表:
简单的来说,双向循环链表比单向循环链表多了一个节点previous.
C语言结构:
typedef struct duplexNode{ char alphabet; struct duplexNode * previous; struct duplexNode * next; }DuplexNode,*DuplexLinkList;
问题:
要求实现用户输入一个数使得26个字母的排列发生变化,例如用户输入3,
输出结果:DEFGHIJKLMNOPQRSTUVWXYZABC
思路:创建一个双向链表,将字母表写入,然后获取用户输入,如果大于0向前走多少个元素,如果小于0向后走多少个元素,然后以此为根节点输出即可。
代码:
#include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct duplexNode{ char alphabet; struct duplexNode * previous; struct duplexNode * next; }DuplexNode,*DuplexLinkList; typedef enum{ FAILED,SUCCESS }Status; Status initDuplexLinkList(DuplexLinkList * duplexLinkList); void caesar(DuplexLinkList *duplexLinkList,int n); int main(void) { DuplexLinkList duplexLinkList = NULL; int n = 0; if(initDuplexLinkList(&duplexLinkList) == FAILED) { fprintf(stderr,"failed of init!"); exit(1); } printf("请输入n="); scanf("%d",&n); getchar(); caesar(&duplexLinkList,n); printf("\n"); return 0; } Status initDuplexLinkList(DuplexLinkList * duplexLinkList) { (*duplexLinkList) = (DuplexNode *)malloc(sizeof(DuplexNode)); (*duplexLinkList)->alphabet = NULL; DuplexNode *p, *q = NULL; p = (*duplexLinkList); int k; for(k=0;k<26;k++) { q = (DuplexNode *)malloc(sizeof(DuplexNode)); if(!q) { fprintf(stderr,"error due to malloc!\n"); return FAILED; } q->alphabet = (char) ('A' + k); q->previous = p; q->next = NULL; p->next = q; p = q; } q->next = (*duplexLinkList)->next; (*duplexLinkList)->next->previous = q; return SUCCESS; } void caesar(DuplexLinkList *duplexLinkList,int n) { DuplexNode * node = (*duplexLinkList)->next; //指向A if(n > 0) { do{ node = node->next; }while(--n); } if(n < 0) { do{ node = node->previous; }while(++n); } for(n=0;n<26;n++) { printf("%c",node->alphabet); node = node->next; } }