将用户输入存储到链表中 - 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
我有一个 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