gpt4 book ai didi

c - 为什么 Hackerrank 显示以下 C 代码的段错误?

转载 作者:行者123 更新时间:2023-11-30 20:02:49 24 4
gpt4 key购买 nike

关闭。这个问题需要details or clarity .它目前不接受答案。












想改进这个问题?通过 editing this post 添加详细信息并澄清问题.

2年前关闭。




Improve this question




Hackerrank 问题描述:

您将获得指向链表头节点的指针和要添加到链表的整数。使用给定的整数创建一个新节点。将该节点插入到链表的尾部,并返回插入该新节点后形成的链表的头节点。给定的头指针可能为空,这意味着初始列表为空。

输入格式

您必须完成 SinglyLinkedListNode insertAtTail(SinglyLinkedListNode head, int data) 方法。它有两个参数:链表的头部和要插入尾部的整数。您不应该从标准输入/控制台读取任何输入。

输入由代码编辑器处理,如下所示:
第一行包含一个整数,表示链表的元素。
接下来的每一行都包含一个整数,表示需要在尾部插入的元素。

约束

输出格式

在尾部插入新节点,只返回更新链表的头部。不要将任何内容打印到标准输出/控制台。

输出由编辑器中的代码处理,如下所示:
从头到尾打印链表的元素,每个元素都在一个新行中。

样本输入

5
141
302
164
530
474

样本输出

141
302
164
530
474

解释

首先,链表为NULL。

插入 141 后,列表为 141 -> NULL。

插入 302 后,列表为 141 -> 302 -> NULL。

插入 164 后,列表为 141 -> 302 -> 164 -> NULL。

插入 530 后,列表为 141 -> 302 -> 164 -> 530 -> NULL。

插入474后,列表为141 -> 302 -> 164 -> 530 -> 474 -> NULL,即为最终列表。

我的代码:

#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* readline();

typedef struct SinglyLinkedListNode SinglyLinkedListNode;
typedef struct SinglyLinkedList SinglyLinkedList;

struct SinglyLinkedListNode {
int data;
SinglyLinkedListNode* next;
};

struct SinglyLinkedList {
SinglyLinkedListNode* head;
};

SinglyLinkedListNode* create_singly_linked_list_node(int node_data) {
SinglyLinkedListNode* node = malloc(sizeof(SinglyLinkedListNode));

node->data = node_data;
node->next = NULL;

return node;
}

void print_singly_linked_list(SinglyLinkedListNode* node, char* sep, FILE* fptr) {
while (node) {
fprintf(fptr, "%d", node->data);

node = node->next;

if (node) {
fprintf(fptr, "%s", sep);
}
}
}

void free_singly_linked_list(SinglyLinkedListNode* node) {
while (node) {
SinglyLinkedListNode* temp = node;
node = node->next;

free(temp);
}
}

// Complete the insertNodeAtTail function below.

/*
* For your reference:
*
* SinglyLinkedListNode {
* int data;
* SinglyLinkedListNode* next;
* };
*
*/
//This is the required function which I have written
SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data) {
SinglyLinkedListNode *newNode = (SinglyLinkedListNode*)malloc (sizeof(SinglyLinkedListNode));
SinglyLinkedListNode *p = head;
while(p->next!=NULL){
p=p->next;
}
newNode->data = data;
newNode ->next = p->next;
p ->next = newNode;
return head;

}


int main()
{
FILE* fptr = fopen(getenv("OUTPUT_PATH"), "w");

SinglyLinkedList* llist = malloc(sizeof(SinglyLinkedList));
llist->head = NULL;

char* llist_count_endptr;
char* llist_count_str = readline();
int llist_count = strtol(llist_count_str, &llist_count_endptr, 10);

if (llist_count_endptr == llist_count_str || *llist_count_endptr != '\0') { exit(EXIT_FAILURE); }

for (int i = 0; i < llist_count; i++) {
char* llist_item_endptr;
char* llist_item_str = readline();
int llist_item = strtol(llist_item_str, &llist_item_endptr, 10);

if (llist_item_endptr == llist_item_str || *llist_item_endptr != '\0') { exit(EXIT_FAILURE); }

SinglyLinkedListNode* llist_head = insertNodeAtTail(llist->head, llist_item);
llist->head = llist_head;
}



char *sep = "\n";

print_singly_linked_list(llist->head, sep, fptr);
fprintf(fptr, "\n");

free_singly_linked_list(llist->head);

fclose(fptr);

return 0;
}

char* readline() {
size_t alloc_length = 1024;
size_t data_length = 0;
char* data = malloc(alloc_length);

while (true) {
char* cursor = data + data_length;
char* line = fgets(cursor, alloc_length - data_length, stdin);

if (!line) {
break;
}

data_length += strlen(cursor);

if (data_length < alloc_length - 1 || data[data_length - 1] == '\n') {
break;
}

alloc_length <<= 1;

data = realloc(data, alloc_length);

if (!line) {
break;
}
}

if (data[data_length - 1] == '\n') {
data[data_length - 1] = '\0';

data = realloc(data, data_length);
} else {
data = realloc(data, data_length + 1);

data[data_length] = '\0';
}

return data;
}

输出:
核心是由“./Solution”生成的。
程序因信号 SIGSEGV、段错误而终止。

最佳答案

你从不检查 head对于 NULL在枚举列表之前。如果那里没有“那里”,则:

SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data) {
SinglyLinkedListNode *newNode = (SinglyLinkedListNode*)malloc(sizeof(SinglyLinkedListNode));
SinglyLinkedListNode *p = head;

// HERE. If head was NULL then so is p, therefore p->next is BAD
while (p->next != NULL) {
p = p->next;
}
newNode->data = data;
newNode->next = p->next;
p->next = newNode;
return head;
}

有多种方法可以解决这个问题,一种易于理解,一种高效编码。需要考虑的事项包括:
  • 使用 prev 指针或指针到指针的解决方案来获取列表中的最后一个节点。
  • 这是 C 代码。 Don't cast malloc in C code

  • 一种可能的解决方案如下。虽然更容易理解发生了什么,但它比我稍后将展示的替代解决方案需要更多的代码:
    SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data)
    {
    SinglyLinkedListNode *prev = NULL;
    SinglyLinkedListNode *p = head;
    while (p)
    {
    prev = p;
    p = p->next;
    }

    p = malloc(sizeof *p);
    p->data = data;
    p->next = NULL;

    if (prev)
    prev->next = p;
    else
    head = p;

    return head;
    }

    另一种方法是使用指向指针的指针,并利用列表本身内的指针地址,而不是按指针值遍历。它更难理解,但代码要少得多。
    SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data)
    {
    SinglyLinkedListNode **pp = &head;
    while (*pp)
    pp = &(*pp)->next;

    *pp = malloc(sizeof **pp);
    (*pp)->data = data;
    (*pp)->next = NULL;

    return head;
    }

    请注意,如果 head包含 NULL进入时,循环立即终止, pp仍然拥有 head 的地址指针,用新节点填充它,然后返回 head包含(新节点地址)。如果 head不包含 NULL进入然后 pp包含最后 next 的地址列表中的指针(将包含 NULL )并且新节点就卡在那里。在那种情况下 head保持不变,原来的 head只是简单地返回。

    希望能帮助到你。

    关于c - 为什么 Hackerrank 显示以下 C 代码的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59547011/

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