此函数获取指向列表中“Dummy”项目的指针(第1项)和要添加的struct
类型“节点”......
但它进入了一个无限循环......什么是错的?
void listAdd(Node* dummy, Node tmpNode) {
Node* toAdd = (Node*)malloc(sizeof(Node));
*toAdd = tmpNode;
Node *tmp1,*tmp2;
tmp1 = dummy;
tmp2 = (*dummy).next;
while (tmp1 != NULL){
if ( ((*tmp1).info.id < (*toAdd).info.id && (*tmp2).info.id > (*toAdd).info.id ) || (tmp2==NULL) ) {
(*toAdd).next = (*tmp1).next;
(*tmp1).next = toAdd;
return;
}
tmp1 = (*tmp1).next;
tmp2 = (*tmp2).next;
}
}
答案 0 :(得分:2)
修改强> 我对此有点不知所措(这是一个缓慢的工作日)所以我重写了使用(IMHO)更清晰的变量名称,更少的冗余变量和添加基本错误处理的功能。下面的示例支持插入,而前一个示例假设简单地附加到列表的末尾,这是因为没有正确阅读问题(如果您感到好奇,请参阅编辑)。
void listAdd(Node* currentNode, Node toAdd)
{
Node * newNode = malloc(sizeof(Node));
if(!newNode){
//ERROR HANDLING
}
* newNode = toAdd;
newNode->next = NULL;
while (currentNode)
{
if(!currentNode->next)
//We've got to the end of the list without finding a place to insert the node.
//NULL pointer always evaluates to false in C regardless of the underlying value.
{
currentNode->next = newNode;
return;
}
//Test each member of the list to find out whether to insert or skip.
if((newNode->info.id > currentNode->info.id) && (newNode->info.id <= currentNode->next->info.id) ){
newNode->next = currentNode->next;
currentNode->next = newNode;
return;
}
else currentNode = currentNode->next;
}
}
正如之前的帖子中所提到的那样。取消引用指向结构成员的指针使用相当漂亮的->
表示法,它具有相当好的图像。另请注意,NULL
将始终评估为false,除非您希望发生一些不良事件(最多是一个段错误,最糟糕的是有些接管您的计算机),您需要确保写入正确的内容内存区域,因此您必须始终检查malloc
是否返回!NULL
。
注意:在C中,永远不会转换malloc()
调用的返回值,因为这可以掩盖奇怪和危险的行为。在C ++中,必须转换结果,因此如果您希望程序编译为有效的C和C ++,则需要考虑您将要冒犯谁。有关详细信息,请参阅Do I cast the result of malloc?。