c - 链表问题

标签 c linked-list

我有这个代码:

#include "stdlib.h"
#include "stdio.h"

typedef struct lista TLista;
struct lista{
  char dado;
  TLista* prox;
}lista;

TLista* insere(TLista* l, char dado){
  TLista* aux;
  TLista* anterior;
  if(l == NULL){
    l = (TLista*) malloc(sizeof(TLista));
    l->dado = dado;
    l->prox = NULL;
  }else{
    aux = l;
    while(aux != NULL){
      anterior = aux;
      aux = aux->prox;
    }
    aux = (TLista*) malloc(sizeof(TLista));
    anterior->prox = aux;
    aux->dado = dado;
    aux->prox = NULL;
  }
  return l;
}

void imprime(TLista* l){
  if(l == NULL){
    printf("A lista esta vazia");
  }else{
    while(l != NULL){
    printf("%c", l->dado);
    l = l->prox;
  }
}

void concatena(TLista* lista1, TLista* lista2){
  TLista* aux = lista1;
  if(!lista1){
    lista1 = lista2;
    printf("\nInside function: ");
    imprime(lista1);
  }else{
    while(aux->prox != NULL){
      aux = aux->prox;
    }
    aux->prox = lista2;
  }
}

int main() {
  TLista* lista1 = NULL;
  TLista* lista2 = NULL;
  printf("\n");
  lista1 = insere(lista1, 't');
  lista1 = insere(lista1, 'e');
  lista1 = insere(lista1, 's');
  lista1 = insere(lista1, 't');
  lista1 = insere(lista1, 'e');

  imprime(lista1);

  printf("\n\n\n\n");

  lista2 = insere(lista2, 'x');
  lista2 = insere(lista2, 'u');
  lista2 = insere(lista2, 'l');
  lista2 = insere(lista2, 'a');
  lista2 = insere(lista2, 'm');
  lista2 = insere(lista2, 'b');
  lista2 = insere(lista2, 's');

  concatena(lista1,lista2);
  printf("\nOutside function: ");
  imprime(lista1);
  printf("\n\n");
  return 0;
}

函数名称是用葡萄牙语写的。所以,函数 concatena 应该合并两个列表,事实上当 lista1 不是 NULL 时它正在这样做,但是当我注释掉这些行时:

  lista1 = insere(lista1, 't');
  lista1 = insere(lista1, 'e');
  lista1 = insere(lista1, 's');
  lista1 = insere(lista1, 't');
  lista1 = insere(lista1, 'e');

  imprime(lista1);

concatena 函数应接收第一个列表作为 NULL,第二个列表作为 xulambs。根据它,lista1 应该接收到lista2 的头地址,但是当函数结束时执行lista1 是空的。

我在接收到 lista2 的头地址后调试打印 lista1 的值并且它工作正常,但是当到达主函数时,lista1 仍然是 NULL

谁能帮我弄清楚发生了什么事?谢谢


一些翻译:

  1. lista = 列表
  2. dado = 数据
  3. prox = 下一个
  4. imprime = 打印
  5. 插入=添加
  6. 连接 = 合并

最佳答案

主函数中“TLista* lista1”的变量值,当你传递给另一个函数(concatena)并在那里修改时,它并没有被修改。

要么让“concatena”返回一个有效的指针,例如

lista1 = concatena(lista1,lista2);

并在 lista1 为 NULL 的情况下从 concatena 返回 lista2,或者您将指向“lista1”变量的指针传递给函数,例如

concatena(&lista1, lista2)

...在这种情况下,您的 concatena 函数将如下所示:

void concatena(TLista** lista1, TLista* lista2){
  TLista* aux = *lista1;
  if(!*lista1){
    *lista1 = lista2;
    printf("\nInside function: ");
    imprime(*lista1);
  }else{
    while(aux->prox != NULL){
      aux = aux->prox;
    }
    aux->prox = lista2;
  }
}

但是,像这样到处指点肯定会让人感到困惑。 拥有一个结构来维护指向列表第一个元素的指针并传递指向该结构的指针会更容易。

关于c - 链表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36632030/

相关文章:

c - 通过从文本文件中读取数字来生成链接列表

java - 链接列表 - 删除索引处的元素

c++ - C++程序因链接列表而崩溃

c - 尽管内存已被释放,Valgrind 仍检测到内存泄漏

c - 我的 strchr 版本有什么问题?

c - 如何在windows和linux下运行同一个c程序

c - 指向链表中指针的指针

c++ - 无效使用非静态数据成员 'linkedList<int>::dummyNode' c++

c - While 循环 - 时间

c - GStreamer 视频中的绿线