简体   繁体   中英

error in linked list in C

The program takes input before asking for it. The problem starts after we input the value for first node.

This is a simple program which takes input from user and stores it in a linked list and then displays the data stored.

在此处输入图片说明

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

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

void main()
{      
    struct NODE  *first,*old,*new_node;
    int n,i;
    printf ("Enter number of elements: \n");
    scanf ("%d",&n);
    first=(struct NODE*)malloc(sizeof(struct NODE));
    first->next= NULL;

    printf ("Enter value of node 1: \n");
    scanf ("%d\n",&first->data);
    old = first;
    for(i=2;i<=n;i++)
    {
        new_node=(struct NODE*)malloc(sizeof(struct NODE));
        new_node->next= NULL;

        printf("Enter value of node %d: \n",i);
        scanf("%d\n",&new_node->data);
        old->next=new_node;
        old = new_node;
    }

    old=first;
    while(old!= NULL)
    {
        printf("%d \t",old->data);
        old=old->next;
    }
}

The problem is the \\n in your scanf format specification , which contains (with my emphasis):

There are rarely constants (ie characters that are not formatting placeholders) in a format string, mainly because a program is usually not designed to read known data. The exception is one or more whitespace characters, which discards all whitespace characters in the input.

So your \\n means that the new-line that you input after each number is ignored, and the next scanf() doesn't complete until you have typed another new-line (you correctly omit it from the first node count input).

All you need to do is to remove the \\n from the format strings and your code will work as you expect:

    ...
    scanf ("%d\n",&first->data);
    ...
    scanf("%d\n",&new_node->data);
    ...

Note that you can input on the same line as the prompt by omitting the \\n from the printf() format strings and calling fflush(stdout) before calling scanf() , eg:

    printf ("Enter number of elements: "); 
    fflush(stdout);
    scanf ("%d",&n);

This will give you a more natural dialogue.

you can peroform all linked list operations like this

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

struct Node{
    struct Node *next;
    int data;

};

void printList(struct Node *n)
{
  while (n != NULL)
  {
     printf(" %d ", n->data);
     n = n->next;
  }
}

void insertFirst( struct Node *start,int data1)
 {
        struct Node *n=(struct Node*)malloc(sizeof(struct Node));
        n->data=data1;
        n->next=start->next;
        start->next=n;
 }

void insertLast( struct Node *start,int data1)
 {
    struct Node *last,*previous;
    last=start->next;
    while(last!=NULL)
    {
        previous=last;
        last=last->next;    
     }
        struct Node *n=(struct Node*)malloc(sizeof(struct Node));
        n->data=data1;
        n->next=NULL;
        previous->next=n;
 }

void insertPosition(struct Node *start, int pos, int data1)
{
    int count=0;
    struct Node *node;
    node=start->next;
    while(node!=NULL)
    {
        count++;
        node=node->next;
    }
    printf("total elements before insertion is %d\n ",count);

    if(count+1<pos)
    printf("cannot insert at desired position ");
    else
    {
     int i=1;
     node=start;
        while(i<pos)
        {
            node=node->next;
            i++;
        }

      struct Node *n=(struct Node*)malloc(sizeof(struct Node));
      n->data=data1;
      n->next=node->next;
      node->next=n;
}
}

void deleteFirst(struct Node *start)
{
    struct Node *firstNode;
    firstNode= start->next;
    start->next=firstNode->next;
    free(firstNode);
    printf("first node is removed\n");
}

void deleteLast(struct Node *start)
{
    struct Node *last,*previous;
    last=start;
    while(last->next!=NULL)
    {
        previous=last;
        last=last->next;    

     }
        previous->next=NULL;

    free(last);
    printf("last node is removed\n");
}     

void deletePosition(struct Node *start, int pos)
{
    int count=0;
    struct Node *node;
    struct Node *previous;
    node=start->next;
    while(node!=NULL)
    {
        count++;
        node=node->next;
    }
    printf("total elements before deletion is %d\n ",count);

    if(count<pos)
    printf("cannot delete the desired position ");
    else
    {
     int i=1;
     node=start->next;
        while(i<pos)
        {
            previous=node;
            node=node->next;
            i++;
        }

      previous->next=node->next;
      free(node);
        printf("node is removed\n");

}
}

int main()
{
    struct Node *start=NULL;
    struct Node *node1=NULL;
    struct Node *node2=NULL;
    struct Node *node3=NULL;
    struct Node *node=NULL;

    start=(struct Node*)malloc(sizeof(struct Node));    
    node1=(struct Node*)malloc(sizeof(struct Node));
    node2=(struct Node*)malloc(sizeof(struct Node));
    node3=(struct Node*)malloc(sizeof(struct Node));


    start->next=node1;
    node1->data=1;
    node1->next=node2;

     node2->data=2;
    node2->next=node3;

     node3->data=3;
    node3->next=NULL;
    printf("\nsize %d\n",sizeof(struct Node));


    //insertFirst(start,10);
    //insertLast(start,200);
   // insertPosition(start,2,300);

    // deleteFirst(start);
  //  deleteLast(start);
  //deletePosition(start,2);
     printList(start->next);
}

comments can be removed to perform that operation.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM