循环链表的问题
链表能正确赋值,但不管输入几,输出的都是从A到Z,求大神解答还有个问题,明明单向循环链表就能解决的问题,小甲鱼为啥用双向
//双向循环链表
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct DualNode
{
char data;
struct DualNode *prior;
struct DualNode *next;
}DualNode,*DuLinkList;
//初始化 把a到z依次赋值
DuLinkList InitList(DuLinkList L)
{
DualNode *p,*q;
int i;
if(!L)
return 0;
L->next=L->prior=NULL;
p=L;
for(i=0;i<26;i++)
{
q=(DuLinkList)malloc(sizeof(DualNode));
if(!q)
return 0;
q->data='A'+i;
q->prior=p;
q->next=NULL;
p->next=q;
p=q;
}
p->next=L->next;
L->next->prior=p;
return L;
}
//算法
DuLinkList Caesar(DuLinkList L,int i)
{
if(i>0)
{
while(i--)
L=L->next;
}
if(i<0)
{
do
{
L=L->prior;
}while(++i);
}
return L;
}
void main()
{
DuLinkList L;
int i,n;
L=(DuLinkList)malloc(sizeof(DualNode));
InitList(L);
printf("请输入一个整数:");
scanf("%d",&n);
Caesar(L,n);
for(i=0;i<26;i++)
{
L=L->next;
printf("%c",L->data);
}
printf("\n");
} 小甲鱼为啥用双向
这红色标题说得 明明白白,双向循环链表实践 //双向循环链表
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct DualNode
{
char data;
struct DualNode *prior;
struct DualNode *next;
}DualNode,*DuLinkList;
//初始化 把a到z依次赋值
DuLinkList InitList(DuLinkList L)
{
DualNode *p,*q;
int i;
if(!L)
return 0;
L->next=L->prior=NULL;
p=L;
for(i=0;i<26;i++)
{
q=(DuLinkList)malloc(sizeof(DualNode));
if(!q)
return 0;
q->data='A'+i;
q->prior=p;
q->next = p->next; //此处
p->next=q;
p=q;
}
p->next=L->next;
L->next->prior=p;
return L;
}
// 双向循环,可前 如:5,可后 如:-5
void Caesar(DuLinkList *L, int i)
{
*L = (*L)->next; // 获取第1个节点的地址
if(i>0)
{
do
{
*L = (*L)->next;
}while(--i);
}
if(i<0)
{
do
{
*L = (*L)->prior;
}while(++i);
}
}
void main()
{
DuLinkList L;
int i,n;
L=(DuLinkList)malloc(sizeof(DualNode));
InitList(L);
printf("请输入一个整数:");
scanf("%d",&n);
Caesar(&L,n);// 后面的 for循环是从 定位好的位置开始的,所以这里要改变头节点的指向,使其指向定位好的位置。
for(i=0;i<26;i++)
{
printf("%c",L->data);
L=L->next;
}
printf("\n");
} 未例2:
//双向循环链表
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct DualNode
{
char data;
struct DualNode *prior;
struct DualNode *next;
}DualNode,*DuLinkList;
//初始化 把a到z依次赋值
DuLinkList InitList(DuLinkList L)
{
DualNode *p,*q;
int i;
if(!L)
return 0;
L->next=L->prior=NULL;
p=L;
for(i=0;i<26;i++)
{
q=(DuLinkList)malloc(sizeof(DualNode));
if(!q)
return 0;
q->data='A'+i;
q->prior=p;
q->next = p->next; //此处
p->next=q;
p=q;
}
p->next=L->next;
L->next->prior=p;
return L;
}
// 双向循环,可前 如:5,可后 如:-5
//算法
DuLinkList Caesar(DuLinkList L,int i)
{
DuLinkList p;
p = L->next;
if(i>0)
{
do
{
p=p->next;
}while(--i);
}
if(i<0)
{
do
{
p=p->prior;
}while(++i);
}
return p;
}
void main()
{
DuLinkList L;
int i,n;
L=(DuLinkList)malloc(sizeof(DualNode));
InitList(L);
printf("请输入一个整数:");
scanf("%d",&n);
L=Caesar(L,n);// 用你的方法,指针函数返回指针,函数内部也要做些修改
for(i=0;i<26;i++)
{
printf("%c",L->data);
L=L->next;
}
printf("\n");
} ba21 发表于 2018-5-16 18:52
算法部分不起作用是为啥 Acan. 发表于 2018-5-16 20:00
算法部分不起作用是为啥
仔细看代码 ba21 发表于 2018-5-16 20:14
仔细看代码
L=Caesar(L,n) 谢大哥 我明白了
页:
[1]