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

标签 c list

我正在编写一个程序,将一个字符添加到列表中。问题是,当我拥有 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/

相关文章:

python - 在 Python 中将整数附加到列表的开头

list - 在向量的向量中排序列表

c - C 中的 Heapify 问题

c - 让可执行文件打开自己的终端窗口

python - 如何在python中查找列表的序列号(如行号1、2)

c - 获取列表元素的函数 - C

c - 将 typedef 结构作为参数传递给函数

c - 为什么这段代码不计算字符数?

使用加密 API 计算哈希值

c++ - 列出节点指针 'not declared in this scope' ?