私はこのコードを持っている:リンクリストの問題
#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つのリストをマージしなければならないとlista1
がNULL
ないときに、実際にそれをやっているが、 xulambs
とします。それによると、lista1
はlista2
の先頭アドレスを受け取るはずですが、関数が終了すると実行lista1
は空です。
私はちょうど後lista2
の先頭アドレスを受信し、それがうまく動作しますが、主な機能に着いたとき、まだlista1
NULL
lista1
の値を印刷してデバッグ。
何が起こっているのか理解してもらえますか?おかげ
いくつかの翻訳:
- リスタ=リスト
- ダド=データ
- PROX =次
- imprime =印刷
- insere =
- concatena =を追加マージ
... – Eekan
1)は、 ''の#include <...>使用しています。 2) 'malloc'の戻り値をキャストしないでください。 3)英語のコード。本当に。4)そこに 'lista'という未使用のグローバル変数があります。それを取り除く。 5)空白を使います(例えば 'if'の周りに)。読みやすさを向上させます。 6)戻り値を使用します。 'concatena'は新しいリストを返すべきです。 7) 'malloc'の関数を書くときは' free'も書いてください。 –
男、このコードは学習のためのものでした。もちろん、ポルトガル語のコードはありませんでした。また、インクルードエディタのオートコンプリートにも含まれていましたが、関数concatenasプロトタイプは私の先生によるvoid戻り値付きの義務でした。私はリスト返却を得ました。それはずっと簡単です。フリーでも、もちろん、製品では、実行中にメモリブロックを解放するために無料で使用します。お寄せいただきありがとうございました –