我在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;
}
}
答案 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() {