C:通过检查2个值创建有序列表
我是C语言新手,所以如果你在我的代码中看到一些新手错误,请耐心等待 作为家庭作业的一部分,我需要创建一个有序列表来存储一些数据。到目前为止,我所做的是创建表示列表中每个节点的结构(firstNode是指向列表中第一个节点的全局变量): 之后,我创建了一个函数,通过检查节点的值将一个新节点插入到列表中。值较小的节点应位于其他节点之前。所以我做的是:C:通过检查2个值创建有序列表,c,html-lists,C,Html Lists,我是C语言新手,所以如果你在我的代码中看到一些新手错误,请耐心等待 作为家庭作业的一部分,我需要创建一个有序列表来存储一些数据。到目前为止,我所做的是创建表示列表中每个节点的结构(firstNode是指向列表中第一个节点的全局变量): 之后,我创建了一个函数,通过检查节点的值将一个新节点插入到列表中。值较小的节点应位于其他节点之前。所以我做的是: void addNewNode(int nodeId, int nodeValue) { Node *newNode = (Node*) ma
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;
}
}
void addNewNode(int-nodeId,int-nodeValue){
Node*newNode=(Node*)malloc(sizeof(Node));
节点*temp,*temprev;
newNode->id=nodeId;
newNode->value=nodeValue;
if(firstNode==NULL){
newNode->next=firstNode;
firstNode=newNode;
}
temp=firstNode;
temprev=NULL;
同时(临时->值<新节点->值){
tempPrev=温度;
温度=温度->下一步;
}
if(temprev==NULL){
newNode->next=firstNode;
firstNode=newNode;
}
否则{
temprev->next=newNode;
newNode->next=temp;
}
}
上面代码的问题是,有时程序会崩溃,但我找不到错误
另外,我接下来要做的是,如果一些节点具有相同的值,那么它们将根据其id排序(id较小的节点排在第一位)。我该怎么做?我真的很困惑 1
if(firstNode == NULL) {
newNode->next = firstNode;
firstNode = newNode;
return; // done with inserting the first node...need not continue.
}
二,
//确保temp不为null,然后才能访问其值。
而(临时和(临时->值<节点ID->值)){
tempPrev=温度;
温度=温度->下一步;
}
程序崩溃,因为在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))
{
....
}
while(temp!=NULL&&(temp->valuevalue | | |(temp->value==newNode->value&&temp->idid))
{
....
}
此外,第一个if语句(用于检查firstNode是否为NULL)在您的情况下是不必要的。如果为NULL,程序将不会进入while循环,而是直接转到while循环后的第一个if语句
顺便说一下,对于C:-)中的新程序员来说,代码很好。首先,这里有nodeID->value。NodeID是一个int,所以这不起作用。作为一种调试方法,我将创建一个简单的测试工具。换句话说,您编写的测试程序可以运行在您可以想到的所有常见场景中(也称为单元测试)。每个单元测试都会进行检查,以确保其正常运行并生成预期的输出。这样,你就可以确信,如果一切正常,你就可以走了。如果单元测试失败,您就可以确切地知道什么被破坏了。我建议构建两个测试用例来检查您的边界条件(例如,将一个元素添加到一个空列表中;添加一个应该在现有列表前面结束的元素;添加一个在现有列表结束时结束的元素;添加一个元素,该元素应该在现有列表的中间某个地方结束)。函数将列表中的元素打印到控制台进行调试。这至少可以帮助您缩小崩溃的范围。一种可能性(我不知道您正在进行多少次添加)程序内存不足,malloc失败。您可以检查这一点,因为我认为如果malloc无法分配所需的内存,它将返回NULL
Node *newNode = (Node*) malloc(sizeof(Node));
if(newNode == NULL)
{
printf("Out of Memory!");
return;
}
是的,当我为这个问题编写代码时,我错发了。我的原始代码中有newNode->value!代码编译和运行得非常完美!我只需编辑它!+1。简单的测试可以帮助新程序员理解边界条件以及如何使用它们的函数;应该经常向他们建议!
while(temp!=NULL && (temp->value<newNode->value || (temp->value==newNode->value && temp->id<newNode->id))
{
....
}
Node *newNode = (Node*) malloc(sizeof(Node));
if(newNode == NULL)
{
printf("Out of Memory!");
return;
}