在链接列表中取消引用指针

时间:2016-12-28 15:42:31

标签: c

我在tail->next=(list)malloc(sizeof(node))收到错误。有人可以告诉我为什么吗?这段代码正在其中一个NPTEL视频中播放,并且运行时没有任何错误。

执行tail->next=(list)malloc(sizeof(node))时有问题吗?

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

main(){
    int choice,dat;

    typedef struct {
        int data;
        struct node* next; //pointer to a node
    }node;

    typedef  node* list;

    list head,tail;

    head=tail=NULL;

    printf("Enter Data? (1/0)\n");
    scanf("%d",&choice);

    if(choice==1)
    {
        printf("Give Data?\n");
        scanf("%d",&dat);
        tail=(list)malloc(sizeof(node));
        tail->data=dat;
        tail->next=NULL;
        head=tail;

        printf("Enter Data? (1/0)\n");
        scanf("%d",&choice);        
    }

    while(choice==1){
        printf("Give Data?\n");
        scanf("%d",&dat);

        tail->next=(list)malloc(sizeof(node));//showing error
        tail->next->data=dat;
        tail->next->next=NULL;
        tail=tail->next;
    }

    tail=head;

    while(tail!=NULL){
        printf("%d",tail->data);
        tail=tail->next;
    }
}

2 个答案:

答案 0 :(得分:1)

为了使代码成功编译,您需要按如下方式声明节点类型。

typedef struct Node{
    int data;
    struct Node* next; //pointer to a node
}node;

这个额外命名背后的原因是由于在以typedef开头的语句结束之前节点未被视为声明。这就是为什么你需要为你的结构命名,以便能够在其中声明一个指向它自己类型的指针。

此外,当您尝试提到的有问题的行时,似乎尾部可能等于NULL:

tail->next=(list)malloc(sizeof(node));//showing error

除非输入的值在第一个if语句为1之前通过scanf读入变量选项,否则当第一个while循环启动时tail将为NULL,并尝试访问(即为了分配已分配空间的地址) tail-&gt; next将等效于取消引用NULL 地址,然后尝试访问 next 字段,从而导致段违规。

答案 1 :(得分:1)

你的问题在这里:

typedef struct {
    int data;
    struct node* next; // <-- problem
} node;

您将struct node声明为与您的(匿名)结构node不同的类型。

您可以通过为匿名结构提供名称node来解决此问题,以便您可以在定义中引用它:

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

现在只有一种名为node的类型。

您的main函数也缺少返回类型。它应该是:

int main() {