【问题标题】:Linked list remove and return first element链表删除并返回第一个元素
【发布时间】:2013-01-16 09:34:10
【问题描述】:

我正在尝试使用 C 解析 shell 脚本中的命令。我目前已经设置了链接列表,但是我无法正确删除和返回第一个元素。当我尝试获取第一个元素时,它一次可以正常工作,但之后它卡住并进入无限循环,我不明白为什么。提前感谢您的帮助。这是我的代码:

     enum command_type
       {
         AND_COMMAND,         // A && B
         SEQUENCE_COMMAND,    // A ; B
         OR_COMMAND,          // A || B
         PIPE_COMMAND,        // A | B
         SIMPLE_COMMAND,      // a simple command
         SUBSHELL_COMMAND,    // ( A )
       };

     // Data associated with a command.
     struct command
     {
       enum command_type type;

       // Exit status, or -1 if not known (e.g., because it has not exited yet).
       int status;

       // I/O redirections, or null if none.
       char *input;
       char *output;

       union
       {
         // for AND_COMMAND, SEQUENCE_COMMAND, OR_COMMAND, PIPE_COMMAND:
                  struct command *command[2];

         // for SIMPLE_COMMAND:
         char **word;

         // for SUBSHELL_COMMAND:
         struct command *subshell_command;
       } u;
     };

     typedef struct command_stream *command_stream_t;
     typedef struct command *command_t;

     struct command_stream
     {
        command_t command_stream;
        command_stream_t next;
     }

     command_t
     read_command_stream(command_stream_t s)
     {
        if(s)
        {
           command_t comm = s->command;
           s=s->next;
           return comm;
        }
        return NULL;
     }

     void printList(command_stream_t head)
     { 
        command_t command;
        while((command = read_command_stream(head)))
        { 
           //print_command is a function that takes in a command_t and then prints the    
           //command in a nice format.
           print_command(head->command);
        }
     }

【问题讨论】:

  • 你有必要重新发明链表吗?否则,我建议链接到提供该容器的library。对我来说,看起来你没有遍历循环中的列表,头部保持不变。
  • 我已经修好了。感谢您的建议。

标签: c list loops linked-list element


【解决方案1】:

在此函数中,您正在修改指针的本地副本(不是您传入的主指针),因此您的head 指针永远不会移动。

 command_t
 read_command_stream(command_stream_t s)
 {
    if(s)
    {
       command_t comm = s->command;
       s=s->next;
       return comm;
    }
    return NULL;
 }

你需要改变这个函数来接受一个pointer-to-pointer,如果你不理解这个概念,我建议一本好书(或教程)可以帮助你入门。

【讨论】:

  • 谢谢。我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多