Function of concatenating two chained lists returning only one element

Asked

Viewed 24 times

-1

I have a function that receives as parameter two chained lists containing elements and a third empty list that at the end will be the junction of the two, but at the end of the execution of the function it is returning me only the last element of the list of number 2, in the case of the first item which has been inserted in the second list. Follow the code below, the function I am having problem is the function name Concatena_lists.

# include <iostream>
using namespace std;

struct nolista  {
int dado;
nolista* prox;
};

nolista *Cria_Lista(){
return NULL;
}

nolista * Insere_Numero_Na_Lista(nolista *Ponteiro_De_Inserir, int Valor_A_Ser_Inserido){
if(Ponteiro_De_Inserir == NULL){
    Ponteiro_De_Inserir = (nolista *)malloc(sizeof(nolista));
    Ponteiro_De_Inserir -> dado = Valor_A_Ser_Inserido;
    Ponteiro_De_Inserir -> prox = NULL;
    return Ponteiro_De_Inserir;
}else{
    nolista *Ponteiro_Lista_Nao_Vazia;
    Ponteiro_Lista_Nao_Vazia = (nolista *) malloc(sizeof(nolista));
    Ponteiro_Lista_Nao_Vazia -> dado = Valor_A_Ser_Inserido;
    Ponteiro_Lista_Nao_Vazia -> prox = Ponteiro_De_Inserir;
    return Ponteiro_Lista_Nao_Vazia;
}
}

void Exibir_Lista(nolista *Ponteiro_De_Exibicao){
nolista *Ponteiro_Para_Impressao = Ponteiro_De_Exibicao;
printf("\n\nAbaixo estao os numeros da lista : \n"); 
while (Ponteiro_Para_Impressao != NULL)
{
    printf("\n%d", Ponteiro_Para_Impressao -> dado);
    Ponteiro_Para_Impressao = Ponteiro_Para_Impressao -> prox;
}
printf("\n");

}

nolista * Concatena_Listas(nolista *L1, nolista *L2, nolista *Lista_Concatenada){
nolista *Ponteiro_De_Insercao;
nolista *Ponteiro_Pecorre_L1 = L1;
nolista *Ponteiro_Pecorre_L2 = L2;
while (Ponteiro_Pecorre_L1 != NULL){
    if(Lista_Concatenada == NULL){
        Lista_Concatenada = (nolista *)malloc(sizeof(nolista));
        Lista_Concatenada -> dado = Ponteiro_Pecorre_L1 -> dado;
        Lista_Concatenada -> prox = NULL;
    }else{
        nolista *Ponteiro_Lista_Nao_Vazia;
        Ponteiro_Lista_Nao_Vazia = (nolista *) malloc(sizeof(nolista));
        Lista_Concatenada -> dado = Ponteiro_Pecorre_L1 -> dado;

      
        Ponteiro_Lista_Nao_Vazia -> prox = Lista_Concatenada;
       
        
        
    }
    Ponteiro_Pecorre_L1 = Ponteiro_Pecorre_L1 ->prox;
}
while (Ponteiro_Pecorre_L2 != NULL){
    if(Lista_Concatenada == NULL){
        Lista_Concatenada = (nolista *)malloc(sizeof(nolista));
        Lista_Concatenada -> dado = Ponteiro_Pecorre_L1 -> dado;
        Lista_Concatenada -> prox = NULL;
        
    }else{
        nolista *Ponteiro_Lista_Nao_Vazia;
        Ponteiro_Lista_Nao_Vazia = (nolista *) malloc(sizeof(nolista));
        Lista_Concatenada -> dado = Ponteiro_Pecorre_L2 -> dado;

        
        Ponteiro_Lista_Nao_Vazia -> prox = Lista_Concatenada; 
      
    }
    Ponteiro_Pecorre_L2 = Ponteiro_Pecorre_L2 ->prox;
    
}

return Lista_Concatenada; 

}



int main(int argc, char const *argv[]){ 
nolista * Lista_1, *Lista_2, *Lista_Concatenada;
Lista_1 = Cria_Lista();
Lista_2 = Cria_Lista();
Lista_Concatenada = Cria_Lista();
int Quantidade_De_Elementos_Da_Lista_L_1,Quantidade_De_Elementos_Da_Lista_L_2, 
Numero;
printf("\nDigite a quantidade de elementos da lista 1 : ");
scanf("%d", &Quantidade_De_Elementos_Da_Lista_L_1);
for(int i = 0; i < Quantidade_De_Elementos_Da_Lista_L_1; i++){
    printf("\nDigite o elemento da lista de numero [%d] : ", (i+ 1));
    scanf("%d", &Numero);
    Lista_1 = Insere_Numero_Na_Lista(Lista_1, Numero);
}

printf("\nDigite a quantidade de elementos da lista 2 : ");
scanf("%d", &Quantidade_De_Elementos_Da_Lista_L_2);
for(int i = 0; i < Quantidade_De_Elementos_Da_Lista_L_2; i++){
    printf("\nDigite o elemento da lista de numero [%d] : ", (i+ 1));
    scanf("%d", &Numero);
    Lista_2 = Insere_Numero_Na_Lista(Lista_2, Numero);
}

Exibir_Lista(Lista_1);
Exibir_Lista(Lista_2);

Lista_Concatenada = Concatena_Listas(Lista_1, Lista_2, Lista_Concatenada);
Exibir_Lista(Lista_Concatenada);

return 0;
}
  • Is this a C program? It just included iostream... I suggest rewriting Concatena_Listas(): to insert into the list use the code you have already written. In the internal loop test every time if Lista_Concatenada() is NULL. You do not need parameter 3. Note that a list is not a node. A node is not a list, and should have no reference to the data in the list functions or will not be useful after

  • And why you need pointers to the two original lists if you only access one at a time?

1 answer

0


As I wrote in the comment on the question, I think your program is not as good as the way you wrote it, and I suggest rewriting considering that a list is not a node, a node is not a list, and there should be no reference to the data in the list structure, or you won’t be able to use it for other cases. The way you wrote for any change in the data you have to go through the whole list.

Regarding concatenating two lists, using your code and considering only this function:

nolista* Concatena_Listas(nolista* L1, nolista* L2)
{
    nolista* p = L2;
    nolista* nova = NULL;
    while (p != NULL)
    {   nova = Insere_Numero_Na_Lista(nova, p->dado);
        p = p->prox;
    }
    p = L1;
    while (p != NULL)
    {   nova = Insere_Numero_Na_Lista(nova, p->dado);
        p = p->prox;
    }
    return nova;
}

I think it already works. It’s better to use your own code to insert than to rewrite...

Browser other questions tagged

You are not signed in. Login or sign up in order to post.