青衫0425 发表于 2016-8-4 12:10:04

关于课时22双向链表的问题

#include<stdio.h>
#include<stdlib.h>

#define OK    1
#define ERROR 0

typedef int status;

typedef char QQQ;

typedef struct Node
{
        QQQ data;
        struct Node *prior;
        struct Node *next;
}pNode,*linklist;

status initlist(linklist *L)
{
        pNode *p,*q;
       
        int i;
       
        *L=(linklist)malloc(sizeof(pNode));
        if(!(*L))
        {
                return ERROR;
        }
       
        (*L)->next=(*L)->prior=NULL;
        p=(*L);
        for(i=0;i<26;i++)
        {
                q=(linklist)malloc(sizeof(pNode));
                if(!(*L))
        {
                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;
       
        return OK;
}
void Caeser(linklist *L,int i)
{
        if(i>0)
        {
                do{
                        (*L)=(*L)->next;
                }while(--i);
        }
        if(i<0)
        {
                do{
                        (*L)=(*L)->next;
                }while(++i);
        }       
}

int main()
{
        linklist L;
        int i,n;
        initlist(&L);
        printf("请输入正数n:\n");
       scanf("%d",&n);
       printf("\n");
        Caeser(&L,n);
        for(i=0;i<26;i++)
        {
                  L=L->next;
                  printf("%c",L->data);       
       }
       return 0;
}

青衫0425 发表于 2016-8-4 12:11:12

    if(i>0)
      {
                do{
                        (*L)=(*L)->next;
                }while(--i);
      }
      if(i<0)
      {
                do{
                        (*L)=(*L)->next;
                }while(++i);
      }      

这一块小甲鱼课堂上的代码两个最后执行结果是一样的。请问怎么能更改

lx_Zz 发表于 2016-8-4 18:22:26

http://blog.csdn.net/u014488381/article/details/41280233
楼主想表达的是这个意思吧、创建链表和负数处理都出了问题、看这个博客吧、

zuoqi2020 发表于 2017-6-21 09:45:54

{:10_257:}

叫我ace 发表于 2017-7-9 17:05:39

        if(i<0)
        {
                *L = (*L)->next->piror;
                while (i)
                {
                        *L = (*L)->piror;
                        i++;
                }
        }

cagescott 发表于 2018-5-15 23:17:56

叫我ace 发表于 2017-7-9 17:05
if(inext->piror;
                while (i)
                {


鱼油你好,我也被这个问题困扰了好久,后来仔细阅读代码发现
初始化(*L)指针时其前驱后继都指向NULL,
初始化完毕后(*L)的前驱仍指向NULL,所以编译器会报错,
做法:将指针(*L)指向下一个进入循环,那么(*L)本身不参与循环也就没有空指针了
页: [1]
查看完整版本: 关于课时22双向链表的问题