2016-04-14 7 views
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; 
} 

機能名はポルトガル語で書かれていました。 NULL第二として、最初のリストを受け取る必要

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

    imprime(lista1); 

機能concatena:私はこれらの行をコメントアウトするときので、機能concatena 2つのリストをマージしなければならないとlista1NULLないときに、実際にそれをやっているが、 xulambsとします。それによると、lista1lista2の先頭アドレスを受け取るはずですが、関数が終了すると実行lista1は空です。

私はちょうど後lista2の先頭アドレスを受信し、それがうまく動作しますが、主な機能に着いたとき、まだlista1NULLlista1の値を印刷してデバッグ。

何が起こっているのか理解してもらえますか?おかげ


いくつかの翻訳:

  1. リスタ=リスト
  2. ダド=データ
  3. PROX =次
  4. imprime =印刷
  5. insere =
  6. concatena =を追加マージ
+0

... – Eekan

+0

1)は、 ''の#include <...>使用しています。 2) 'malloc'の戻り値をキャストしないでください。 3)英語のコード。本当に。4)そこに 'lista'という未使用のグローバル変数があります。それを取り除く。 5)空白を使います(例えば 'if'の周りに)。読みやすさを向上させます。 6)戻り値を使用します。 'concatena'は新しいリストを返すべきです。 7) 'malloc'の関数を書くときは' free'も書いてください。 –

+0

男、このコードは学習のためのものでした。もちろん、ポルトガル語のコードはありませんでした。また、インクルードエディタのオートコンプリートにも含まれていましたが、関数concatenasプロトタイプは私の先生によるvoid戻り値付きの義務でした。私はリスト返却を得ました。それはずっと簡単です。フリーでも、もちろん、製品では、実行中にメモリブロックを解放するために無料で使用します。お寄せいただきありがとうございました –

答えて

4

メイン関数の "TLista * lista1"の変数値は、別の関数(concatena)に渡して変更すると変更されません。

"concatena"に有効なポインタを返します。

lista1 = concatena(lista1,lista2); 

とlista1がNULLである場合にはconcatenaからlista2を返すか、機能、例えばにあなたの「lista1」変数へのポインタを渡します

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

しかし、そのように周りのポインタを渡すことは混乱する確実な方法である:あなたのconcatena機能は次のようになり、その場合には

concatena(&lista1, lista2) 

...。 リストの最初の要素へのポインタを保持し、ポインタをその構造体に渡す方が簡単です。

+0

答えに感謝します。これは私の先生がクラスで私たちに与えた問題です。だから彼は関数プロトタイプを、私が書いたのと同じように返すことなく残念ながら要求しました。 –

4

あなたの関数concatenaへのポインタへのポインタを渡す必要があります。ポインターを渡すと、その関数のローカルコピーが関数内に作成され、関数はコピーのみを変更します。あなたが標準ヘッダーを含めている

あなたの人生を容易に理解できるだろう名前を使用して変数の命名方法を私はちょうど実現
#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

答えがありがとう、なぜlist1がnullでない場合、私はメインのfuctionになったときlist1はlist2とマージされ、list1がnullならそれは起こらない? –

+0

list1がnullでない場合、struct Tlistのメンバーを変更するためです。これは、構造全体へのポインタのコピーを作成し、メンバーにアクセスしてメンバーを変更し、実際にメンバーを変更することができます。 –

+0

どうもありがとう –

関連する問題