我正在编写一个程序,将字符添加到列表中。问题是,当我有 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("%cn", (*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("%cn", (*nodo01).c);
nodo01 = (*nodo01).next;
}
}