C中链表中的错误

问题描述 投票:0回答:2

程序在请求之前接受输入。输入第一个节点的值后,问题就开始了。

这是一个简单的程序,它从用户获取输入并将其存储在链表中,然后显示存储的数据。

enter image description here

#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;
    }
}
c linked-list
2个回答
1
投票

问题是你的\n中的scanf format specification,其中包含(强调我的意思):

在格式字符串中很少有常量(即不格式化占位符的字符),主要是因为程序通常不是为读取已知数据而设计的。例外是一个或多个空白字符,它们丢弃输入中的所有空白字符。

所以你的\n意味着在每个数字之后输入的新行被忽略,并且下一个scanf()没有完成,直到你输入另一个新行(你从第一个节点计数输入正确省略它)。

您需要做的就是从格式字符串中删除\n,您的代码将按预期工作:

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

请注意,您可以通过省略\n格式字符串中的printf()并在调用fflush(stdout)之前调用scanf()来输入与提示相同的行,例如:

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

这将为您提供更自然的对话。


0
投票

你可以像这样执行所有链表操作

 #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);
}

可以删除注释以执行该操作。

© www.soinside.com 2019 - 2024. All rights reserved.