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

时间:2014-03-10 20:57:22

标签: 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;

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

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

我确定这只是我错过的一些细节,但我无法意识到什么

1 个答案:

答案 0 :(得分:0)

您的代码错误地执行了几项操作:

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

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

  • lhs< rhs:return< 0
  • lhs == rhs:return 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,并且分配成功。根据自己的意愿量身定制。祝你好运。