从命令行参数创建链接列表

时间:2014-03-02 19:04:22

标签: c pointers linked-list command-line-arguments

我必须从命令行输入的参数创建一个链表。您应该输入整数并从中创建链接列表。输入-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];也是错误的。任何人都可以帮我解决这个问题吗?我想我很接近只是有一些小错误。

2 个答案:

答案 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本身就是命令名。