Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs

Dashboard
Notifications
Mark all as read
Q&A

Question regarding an error message in my compiler to do with my code on linked list.

+4
−2

Can anyone help me, I'm currently learning pointers, this is the code I wrote to try and insert a node at the beginning of the list. However at the part where I included the comment of "error at this line" basically my compiler gave me the error of "In function Insert: Node undeclared". Why is it so?

#include<stdlib.h>
#include<stdio.h>
struct Node{
    int data;
    struct Node* next; 
};

struct Node* head;
void Insert(int x){ 
    Node* temp = (Node*)malloc(sizeof(struct Node)); //error at this line
    temp->data  = x; 
  
    temp->next = head;
   
    head = temp;

    if(head != NULL)
            temp->next = head; 

    head = temp;
}
void Print(){
    struct Node* temp = head; 
 
    printf("List is: ");
 
    while(temp != NULL){
        printf("%d", temp->data);
        temp = temp->next;
    }
    printf("\n");
}

int main(){
    head = NULL; //empty list
    printf("How many numbers?\n");
    int n, i;
    scanf("%d", &n);
    for(int i=0; i < n; i++){
        printf("Enter the number\n");
        scanf("%d", &x);
        Insert(x); 
        Print();
    }
}

First edit:

Update: My program runs, lets me enter the amount of numbers I want, as well as the numbers, however it prints out only the latest number I entered. What could possibly be the problem? Thanks.

#include<stdlib.h>
#include<stdio.h>
struct Node{
    int data;
    struct Node* next; 
};

struct Node* head;
void Insert(int x){ 
    struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
    temp->data  = x; 
    temp->next = head;
    head = temp;

    if(head != NULL)
            temp->next = head; 
    head = temp;
    temp->next = NULL;
}

void Print(){
    struct Node* temp = head; 
    printf("List is: ");
 
    while(temp != NULL){
        printf("%d", temp->data);
        temp = temp->next;
    }
    printf("\n");
}

int main(){
    head = NULL; //empty list
    printf("How many numbers?\n");
    int n, i;
    scanf("%d", &n);
    for(int i=0; i < n; i++){
        printf("Enter the number\n");
        scanf("%d", &x);
        Insert(x); 
        Print();
    }
}
Why does this post require moderator attention?
You might want to add some details to your flag.
Why should this post be closed?

1 comment thread

You are attempting to use a data type "Node", but the data type you have defined is a "struct Node"... (4 comments)

1 answer

+3
−0

To use the identifier Node without typing struct Node, you must use a typedef:

typedef struct Node{ // this here is a stuct tag
    int data;
    struct Node* next; // this has to be struct Node, refers to the above tag
}Node; // but from this line and onward we can use Node

typedef and struct tags reside in different namespaces, why we can use the same identifier Node twice for seemingly unrelated purposes. Since a linked list node needs to be self-referring, we have to use the struct tag so the compiler knows what to do until the struct type definition is completed at the final ;

Another equivalent alternative would be a forward declaration:

typedef struct Node Node; // forward declaration inside a typedef

struct Node{ // struct tag to associate this with the above typedef
  int data;
  Node* next; // now the compiler knows what Node is before the struct is complete
};

Note that C++ is different here.

Why does this post require moderator attention?
You might want to add some details to your flag.

1 comment thread

Yeah, it worked, thanks!! BTW the list currently only prints out the latest number I entered instead... (2 comments)

Sign up to answer this question »