我得到了我的链表:
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,并且分配成功。根据你的意愿量身定做。祝你好运。