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

5 c html-lists

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

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

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

Node *firstNode = NULL;
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

另外,我接下来要做的是,如果某些节点具有相同的值,则根据它们的id对它们进行排序(具有较小ID的节点首先出现).我怎样才能做到这一点?我真的很困惑!

Ale*_*lex 3

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

while(temp!=NULL && temp->value>newNode->value)
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

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

while(temp!=NULL && (temp->value<newNode->value || (temp->value==newNode->value && temp->id<newNode->id))
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

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

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