将用户输入存储到链表中 - C

Storing user input into linked list - C

我有一个 C 初学者的作业 class:我应该创建一个结构,它有一个变量(命名值)和一个指向列表的指针。我应该提示用户输入 5 个值并将它们存储在链表中。然后打印出清单。我不知道如何将输入存储到列表中。我确实设法编写了一个程序来初始化 5 个值。但我不知道如何接受输入并将其存储到列表中。

这是我初始化值的工作程序:

#include <stdio.h>

struct list
{
    double value;
    struct list *nextVal;
};

int main()
{
    struct list v1 = {10};
    struct list v2 = {17.97};
    struct list v3 = {166};
    struct list v4 = {2};
    struct list v5 = {387.55};
    struct list *first;

    first = &v1;
    v1.nextVal = &v2;
    v2.nextVal = &v3;
    v3.nextVal = &v4;
    v4.nextVal = &v5;
    v5.nextVal = NULL;

    printf("All the values are: %.2f, %.2f, %.2f, %.2f, %.2f.",
    first->value,v1.nextVal->value,v2.nextVal->value,
    v3.nextVal->value,v4.nextVal->value);

    return 0;
}

这是我尝试获取用户输入并将其存储到列表中的程序。 (我只有 2 个值而不是 5 个值,因为在尝试让它工作时使用它更容易。)当我编译这个程序时,我没有得到任何错误。当我 运行 它时,系统会正确提示我输入两个输入值;但是,当程序打印的输出只是为两个值写入 0 时。我的假设是我将值存储到列表中是错误的——因为我不知道它实际上是如何完成的。 (无法在我的教科书或网上找到任何信息。)昨晚有人评论了一个不同的问题,我不得不尝试使用断点来找出问题的确切位置 - 从那以后我一直在努力弄清楚但不要还不知道该怎么做。 (我假设这是非常简单的事情——但无论我在网上看什么,人们都以一种我应该知道他们在说什么的方式解释它——但我不知道——老实说,即使我可以弄清楚,我仍然不知道如何处理这些信息,因为我找不到任何关于如何将用户输入存储到链表中的信息。)无论如何,这是我的试用程序,它符合 运行s 但两个最终值都为 0:

#include <stdio.h>

struct list
{
    double value;
    struct list *nextVal;
};

int main()
{
    double val1,val2;

    printf("Please enter a number: ");
    scanf("%f",&val1);
    printf("Please enter a number: ");
    scanf("%f",&val2);

    struct list v1 = {val1};
    struct list v2 = {val2};
    struct list *first;

    first = &v1;
    v1.nextVal = &v2;
    v2.nextVal = NULL;
    printf("The two values entered are %.2f and %.2f.",
    first->value,v1.nextVal->value);

    return 0;
}

提前致谢!而且我真的是一个初学者——所以即使你提出了一些超级简单的建议——我可能不知道它是什么……所以请解释一下!谢谢!

scanf("%f",&val1);

%f 需要一个 float 变量,但给定的变量是 double%lf 用于 double.

scanf("%lf",&val1);

你的编译器应该已经给了你一个警告,你应该始终注意并解决它们:

warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double *’ [-Wformat=]
 scanf("%f",&val1);

一些额外的建议,虽然它们没有直接解决您的问题:

  • 始终检查函数 return 值。具体来说,检查 scanf 以确保已解析预期的输入。如果用户输入意外的内容,代码将失败。
  • 将您的代码分解为函数。具体来说,制作一个单独的 insert 函数来将项目添加到链表中。
  • 在需要重复代码的地方使用循环。例如 scanf 调用。这样当你想接受更多输入时它可以很容易地扩展。

尝试在警告等情况下进行编译。至少我使用这个...

gcc -Wall -pedantic -std=c11

工作版本

include <stdio.h>

struct list
{
  double value;
  struct list *nextVal;
};

int main()
{
  double val1,val2;

  printf("Please enter a number: ");
  scanf("%lf",&val1);
  printf("Please enter a number: ");
  scanf("%lf",&val2);

  struct list v1 = {val1};
  struct list v2 = {val2};
  struct list *first;

  first = &v1;
  v1.nextVal = &v2;
  v2.nextVal = NULL;
  printf("The two values entered are %.2f and %.2f.",
      first->value,v1.nextVal->value);

  return 0;
}

您正在扫描引号并试图将其分配给双精度。一个好的编译器会给你一个警告..

scanf.c:14:14: warning: format specifies type 'float *' but the argument has type 'double *' [-Wformat]
  scanf("%f",&val1);
         ~~  ^~~~~
         %lf
scanf.c:16:14: warning: format specifies type 'float *' but the argument has type 'double *' [-Wformat]
  scanf("%f",&val2);
         ~~  ^~~~~
         %lf