关联列表问题

时间:2016-04-14 19:16:56

标签: 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为空。

我在接收到lista1的头地址之后调试了lista2的值,并且效果很好,但是当进入主函数时,lista1仍然是NULL

任何人都可以帮我弄清楚发生了什么事吗?感谢

一些翻译:

  1. lista = list
  2. dado = data
  3. prox = next
  4. imprime = print
  5. insere = add
  6. concatena = merge

2 个答案:

答案 0 :(得分:4)

将主函数中的“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;
  }
}

然而,像这样交出指针是一个让人感到困惑的可靠方法。 拥有一个结构来维护指向列表第一个元素的指针并将指针传递给该结构更容易。

答案 1 :(得分:4)

您需要将指针传递给指向函数串联的指针。传递指针时,会在函数内部创建它的本地副本,并且该函数仅更改副本。

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