数据结构与算法 双循环链表的一个小问题
小甲鱼 数据结构与算法 第22讲 的 一个程序输入一个数例如 3
则输出为 DEFGHIJKLMNOPQRSTUVWXYZABC
-3
则输出为 XYZABCDEFGHIJKLMNOPQRSTUVW
我的程序写出来输入正数 能得正确结果, 输入负数 程序崩溃 求解{:1_1:}
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedefcharElemType;
typedef struct DualNode
{
ElemType data ;
struct DualNode *prior ;
struct DualNode *next ;
}DualNode , *DuLinkList;
Status InitList ( DuLinkList*L )
{
DualNode *p , *q ;
inti;
(*L) = (DuLinkList )malloc(sizeof(DualNode));
if ( !(*L) )
{
return ERROR;
}
(*L)->next = (*L)->prior = NULL ;
p = (*L);
for ( i = 0 ; i < 26 ; i++ )
{
q = (DuLinkList)malloc (sizeof (DualNode));
if ( !q )
{
return ERROR;
}
q->data = 'A' + i ;
q->prior = p ;
q->next= p->next ;
p->next = q ;
p = q ;
}
p->next = (*L)->next ;
(*L)->next->prior = p;
}
void Caesar ( DuLinkList *L , inti )
{
if ( i > 0 )
{
do
{
(*L) = (*L)->next ;
}while ( --i );
}
if ( i < 0 )
{
do
{
(*L) = (*L)->prior;
}while ( ++i );
}
}
int main()
{
DuLinkListL;
inti ;
intn ;
InitList(&L);
printf("请输入一个整数:");
scanf("%d", &n);
printf("\n");
Caesar(&L,n);
for ( i = 0 ; i < 26 ; i++ )
{
L = L->next ;
printf("%c" , L->data);
}
return 0;
}
沙发我来坐 黑暗漩涡 发表于 2014-8-16 11:27
沙发我来坐
:sweat: main函数中Caesar(&L,n);换成Caesar(&L->next,n);试一下
zhanglin_0129 发表于 2014-8-21 21:39
main函数中Caesar(&L,n);换成Caesar(&L->next,n);试一下
还是不行:cry 本帖最后由 karelyoona 于 2014-9-22 22:53 编辑
if ( i < 0 )
{
do
{
(*L) = (*L)->prior;
}while ( ++i );
}
你写的这一部分中的(*L) = (*L)->prior;(*L)指向的是你创建的双向循环链表的头节点,它没有前驱结点。你创建的循环链表的最后一个节点的后继指针指向的是第一个节点,并不是头节点,而第一个节点的前驱指针指向的是最后一个节点,可以这样改:
if(i < 0){
(*L) = (*L)->next;
do{
(*L) = (*L)->prior;
}while(i++);
} 非常 感谢{:1_1:} karelyoona 发表于 2014-9-22 22:52
if ( i < 0 )
{
do
稳
页:
[1]