2016-04-14 12 views
4

Ich habe diesen Code:verlinkte Listen Ausgabe

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

Die Funktionen Namen wurden in portugiesischer Sprache geschrieben. So soll die Funktion concatena zwei Listen zusammenführen und in der Tat wird es tun, wenn lista1 nicht NULL ist, aber wenn ich diese Zeilen auf Kommentar:

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

    imprime(lista1); 

die Funktion concatena sollte die erste Liste als NULL und die zweiten Empfang als xulambs. Demnach sollte die lista1 die Kopfadresse lista2 erhalten, aber wenn die Funktion endet, ist die Ausführung lista1 leer.

gedebuggt ich die Werte von lista1 Druck kurz nach lista2 ‚s Adresse Kopf erhalten und es funktioniert gut, aber wenn sie auf die Hauptfunktion bekam, lista1 noch NULL.

Kann mir jemand helfen herauszufinden, was los ist? Dank


Einige Übersetzungen:

  1. lista = Liste
  2. Dado = data
  3. prox = nächste
  4. imprime = Druck
  5. hinzufügen und = hinzufügen
  6. concatena = fusionieren
+0

Ich habe erkannt, wie Sie Ihre Variablen mit Namen zu nennen Sie Ihr Leben erleichtern verstehen konnte ... – Eekan

+0

1) Sie sind mit Standard-Header verwenden '# include <...>'. 2) Wirf nicht den Rückgabewert von "malloc". 3) Code in Englisch. Ja wirklich.4) Sie haben dort eine unbenutzte globale Variable namens 'lista'. Werde es los. 5) Verwende Whitespace (zum Beispiel um 'if'). Verbessert die Lesbarkeit. 6) Verwenden Sie Rückgabewerte. 'concatena' sollte die neue Liste zurückgeben. 7) Wenn du eine Funktion schreibst, die 'malloc' ist, schreibe eine, die' free 'auch ist. –

+0

Mann, dieser Code war für Studien, natürlich in einem Produkt, das ich nicht in Portugiesisch programmieren werde, auch das "" in Include wird von der Atome-Editor-Vervollständigung gesetzt, auch die Funktion concatenas Prototyp war Pflicht mit void Rückgabewert von meinem Lehrer, wenn Ich habe eine Liste zurück bekommen, es wäre viel einfacher. Über die freie, natürlich in einem Produkt würde ich frei verwenden, Speicherblöcke während der Ausführung freizugeben. BTW danke für die anderen Tipps –

Antwort

4

Der Variablenwert von "TLista * lista1" in der Hauptfunktion wird nicht geändert, wenn Sie ihn an eine andere Funktion (concatena) übergeben und dort ändern.

Entweder lassen Sie "concatena" einen gültigen Zeiger, z.

lista1 = concatena(lista1,lista2); 

und Rück lista2 von concatena in dem Fall, dass lista1 NULL ist, oder Sie übergeben einen Zeiger auf Ihre „lista1“ Variable an die Funktion, z.B.

concatena(&lista1, lista2) 

... in diesem Fall Ihre concatena Funktion würde wie folgt aussehen:

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

jedoch Gabe Zeiger um so ist ein sicherer Weg, verwirrt. Es ist einfacher, eine Struktur zu haben, die einen Zeiger auf das erste Element Ihrer Liste führt und einen Zeiger auf diese Struktur herum gibt.

+0

danke für die Antwort. Das ist ein Problem, das mir unser Lehrer während des Unterrichts gab. Also forderte er den Funktionsprototyp genau so, wie ich geschrieben hatte, leider ohne Rücksendung. –

4

Sie müssen einen Zeiger auf einen Zeiger in Ihre Funktion concatena übergeben. Wenn Sie einen Zeiger übergeben, wird innerhalb der Funktion eine lokale Kopie erstellt, und die Funktion ändert nur eine Kopie.

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

Danke für die Antwort, aber warum, wenn list1 nicht null ist, wenn ich zur Hauptfunktion komme, wird die list1 mit list2 zusammengeführt, und wenn list1 null ist, passiert das nicht? –

+0

Wenn list1 nicht null ist, ändern Sie ein Mitglied der Struktur Tlist. Es wird eine Kopie des Zeigers auf eine ganze Struktur erstellt und Sie können auf seine Mitglieder zugreifen und sie ändern und sicherstellen, dass Sie sie wirklich ändern. –

+0

Bekam es. Danke vielmals –