《数据结构和算法》之双向链表问题实践

来源:互联网 发布: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
原创粉丝点击