小甲鱼双向循环链表实践---错误更正

看了一集小甲鱼的数据结构,讲的双向循环链表,总感觉代码不对劲,后来去论坛看到有人也提出质疑。百度了一下,网上有源码,copy完一运行,果断不对啊,不管输入正负,输出结果都是正数的预期输出结果,也就是输入3和-3是一样的。错误的源码如下


#include   
#define      OK              1  
#define      ERROR           0  
typedef char ElemType;  
typedef int  Status;  
typedef struct DualNode  
{  
    ElemType data;  
    DualNode *prior;  
    DualNode *next;  
} DualNode, *DuLinkList;  
  
Status InitList(DuLinkList *L)  
{  
    DualNode *p, *q;  
    *L = new DualNode;  
    p = *L;  
    if(*L == NULL)  
        return ERROR;  
    (*L)->next = (*L)->prior = NULL;  
    for(int i = 'A'; i <= 'Z'; i++)  
    {  
        q = new DualNode;  
        if(q == NULL)  
            return ERROR;  
        q->data = i;  
        p->next = q;  
        q->prior = 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 );  
    }  
    else if( i < 0 )  
    {  
        do  
        {  
            (*L) = (*L)->next;  
        }while( ++i );  
    }  
}  
int main ()  
{  
    DuLinkList L;  
    int i, n;  
    InitList(&L);  
    std::cout<< "请输入一个整数 :\n";  
    std::cin>> n;  
    Caesar(&L, n);  
    for(i = 0; i < 26; i++)  
    {  
        L = L->next;  
        std::cout<< L->data<< " ";  
    }  
    return 0;  
} 

what the F!怎么只能在代码里写,跳不出去了,自己太菜了,还没学会怎么写博客,就这样写吧。
然后我发现是在初始化时候出现的错误,没有进行每个节点的prior的设置。而且Caesar()函数中也有错。改正后如下:
#include   
#define      OK              1  
#define      ERROR           0  
typedef char ElemType;
typedef int  Status;
typedef struct DualNode
{
	ElemType data;
	DualNode *prior;
	DualNode *next;
} DualNode, *DuLinkList;

Status InitList(DuLinkList *L)
{
	DualNode *p, *q;
	*L = new DualNode;
	p = *L;
	if (*L == NULL)
		return ERROR;
	(*L)->next = (*L)->prior = NULL;
	for (int i = 'A'; i <= 'Z'; i++)
	{
		q = new DualNode;
		if (q == NULL)
			return ERROR;
		q->data = i;
		p->next = q;
		q->prior = p;
		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);
	}
	else if (i < 0)
	{
		i -= 1;
		(*L)->prior = (*L)->next->prior;
		do
		{
			(*L) = (*L)->prior;
		} while (++i);
	}
}
int main()
{
	DuLinkList L;
	int i, n;
	InitList(&L);
	std::cout << "请输入一个整数 :\n";
	std::cin >> n;
	Caesar(&L, n);
	for (i = 0; i < 26; i++)
	{
		L = L->next;
		std::cout << L->data << " ";
	}
	return 0;
}

这样就好了,虽然改的不太雅观。
 
 

你可能感兴趣的:(小甲鱼双向循环链表实践---错误更正)