简体   繁体   English

C中链表中的错误

[英]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): 问题是您的scanf格式规范中\\n包含(我强调):

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). 因此, \\n表示将忽略在每个数字之后输入的换行符,并且直到键入另一个换行符为止(在第一个节点计数输入中正确省略了它scanf() ,下一个scanf()才会完成。

All you need to do is to remove the \\n from the format strings and your code will work as you expect: 您所需要做的就是从格式字符串中删除\\n ,您的代码将按预期工作:

    ...
    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()格式字符串中省略\\n并在调用scanf()之前调用fflush(stdout)在提示符下输入相同的行,例如:

    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. 可以删除注释以执行该操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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