gpt4 book ai didi

C:通过检查 2 个值创建有序列表

转载 作者:太空狗 更新时间:2023-10-29 15:05:04 26 4
gpt4 key购买 nike

我是 C 的新手,所以如果您在我的代码中看到一些真正的新手错误,请耐心等待!

作为家庭作业的一部分,我需要创建一个有序列表来存储一些数据。到目前为止,我所做的是创建将代表列表中每个节点的结构(firstNode 是指向列表第一个节点的全局变量):

typedef struct Node {
struct Node *next;
int id;
int value;
}Node;

Node *firstNode = NULL;

之后,我创建了一个函数,通过检查节点的值将新节点插入到列表中。值较小的节点应该在其他节点之前。所以我所做的是:

void addNewNode(int nodeId, int nodeValue) {
Node *newNode = (Node*) malloc(sizeof(Node));
Node *temp, *tempPrev;
newNode->id = nodeId;
newNode->value = nodeValue;

if(firstNode == NULL) {
newNode->next = firstNode;
firstNode = newNode;
}
temp = firstNode;
tempPrev = NULL;
while(temp->value < newNode->value) {
tempPrev = temp;
temp = temp->next;
}
if(tempPrev == NULL) {
newNode->next = firstNode;
firstNode = newNode;
}
else {
tempPrev->next = newNode;
newNode->next = temp;
}
}

上面代码的问题是有时程序会崩溃,但我找不到错误!

此外,我接下来要做的是,如果某些节点具有相同的值,则根据它们的 ID 对它们进行排序(具有较小 ID 的节点排在最前面)。我怎样才能做到这一点?我真的很困惑!

最佳答案

程序崩溃是因为在while循环条件下,你没有检查temp是否等于NULL。换句话说,如果您尝试插入一个新节点,其值大于列表中已有的所有其他节点,则 temp 会到达列表的末尾(因此 temp 等于 NULL),并且您会尝试获取该节点的值!所以解决方法是:

while(temp!=NULL && temp->value>newNode->value)
{
....
}

至于节点的 id,您可以像这样扩展 while 循环条件:

while(temp!=NULL && (temp->value<newNode->value || (temp->value==newNode->value && temp->id<newNode->id))
{
....
}

此外,第一个 if 语句(检查 firstNode 是否为 NULL)在您的情况下不是必需的。如果为NULL,程序将不会进入while循环,直接进入while循环后的第一个if语句。

顺便说一句,对于新手 C 程序员来说,这是一个很好的代码 :-)

关于C:通过检查 2 个值创建有序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2056743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com