b-> next-> next在链表中给出错误

时间:2017-03-12 17:33:06

标签: c data-structures linked-list

这两行给出了错误 - 解除引用不兼容类型的指针。

while(b->next!=NULL ||b->next->next!=NULL)

b=b->next->next;

完整代码

typedef struct NODE
{
    int data;
    struct node *next;
}node;

void middle(node **head)
{
    struct NODE *a = *head;
    struct NODE *b = *head;

    if(*head==NULL)
    {
        printf("List Empty\n");
        return;
    }
    while(b->next!=NULL ||b->next->next!=NULL)
    {
        a=a->next;
        b=b->next->next;
    }
    printf("MID = %d\n", a->data);
}


 void find_len(node *head, int n)
{
    node *temp = head;
    if(temp==NULL)
    {
        printf("Length = %d\n", n);
        return;
    }
    else
        find_len(temp->next, ++n);
}

函数调用main()

middle(&head);

2 个答案:

答案 0 :(得分:1)

struct NODE的声明中,对struct node的引用未定义。写得像这样:

typedef struct NODE {
    int data;
    struct NODE *next;
} node;

此循环条件不正确:

while (b->next!=NULL || b->next->next!=NULL)

当两个术语都不为空时,你只想推进循环:

while (b->next != NULL && b->next->next != NULL)

最后, *head==NULL条件永远不会成立。 这是因为你没有指向NULL的指针。 因此,如果是空列表,head本身将为NULL。 所以你需要稍微改写函数的开头, 小心避免空指针取消引用,例如:

node *a, *b;

if (head == NULL)
{
    puts("List Empty");
    return;
}

a = b = *head;

我还将printf更改为puts。 如果您不需要格式化字符串, 并且只想打印一个尾随换行符,puts更简单。

答案 1 :(得分:0)

除了类型问题,您还要使用||。这意味着当第一个条件为假时它不会短路。换句话说,即使b->next等于null,执行仍将继续并评估b->next->next,如果b->next已经为NULL,这将明显导致错误。

如果你改变你的||到和&&,它会短路。