【问题标题】:linked list state unchanged when writing to it from a function从函数写入时,链表状态保持不变
【发布时间】:2021-05-09 13:39:30
【问题描述】:

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

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

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;

}

在 cmets 中请求

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;

}

这又一次出错了,现在我几乎被困在试图将 * 随机放在某个地方并检查它是否编译和工作

【问题讨论】:

  • 您能否在问题中添加 listaDoble 结构
  • 实际=实际->下一个;上一页=实际;这不会解决您的问题,但您需要替换这些行,否则所有 prev 都将指向它们自己。
  • @DeepakPatankar 添加了

标签: c doubly-linked-list


【解决方案1】:

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

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;
}

【讨论】:

  • 确实有效,但是我无法更改 crearLista 的类型,这会破坏我拥有的所有其他功能(事实上,为了测试它,我必须注释除 crearMiADN 函数之外的所有内容否则它甚至不会编译),如果可能的话,我真的宁愿使用不同的解决方案,否则我将重写所有内容以使其与该解决方案一起使用
  • 如果你需要返回一个新的结构,那就是正确的方法。您可以尝试定义全局变量并使用它,而不是为此操作返回函数。如果它解决了问题,你会标记为答案吗?
  • 你能接受我的意思吗,对不起。
猜你喜欢
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多