我正在开发一个节点列表,可以在其中添加诸如添加到前端或前端以及从前端或后端删除之类的操作,但是我也希望能够制作一个订单列表。所以我有一个方法/函数,其中我命名为add_inorder。

到目前为止,这就是我所拥有的

// the struct:
typedef struct node
{
  int id;
  char* name;
  struct node* next;
} node;

void add_inorder(node** head, node* new_node) {
  node* previous = *head;

  if (!*head) {
    *head = new_node;
  }

  else if (strcmp((*head)->name, new_node->name) > 0) {
    new_node->next = *head;
    *head = new_node;
  }

  else {
    node* it = (*head)->next;
    while (it) {
      if (strcmp(it->name, new_node->name) > 0) {
        new_node->next = it;
        previous->next = new_node;
        break;
      }

      previous = it;
      it = it->next;
      if (previous->next == NULL) {
        previous->next = new_node;
        break;
      }
    }
  }
}


屏幕转储:

General stuff ...
--------------------------------------------------
Memory used to date : 0
node size : 24
List length now is : 0
Memory used to date : 0
Print List :

--------------------------------------------------

Add Inorder / Remove Inorder ...
--------------------------------------------------
Adding node : {0, Jill}
List length now is : 1
Memory used to date : 29
Print List :
{0, Jill}

Adding node : {1, Jane}
List length now is : 2
Memory used to date : 58
Print List :
{1, Jane}
{0, Jill}

Adding node : {2, Jeff}
List length now is : 3
Memory used to date : 87
Print List :
{1, Jane}
{2, Jeff}
{0, Jill}

Adding node : {3, Jz}
List length now is : 4
Memory used to date : 114
Print List :
{1, Jane}
{2, Jeff}
{0, Jill}
{3, Jz}


编辑:现在的问题是,我认为我的代码有点bug,当我稍作休息时可以正常工作,您如何建议我修复它?

最佳答案

考虑递归调用add_inorder(),这样您将为列表中的每个节点重用if()else if()分支。

如果这些检查失败,请重试下一个节点:

else
{
    add_inorder(&previous->next, new_node);
}


缺点是,它会根据列表的大小使用更多的堆栈内存。

关于c - 如何在结构名称上使用strcmp将节点添加到列表中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46963077/

10-16 19:33
查看更多