gpt4 book ai didi

c - 向列表添加 1 个字符时出现无限循环

转载 作者:行者123 更新时间:2023-11-30 14:32:28 25 4
gpt4 key购买 nike

我正在编写一个程序,将一个字符添加到列表中。问题是,当我拥有 5 个节点的原始列表并尝试添加另一个节点时,一切正常,但是当我尝试添加另一个节点时,stampa 函数变得无限。

我找不到错误。任何帮助都会受到欢迎。这是代码:

struct nodo {
char c;
struct nodo *next;
};
typedef struct nodo *lista;

void mc_coda(lista *l, char el);

void stampa(lista nodo01);

int main() {
int test[5] = {0, 1, 1, 0, 1};
lista nodo01 = malloc(sizeof(struct nodo));
lista nodo02 = malloc(sizeof(struct nodo));
lista nodo03 = malloc(sizeof(struct nodo));
lista nodo04 = malloc(sizeof(struct nodo));
lista nodo05 = malloc(sizeof(struct nodo));

(*nodo01).next = nodo02;
(*nodo02).next = nodo03;
(*nodo03).next = nodo04;
(*nodo04).next = nodo05;
(*nodo05).next = NULL;

(*nodo01).c = 'a';
(*nodo02).c = 'b';
(*nodo03).c = 'c';
(*nodo04).c = 'd';
(*nodo05).c = 'e';

mc_coda(&nodo01, 'e');
mc_coda(&nodo01,
'f'); // If this line is removed everything workd fine, if this line
// if added that it prints infinite f

stampa(nodo01);

return 0;
}

void mc_coda(lista *l, char el) {
if ((*l) == NULL) {
struct nodo temp;
temp.next = NULL;
temp.c = el;
(*l) = &temp;
} else {
while ((*l) != NULL) {
l = &(*(*l)).next;
}
struct nodo temp;
temp.next = NULL;
temp.c = el;
(*l) = &temp;
}
}

void stampa(lista nodo01) {
while (nodo01 != NULL) {
printf("%c\n", (*nodo01).c);
nodo01 = (*nodo01).next;
}
}

最佳答案

您的 mc_coda 实现创建了一个局部变量 temp。因为 temp 是一个局部变量,当函数退出时它会超出范围,然后空间将被重用。相反,您需要使用 malloc 在堆上分配空间。有关如何执行此操作的示例,请参阅下面的 mc_coda 实现:

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

struct nodo {
char c;
struct nodo *next;
};

typedef struct nodo *lista;

void mc_coda(lista *l, char el);

void stampa(lista nodo01);

int main() {
lista nodo01 = malloc(sizeof(struct nodo));
lista nodo02 = malloc(sizeof(struct nodo));
lista nodo03 = malloc(sizeof(struct nodo));
lista nodo04 = malloc(sizeof(struct nodo));
lista nodo05 = malloc(sizeof(struct nodo));

(*nodo01).next = nodo02;
(*nodo02).next = nodo03;
(*nodo03).next = nodo04;
(*nodo04).next = nodo05;
(*nodo05).next = NULL;

(*nodo01).c = 'a';
(*nodo02).c = 'b';
(*nodo03).c = 'c';
(*nodo04).c = 'd';
(*nodo05).c = 'e';

mc_coda(&nodo01, 'e');
mc_coda(&nodo01, 'f');

stampa(nodo01);

return 0;
}

void mc_coda(lista *l, char el) {
lista tmp = malloc(sizeof(struct nodo));
tmp->next = NULL;
tmp->c = el;
if ((*l) == NULL) {
(*l) = tmp;
} else {
while ((*l) != NULL) {
l = &(*(*l)).next;
}
(*l) = tmp;
}
}

void stampa(lista nodo01) {
while (nodo01 != NULL) {
printf("%c\n", (*nodo01).c);
nodo01 = (*nodo01).next;
}
}

关于c - 向列表添加 1 个字符时出现无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59791005/

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