C 以有序的方式在链表中间插入一个元素?

C 以有序的方式在链表中间插入一个元素?,c,linked-list,malloc,C,Linked List,Malloc,我得到了我的链接列表: typedef struct t_node { ELEMLIST data; struct t_node *next; } NODE; typedef NODE *LIST; 我尝试按顺序插入整数(从较小的数字到较大的数字),但似乎有些东西不起作用: STATUS insertInOrderList(LIST *list, const ELEMLIST *pElem) { NODE *newNode, *nodeIns; newNo

我得到了我的链接列表:

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(这与大多数比较器的工作方式正好相反。大多数比较器是这样做的:

  • 左侧<右侧:返回<0
  • lhs==rhs:返回0
  • 左侧>右侧:返回>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;
}

如果列表为空,则假定列表将为空,并且分配成功。根据您的意愿进行定制。祝您好运。

nodoIns
nodeIns
?不相关:对于这个世界上所有的好处(而且不多),请不要在typedefs中隐藏指针,除非(a)你在写一个API,抽象出一个“句柄”类型,或者(b)你在声明一个函数指针类型。这是C。拥抱星号,对他们说些甜言蜜语。他们应该坐在前排。编辑,不管怎样,这不是问题哦,我知道不是。但这让你要求审查的人很难受。不用担心,只是一个问题(强)建议。不管怎样。第一个提示是double
getNode()
。您正在插入一个节点,因此这本身就是一个很大的危险信号。谢谢,无论如何,完全是这样工作的……我真的不知道您在这种情况下做了什么……您增加了列表指针?@user3027143抱歉。刚才看到了您的问题。记住,
列表
变量是指向指针的指针。要查看的条件检查如果(a)所指向的指针是非空的,如果是,则驱动该指针指向的节点的数据成员,并将其与
pElem
进行比较。只要两者都为真,(存在非空的节点指针,并且它引用的数据“小于”参数),使用当前节点的
下一个
成员的地址加载
列表
。基本上,它使用实际指针,而不仅仅是指针的值来遍历列表。