首页 > 解决方案 > 从函数写入时,链表状态保持不变

问题描述

我在使用一个非常简单的函数时遇到问题,我必须创建一个链表,每个节点都存储字符串中的一个字符,我为此创建了一个函数,但是它似乎根本没有做任何事情

这是我正在谈论的函数(变量名称是西班牙语,我很抱歉):

struct listaDoble crearMiADN()
{
    char miDni[] = "1234";
    struct listaDoble listado = crearLista(strlen(miDni));
    struct nodo *actual = listado.first;
    for(int i = 0; i<strlen(miDni); i++)
    {
        if(miDni[i] != '\0' && miDni[i] != EOF)
        {
            actual->tuNombre[0] = miDni[i];
            actual->tuNombre[1] = '\0';
            actual = actual->next;
        }
    }
    return listado;

}

这是有效的功能crearLista,但您可能需要它来理解我的代码:

struct listaDoble crearLista(int num_nodos)
{
    struct listaDoble *result = (struct listaDoble *)malloc(sizeof(struct listaDoble));
    if(num_nodos > 0)
    {
        result->first = (struct nodo *)malloc(sizeof(struct nodo));
        result->first->prev = NULL;
        struct nodo *actual = result->first;
        struct nodo *prev = NULL;
        struct nodo *last;
        for(int i = 0; i < num_nodos; i++)
        {
            if(i + 1 != num_nodos)
            {
                actual->next = (struct nodo*)(malloc)(sizeof(struct nodo));
                actual->prev = prev;
                actual = actual->next;
                prev = actual;
            }
            else
            {
                actual->next = NULL;
                actual->prev = prev;
                last = actual;
            }
        }
        result->last = last;
        result->size = num_nodos;
    }
    else
    {
        result->first = NULL;
        result->last = NULL;
        result->size = 0;
    }
    return *result;

}

在评论中要求

struct listaDoble
{
    struct nodo *first, *last;
    int size;
};

现在这就是我所说crearMiADN

struct listaDoble dni = crearMiADN();

现在预期的结果将是这样的

NULL<-- [1] <-> [2] <-> [3] <-> [4] --> NULL

然而这就是我得到的

NULL<-- [] <-> [] <-> [] <-> [] --> NULL

我对指针不是很热衷,我修复它的尝试实际上是试图在某处放置一个 * 并查看它是否有效(剧透警报,它没有)

所以像这样

struct listaDoble dni = *crearMiADN(); //type mismatch

然后我尝试修复我这样做的类型不匹配

struct listaDoble crearMiADN()
    //...//
    return *listado;

}

再次出错,现在我几乎被困在尝试将 * 随机放在某个地方并检查它是否可以编译和工作

标签: cdoubly-linked-list

解决方案


您正在尝试返回局部变量。您应该分配该内存块并返回指针。通过更正代码重试如下。

struct listaDoble* crearMiADN()
{
    char miDni[] = "1234";
    struct listaDoble *listado = crearLista(strlen(miDni));
    ...
    return listado;

}
struct listaDoble* crearLista(int num_nodos)
{
    struct listaDoble *result = (struct listaDoble *)malloc(sizeof(struct listaDoble));
    ...
    return result;
}

推荐阅读