双向循环链表实践练习

来源:互联网 发布:食品网络营销策划方案 编辑:程序博客网 时间:2024/06/05 15:34

     程序输入一个数,会使26个英文字母的顺序发生变化,比如原来为     ABCDEFGHIJKLMNUPQRSTUVWXYZ   输入3   字符串变为   DEFGHIJKLMNOPQRSTUVWXYZABC         还可以输入负数   比如-5     VWXYZABCDEFGHIJKLMNOPQRXTU  

程序代码如下:

#include<stdio.h>#include<stdlib.h>#define OK 1//宏定义  OK代表1 表示成功 #define ERROR 0//EEEOR代表失败 typedef char ElemType;//typedef   使数据类型转换名字 typedef int  Status;typedef struct DualNode//定义链表 {ElemType data;//定义data为ELemType也就是char类型 struct DualNode *prior;//定义前驱, struct(定义符号) DualNode(结构体名) struct DualNode *next;//定义后继  } DualNode,*DuLinkList;//增加名字  Status InitList(DuLinkList *L)//初始化链表 构建二十六个字母的链表 {DualNode *p,*q;//定义指针变量,  p为链表中最后一个元素, q为添加的新元素 int i;//控制循环次数 *L=(DuLinkList)malloc(sizeof(DualNode));//先给头结点分配地址 if(!(*L))//分配失败,退出 return ERROR;(*L)->next=(*L)->prior=NULL;//初始化 ,头结点的前驱和后继都为空 p=(*L);//先将p放在头结点上 for(i=0;i<26;i++)//开始进行循环 {q=(DualNode *)malloc(sizeof(DualNode));//给每一个新添加的元素分配空间 if(!q)return ERROR;q->data='A'+i;//利用i对添加的元素进行赋值 q->prior=p;//q的前驱指向p q->next=p->next;//q的后驱指向p的后驱 (这一步主要是因为q还没有下一个元素,所以先借用p的后驱来代替,也呼应了后面 p->next=q;//p的后驱指向q p=q;//进行循环替代,p重新成为链表的最后一个元素 }p->next=(*L)->next;//循环结束,进行首尾相连,空出头结点 (*L)->next->prior=p;return OK;}void Cassar(DuLinkList *L,int i)//定义字符串改变函数 {if(i>0)//进行头结点转换,因为是循环链表,所以可以赋数比较大的值 {do{(*L)=(*L)->next;}while(--i);}if(i<0){do{(*L)=(*L)->next;}while(++i);}}int main(){DuLinkList L;int i;while(1){InitList(&L);printf("请输入一个整数(输入0结束):");scanf("%d",&i);if(i==0)break; printf("\n");Cassar(&L,i);for(i=0;i<26;i++)//进行输出 {L=L->next;printf("%c",L->data);}printf("\n\n"); }}


原创粉丝点击