《数据结构和算法》之双向链表问题实践
来源:互联网 发布:java 多任务定时器 编辑:程序博客网 时间:2024/05/20 07:58
1,问题描述:
要求实现用户输入一个数使得26个字母的排列发生变化,例如用户输入3,使得结果为:DEFHIJKLMNOPQRSTUVWXYZABC,同时需要支持负数,使得输入-3时,结果为:
XYZABCDEFGHIJKLMNOPQRSTUVW。很明显这是一个双向循环链表的问题,可以实现双向移动位置。
2,思路分析
首先定义一个结构体:
typedef char ElemType;typedef int Status;typedef struct DualNode{ElemType data;struct DualNode *prior; //前驱结点struct DualNode *next; //后继结点 }DualNode, *DuLinkList;
其次,生成一个L头结点,即为*L,将p结点赋值为*L,再新建一个结点q,给其分配内存,要判定是否分配成功。
图1 双向链表的思路分析图
其中*L为头结点指针,p、q均为中介变量结点,通过p、q的不断改变循环才可以产生有26个元素的双向循环链表。
Status InitList(DuLinkList *L){DualNode *p,*q;int i;*L = (DuLinkList)malloc(sizeof(DualNode));if(!(*L)){ return ERROR;}(*L)->next = (*L)->prior = NULL;p = (*L);for(i=0; i<26; i++){ q = (DualNode)malloc(sizeof(DualNode)); if(!q) { return ERROR;}q->data = 'A' + i;q->prior = p;q->next =p->next;p->next =q;p = q; //只有这样才可以实现循环,p与q只是两个中介结点,目的是为了创建双向循环链表 } p->next = (*L)->next;(*L)->next->prior = p;return OK; }
从代码和配图中可以详细地看到怎样实现循环链表的创建的,并且为其每一个元素赋值为从A到Z。
再者,定义移位函数:
void Caesar(DuLinkList *L, int i){if(i>0){ do{ (*L) = (*L)->next;}while(--i);}}
3,全部代码
#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0typedef char ElemType;typedef int Status;typedef struct DualNode{ElemType data;struct DualNode *prior; //前驱结点struct DualNode *next; //后继结点 }DualNode, *DuLinkList;Status InitList(DuLinkList *L){DualNode *p,*q;int i;*L = (DuLinkList)malloc(sizeof(DualNode));if(!(*L)){ return ERROR;}(*L)->next = (*L)->prior = NULL;p = (*L);for(i=0; i<26; i++){ q = (DualNode*)malloc(sizeof(DualNode)); if( !q ) { return ERROR;}q->data = 'A' + i;q->prior = p;q->next = p->next;p->next = q;p = q; //只有这样才可以实现循环,p与q只是两个中介结点,目的是为了创建双向循环链表 } p->next = (*L)->next;(*L)->next->prior = p;return OK; }void Caesar(DuLinkList *L, int i){if(i>0){ do{ (*L) = (*L)->next;}while(--i);}}int main(){DuLinkList L;int i,n;InitList(&L);printf("请输入一个整数:\n");scanf("%d", &n);printf("\n");Caesar(&L,n);for(i=0; i<26; i++){ L = L->next;printf("%c", L->data);}printf("\n");return 0;}
1 0
- 《数据结构和算法》之双向链表问题实践
- 《数据结构和算法》之双向链表
- 算法与数据结构之双向链表
- 算法学习之数据结构之双向链表
- 数据结构--双向循环链表实践
- 数据结构与算法之六 双向链表和循环链表
- 算法与数据结构之四----双向链表
- "双向链表"-数据结构算法-之通俗易懂,完全解析
- 数据结构与算法之双向链表 <二>
- 数据结构和算法系列 - 双向链表结构
- 双向链表的算法设计和实现(数据结构)
- 数据结构和算法C++语言实现:双向链表
- Java数据结构和算法-链表(4-双向链表)
- 数据结构之双向链表
- 数据结构之双向链表
- 数据结构之双向链表
- 数据结构之双向链表
- 数据结构之双向链表
- 历届试题 核桃的数量
- Spring IOC基础
- Android -- RecyclerView实现顶部吸附效果
- 三维求点
- 【10天轻松掌握C语言】5、C语言数组与字符串
- 《数据结构和算法》之双向链表问题实践
- WireShark 8TCP协议分析续
- 欢迎使用CSDN-markdown编辑器
- Java 学习记录
- TPS和QPS的区别
- Eclipse 的白背景不知道晃瞎了多少双眼 (设置 text editors / run debug
- Redis的安装(centos)
- Linux(ubuntu 14.04)下安装jdk(1.8)以及eclipse 最新版本Neon的安装
- jboss规则引擎KIE Drools 6.3.0-高级讲授篇