【问题标题】:To assemble command line arguments into a Linked List. Then it is printed, and free()d将命令行参数组装到链接列表中。然后打印出来,然后 free()d
【发布时间】:2019-04-09 10:59:15
【问题描述】:

在字符串链表中保存一个节点。

struct  Node
{
   char*  namePtr_;
   struct Node* nextPtr_;
};

struct Node*  makeList(int  argc,
             char* argv[])
   {
   struct Node* list = NULL;
   struct Node* end = NULL;
   int  i;

创建并返回从 'argv[1]' 到 'argv[argc-1]' 的字符串链表,或者在 'argc'

   for  (i = 1;  i < argc;  i++)
   {
     struct Node * ptrNode;
     ptrNode = (struct Node*)malloc(sizeof(*list));
     ptrNode -> namePtr_ = (char *) malloc(strlen(argv[i])+1);
     strcpy(ptrNode -> namePtr_, argv[i]);
     ptrNode -> nextPtr_ = NULL;

     list = ptrNode;  //I think my problem is here
   }  
   }
  return(list);

}

打印 'list' 中的 'namePtr_ 值。

    void print (const struct Node* list)
    {
      const struct Node* run;
      run = list;
      while(run != NULL){
          printf("%s\n", run->namePtr_);
          run = run -> nextPtr_;  
     }
     }

释放列表的 nextPtr 和 namePtr 以及所有 nextPtr_ 后继者。

  void release (struct Node*    list)
  {
     struct Node* ans = list;
     free(ans);  
  }

创建、打印和释放()一个链表。

        int main(int argc, char*  argv[])
       {     
         struct Node*   list;
         list   = makeList(argc,argv);
         print(list);
         release(list);  
         return(EXIT_SUCCESS);

}

应该输出:

   ./argList hello there
   hello
   there

   ./argList  hello there everyone 
   hello
   there 
   everyone

但我的输出是:

    ./argList hello there 
     there

    ./argList hello there everyone
     everyone

【问题讨论】:

    标签: c linked-list


    【解决方案1】:

    您正在将新的 ptrNode 分配给列表而不是追加

        list = ptrNode;
    

    每次您将新的 ptrNode 分配给列表并且之前的 ptrNode 都会被删除。您需要将新的 ptrNode 附加到列表的末尾并将 end 更新到当前 ptrNode

    for (i = 1; i < argc; i++) { 
      struct Node * ptrNode;
    
      ptrNode = (struct Node*)malloc(sizeof(*list));
    
      ptrNode -> namePtr_ = (char *) malloc(strlen(argv[i])+1);
    
      strcpy(ptrNode -> namePtr_, argv[i]);
    
      ptrNode -> nextPtr_ = NULL;
    
      if(list==NULL){
        list = ptrNode; 
        end = ptrNode;
      }
      else {
       end->nextPtr_= ptrNode;
       end = ptrNode;
      }    
    }
    

    对于释放列表,您的代码只释放列表中的第一个节点,您需要遍历整个列表并释放每个节点

    void release (struct Node*    list)
      {
         struct Node* run;
          run = list;
          while(run != NULL){
              printf("%s\n", run->namePtr_);
              struct Node* temp = run;
              run = run -> nextPtr_;  
              free(temp);
         }
    }
    

    【讨论】:

    • 您好,感谢您的回答。我确实按照您告诉我的内容纠正了我的错误,但它仍然和以前一样。
    • 我试过这个代码。它的工作。您要返回“列表”对吗?
    • 是的,我要返回列表。
    • 您的代码在发布方法中也存在问题。您只释放列表中的第一个节点。您需要遍历整个列表并释放每个节点。检查编辑的帖子
    • @R.. 如果这回答了您的问题,请单击接受按钮
    猜你喜欢
    • 2014-09-23
    • 1970-01-01
    • 2011-05-28
    • 2023-03-14
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多