关于双链表的定义,急

typedef struct shuanglianbiao
{
    struct shuanglianbiao* qian;
    int a;
    struct shuanglianbiao* next;
}ss;
ss* end, * head;
ss* creat(int n)
{
    ss * node;
    head = (ss*)malloc(sizeof(ss));
    end = head;
    end->qian = NULL;
    for (; n > 0; n--)
    {
        node = (ss*)malloc(sizeof(ss));
        scanf("%d", &node->a);
        end->next = node;
        node->qian = end;
        end = end->next ;
    }
    end->next = NULL;
    return head;
}

 

以上是我看网上的的创建双链表,应该是对的;我的问题主要是从for那里开始;

以下是我的码,求好心人帮我看看;

typedef struct shuanglianbiao
{
    struct shuanglianbiao* qian;
    int a;
    struct shuanglianbiao* next;
}ss;
ss* end, * head;
ss* creat(int n)
{
    ss * node;
    head = (ss*)malloc(sizeof(ss));
    end = head;
    end->qian = NULL;
    for (; n > 0; n--)
    {
        node = (ss*)malloc(sizeof(ss));
        scanf("%d", &node->a);
        end->next = node;
        node->qian = end->qian;
        end = node ;
    }
    end->next = NULL;
    return head;
}

 

在这部分源码下,当我使用 end->qian->n时,visual提醒我end->qian是个空指针,,求大神帮我从for开始看看我的创建错在哪

你的next指针没有问题,你的问题是你的qian指针。

你的头结点的qian是NULL,next是第一个首元素节点,但是你的首元素节点的qian指向了头结点qian的NULL

然后,你的end尾指针等于你的第一个节点,这也没错。

当你申请第二个元素节点时,你的end->next还是没有问题,但是你的node的qian却指向了end->qian即头结点head。

也就是说,你的所有next指针都没有问题,但是你的申请的元素节点的qian指针永远指向的是在你之前的第二个节点。

当你使用end->qian的时候,如果此时你的节点到了头结点后的第一个首元素节点,那么你的end->qian的实际上指向了空,所以没有end->qian->a这个变量。你直接只创一个首元素节点实验一下,系统就会给你报错了。

正确的for循环体应该是第一个程序那样写的,重在理解,理解不了就画图看看

虽然你赋值了,node->qian = end->qian;但是这里的end->qian也是空的啊。

 

猫叔压力大:如果解决了你的疑惑,麻烦点个采纳呗。

我的那个码,所有qian指针全都是指向了head->qian所指向的 NULL;把我的码 node->qian=end->qian; 改成node->qian=end;就可以。在链表中内部结点的的前后指针一定要指向 前后区域 ,而不是前后区域的指针;多谢两位大神!!