在我的作业中,我必须编写一个函数,该函数将指向“LNode”结构的指针和整数参数作为参数。然后,我不仅要将该整数添加到链表中,还要放置它,以便列表按正确的升序排列。我已经尝试了几种不同的尝试,这是我发布时的代码。
LNode* AddItem(LNode *headPtr, int newItem)
{
auto LNode *ptr = headPtr;
ptr = malloc(sizeof(LNode));
if (headPtr == NULL)
{
ptr->value = newItem;
ptr->next = headPtr;
return ptr;
}
else
{
while (headPtr->value > newItem || ptr->next != NULL)
{
printf("While\n"); // This is simply to let me know how many times the loop runs
headPtr = headPtr->next;
}
ptr->value = newItem;
ptr->next = headPtr;
return ptr;
}
} // end of "AddItem"
当我运行它并尝试插入 5 然后插入 3 时,5 被插入,但是 while 循环运行一次,我得到一个段错误。
此外,我无法更改参数,因为它是该项目骨架代码的一部分。感谢任何能提供帮助的人。
如果它有帮助,这就是结构的样子
typedef struct LNode
{
int value;
struct LNode *next;
} LNode;
最佳答案
在你的循环中
while (headPtr->value > newItem || ptr->next != NULL)
{
printf("While\n"); // This is simply to let me know how many times the loop runs
headPtr = headPtr->next;
您检查未初始化的
ptr->next
是否是(不是) NULL
。这是不明智的,如果 ptr
的那部分中的位模式可能不是 NULL
指针的位模式,则可能会造成严重破坏,因为您在条件中有一个 ||
,那么循环条件始终为真,并且您跑完了列表。||
无论如何都是错误的,你需要一个 &&
,两个条件都必须成立,有些东西不是 NULL
并且值之间的关系必须成立。并且,由于您希望列表按升序排列,因此您必须在列表中的值小于要插入的值时遍历列表。
但是您必须在指向的值变得与新值一样大或大于新值之前停止,因为您必须修改节点的
next
指针,然后才能插入新值。if (headPtr->value >= newItem) {
ptr->value = newItem;
ptr->next = headPtr;
return ptr;
}
while(headPtr->next != NULL && headPtr->next->value < newItem) {
headPtr = headPtr->next;
}
// Now headPtr is the node behind which the new item is to be inserted
ptr->value = newItem;
ptr->next = headPtr->next;
headPtr->next = ptr;
return ??
但是你会返回什么指针呢?如果新 Item 是列表中的第一个,则返回指向第一个节点的指针。如果您还想在稍后插入新项目时这样做,则需要保留(副本)原始
headPtr
并返回该代码。关于c - 在 C 中添加和排序链表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10050336/