C语言 获取特定索引处的单个节点[已关闭]

8zzbczxx  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(100)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2天前关闭。
社区在2天前审查了是否重新讨论此问题,并将其关闭:
原始关闭原因未解决
Improve this question
我有一个函数,返回一个特定索引的节点,但是当索引大于链表的长度时,我得到一个分段错误,我写了一个条件来处理这个问题

listint_t *get_nodeint_at_index(listint_t *head, unsigned int index)
{
        listint_t *temp;
        unsigned int i;

        i = 0;
        temp = head;
        while (temp != NULL)
        {
                if (index == i)
                {
                        return (temp);
                }
                temp = temp->next;
                i++;
        }
        if (index < 0 || index > i)
                return NULL;
}
r7knjye2

r7knjye21#

您没有与我们共享的调用代码可能在尝试解引用NULL返回值时崩溃。
head->next必须是列表末尾的NULL,所以你不需要i vs index检查,因为如果index太大,你会用完元素。因为参数在C中是通过值传递的,你可以只使用head参数,而不是引入本地变量temp
index < 0永远不会为真,因为indexunsigned int

listint_t *get_nodeint_at_index(listint_t *head, unsigned int index) {
    for(unsigned int i = 0; head; i++, head = head->next)
        if (index == i)
            return head;
    return NULL;
}

下面是一个演示工作代码的最小程序:

#include <stdio.h>
#include <stdlib.h>

typedef struct listint_t {
    int data;
    struct listint_t *next;
} listint_t;

listint_t *get_nodeint_at_index(listint_t *head, unsigned int index) {
    for(unsigned int i = 0; head; i++, head = head->next)
        if (index == i)
            return head;
    return NULL;
}

void print(listint_t *p) {
    if(!p) {
        printf("NULL\n");
        return;
    }
    printf("%d\n", p->data);
}

int main() {
    listint_t *head = &(listint_t) { 0, &(listint_t) { 1, NULL }};
    print(get_nodeint_at_index(head, 0));
    print(get_nodeint_at_index(head, 1));
    print(get_nodeint_at_index(head, 2));
}

示例输出:

0
1
NULL

POSIX标准1003.1,B.2.12数据类型保留了_t名称后缀btw,因此我建议您为类型使用不同的名称。

相关问题