【问题标题】:Insert an element in the middle of a linked list, in a ordered way?以有序的方式在链表的中间插入一个元素?
【发布时间】:2014-03-10 20:57:21
【问题描述】:

我得到了我的链表:

typedef struct t_node {
    ELEMLIST data;
    struct t_node *next;
} NODE;

typedef NODE *LIST;

我尝试以有序的方式插入整数(从小到大),但似乎有些东西不起作用:

STATUS insertInOrderList(LIST *list, const ELEMLIST *pElem) {

    NODE *newNode, *nodeIns;

    newNode = getNode();//allocate memory
    nodeIns = getNode();

   //checkout getnode return

    newNode->data = *pElem;

    for (nodeIns = *list; nodeIns != NULL; nodeIns = nodeIns->next) {
        if (cmpEleList(&newNode->data, &nodeIns->data) != 1) { 
             //if arg1 is not > arg2 it breaks the loop
            break;
        }
    }

    newNode->next = nodeIns;
    nodeIns->next = newNode;

    return OK;
}

当我运行它时,它只是告诉我我的列表是空的......

我确定这只是我错过了一些细节,但我就是不知道是什么

【问题讨论】:

  • nodoInsnodeIns ?
  • 不相关:对于这个世界上所有美好的事物(而且并不多),不要在 typedef 中隐藏指针,除非 (a) 您正在编写一个 API 并抽象出一个“句柄”类型,或者 (b) 你正在声明一个函数指针类型。我是 C。拥抱星号,对他们耳语甜言蜜语。他们应该坐在前排。
  • 已编辑,反正不是问题
  • 哦,我知道不是。但它让您要求的人对此进行审查。不用担心,只是一个(强烈的)建议。反正。你做错事的第一个提示是双重getNode()。您正在插入一个节点,所以这本身就是一个很大的危险信号。

标签: c linked-list malloc


【解决方案1】:

你的代码做错了几件事:

  • 您正在分配两个节点;不是一个(这不是 Java 或 C#)。
  • 您没有考虑到列表中的 first 节点可能已经“大于”传入节点的可能性。
  • 您没有正确连接新节点。

我完全不知道您的比较功能是如何工作的。代码似乎表明它返回 1 只要列表的第一个值“小于”第二个值(这与大多数比较器的工作方式完全相反。大多数这样做:

  • lhs
  • lhs == rhs : 返回 0
  • lhs > rhs : 返回 > 0

尽管如此,我还是改进了你的算法。

STATUS insertInOrderList(LIST *list, const ELEMLIST *pElem) 
{

    NODE *newNode = getNode();
    newNode->data = *pElem;

    while (*list && cmpEleList(&(*list)->data, pElem) != 1)
        list = &(*list)->next;

    newNode->next = *list;
    *list = newNode; 

    return OK;
}

这假设如果列表为空*list 将为 NULL,并且分配成功。随心所欲定制。祝你好运。

【讨论】:

  • 谢谢,反正完全是这样工作的......我真的不明白你在这种情况下做了什么......你增加了列表指针?
  • @user3027143 抱歉。刚看到你的问题。请记住,您的list 变量是一个pointer-to-pointer。条件检查以查看 (a) 所指向的指针是否非空,如果是,则驱动到该指针指向的节点的数据成员,并将其与pElem 进行比较。只要两者都为真,(有一个非空节点指针,并且它引用的数据是“小于”参数),用当前节点的next 成员的地址加载list。基本上,它使用实际的指针,而不仅仅是它们的值,来遍历列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多