我有这个代码:

#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 是空的。

我在收到 lista1 的头地址后调试打印 lista2 的值,它运行良好,但是当到达主函数时, lista1 仍然是 NULL

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

几个翻译:
  • lista = 列表
  • dado = 数据
  • prox = 下一个
  • imprime = 打印
  • insere = 添加
  • concatena = 合并
  • 最佳答案

    当您将主函数中的“TLista* lista1”的变量值传递给另一个函数(concatena)并在那里进行修改时,它不会被修改。

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

    lista1 = concatena(lista1,lista2);
    

    并从 concatena 返回 lista2,以防 lista1 为 NULL 或者您将指向“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/

    10-09 13:33