我必须从命令行输入的参数创建一个链表。您应该输入整数并从中创建链接列表。输入-1时,请从命令行停止读取。相当简单,但我遇到了一些麻烦。我所拥有的是:
#include <stdlib.h>
struct node
{
int grade;
struct node *next;
};
int
main (int argc, char *argv[])
{
struct node *root;
root = (struct node *) malloc (sizeof (struct node));
root->next = 0;
root->grade = 0;
int i;
for (i = 0; i < argc; i++)
{
if (&argv[i] == -1)
{
break;
}
else
{
struct node *new_item_ptr;
new_item_ptr = malloc (sizeof (struct node));
new_item_ptr->grade = (*int) argv[i];
(*new_item_ptr).next = root;
root = new_item_ptr;
}
}
}
我认为我非常接近,但有些事情无法正常运作。例如,我不认为for(i = 0; i < argc; i++)
是正确的。编译器说new_item_ptr->grade = (*int) argv[i];
也是错误的。任何人都可以帮我解决这个问题吗?我想我很接近只是有一些小错误。
答案 0 :(得分:2)
各种argv[i]
是C字符串(char *)而不是整数。您需要将它们转换为整数,最好的方法是使用atoi
函数:
int value = atoi(argv[i]);
if (value == -1) {
break;
} else {
// etc.
}
函数名atoi
应该是“ASCII到整数”的助记符。您用于分配next
new_item_ptr
字段的语法比它需要的语法要复杂一些。您可以使用箭头语法分配next
字段,就像分配grade
字段一样。这部分看起来应该是:
new_item_ptr->grade = atoi(argv[i]);
new_item_ptr->next = root;
或者,更好的是,重复使用for循环此迭代顶部创建的value
变量,而不是再次运行atoi
:
new_item_ptr->grade = value;
new_item_ptr->next = root;
答案 1 :(得分:2)
首先,您malloc
了一个完全没必要的结构。如果用户未输入任何数据,您可以返回root = NULL
指示的空列表。所以,最初的部分可能是:
root = ( struct node * ) NULL;
if ( argc < 2 )
return ( 0 );
正如您的代码所代表的那样,root->grade
的第一个节点始终为0。在循环中,您应该分配内存并使用argv[i]
将atoi
转换为整数。最后,你的循环应该以{{1}}开头,因为i=1
本身就是命令名。