C语言 按顺序在链表的中间插入一个元素



我得到了我的链表:

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;
}

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

我肯定是漏掉了一些细节,但我就是不知道

你的代码做错了几件事:

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

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

  • lh & lt;RHS: return <0
  • lhs == rhs:返回0
  • lhs> rhs: return> 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,并且分配成功。根据你的意愿量身定做。祝你好运。

相关内容

  • 没有找到相关文章

最新更新