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

时间:2016-04-04 23:02:12

标签: c linked-list user-input

我有一个C语言初学者类的作业:我应该创建一个结构,它有一个变量(命名值)和一个指向列表的指针。我应该提示用户输入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时。我的假设是我将错误的值存储在列表中 - 因为我不知道它是如何实际完成的。 (无法在我的教科书或在线上找到任何信息。)昨晚有人评论了一个不同的问题,我不得不尝试使用断点来找出问题的确切位置 - 我一直试图弄明白从那时起,但不知道该怎么做。 (我假设它非常简单 - 但无论我在网上看到什么,人们都会以一种似乎我应该知道他们在谈论什么的方式来解释它 - 我不要 - 老实说,即使我能搞清楚,我仍然不知道如何处理这些信息,因为我无法找到有关如何将用户输入存储到链接列表。)无论如何,所以我的试用程序符合并运行,但最终值为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;
}

提前谢谢!而且我真的是一个初学者 - 所以即使你提出一些超级简单的东西 - 我可能也不知道它是什么......所以请解释一下!谢谢!

2 个答案:

答案 0 :(得分:1)

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

虽然他们没有直接解决你的问题,但还有一些额外的建议:

  • 始终检查功能返回值。具体来说,检查scanf以确保解析了预期的输入。如果用户输入意外的内容,代码将失败。
  • 将代码分解为函数。具体来说,创建一个单独的insert函数来将项目添加到链接列表中。
  • 使用需要重复代码的循环。例如scanf次呼叫。这样,当您想要获得更多输入时,它可以轻松扩展。

答案 1 :(得分:0)

尝试使用警告等进行编译。至少我使用此...

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