List code not compiling well

Asked

Viewed 33 times

0

Hello.

I’m trying to learn about pointers and lists and I made a code that contains a menu and the option to enter as many values as I want. I made the code in the most recent codeblocks using W10 and it worked well as it is, but I tested it on other pcs and on a Ubuntu and saw that it did not compile very well.

When selecting option 2, in other pcs the execution would stop, and in Ubuntu the menu would reappear without running the function. If you can help me, I’d appreciate it.

#include<iostream>
#include<cstdlib>

using namespace std;

typedef struct lista{

    int elemento; /* componente da lista */

    struct lista *proximo; /* Aponta para a proxima posicao de mémoria*/

}lista;

lista *primeiro, *atual, *NovaLista, *LiberaMemoria; /* Variaveis de manipulacao da lista*/

void ExcluiElemento();
void CriaLista();
void Imprimir();
void InserirElemento();
void liberamemoria(int numero);

int main(){

    int opcao;
    do{
        cout<<"1------------Criar Lista\n"
        <<"2------------Inserir Elemento na lista\n"
        <<"3-----------Imprimir Elementos da lista\n"
        <<"4------------Exlcuir Elementos da lista \n\n";
        cin>>opcao;

        switch(opcao){

            case 1:

                CriaLista();
                break;

            case 2:

                InserirElemento();
                break;

            case 3:

                Imprimir();
                break;

            case 4:

                ExcluiElemento();
                break;

        }

    }while(opcao != 5);

    return 0;
}

void liberamemoria(int numero){
    atual=primeiro;
    LiberaMemoria=primeiro;
    while(LiberaMemoria!=NULL){
        if(LiberaMemoria->elemento != numero){
            atual=LiberaMemoria;
            LiberaMemoria=LiberaMemoria-> proximo;

        }else{
            if(LiberaMemoria==atual){
                primeiro = atual->proximo;
                liberamemoria(numero);
                break;

            }else if(LiberaMemoria->proximo==NULL){
                atual->proximo=NULL;

                break;
            }else{
                atual->proximo=LiberaMemoria->proximo;
                liberamemoria(numero);
                break;
            }
        }
    }
    free(LiberaMemoria);

}

void ExcluiElemento(){

    int numero;

    if(primeiro==NULL){
        cout<<"Lista vazia\n\n";
    }else{
        cout<<" Digite o elemento que deseja excluir da lista: ";
        cin>>numero;

        liberamemoria(numero);
    }
}
void CriaLista(){
    if(primeiro==NULL){
        primeiro=(struct lista *)malloc(sizeof(lista)); /* Cria um nó na lista*/
        cout<<"lista criada com sucesso. \n\n";
    }else{
        cout << "lista ja criada. \n\n";
    }
}

void Imprimir(){

     if(primeiro==NULL){

        cout<<" lista vazia";
    }else{

        atual=primeiro;
        cout<< "Elementos Inseridos na Lista\n\n";

        while(atual!=NULL){
            cout<<atual->elemento<< "\n\n";
            atual=atual->proximo;
        }
    }

}

void InserirElemento(){
    int i;
    atual=primeiro;

    if(atual==NULL){ /* Verifica se a lista foi criada*/
        cout << "lista ainda nao criada \n\n";
    }else{
        while(i!=0){

            while(atual->proximo!=NULL){
                atual=atual->proximo;
            }

            cout<<"Insira um elemento na lista: \t";
            cin>>atual->elemento;


            cout<<"\n";
            cout<<"deseja inserir outro elemento na lista 1/0:  \t";
            cin>>i;
            if(i==1){
                NovaLista=(lista*)malloc(sizeof(lista));
                atual->proximo=NovaLista;
            }
            cout<<"\n";


        }
    }
}

1 answer

0

Good afternoon Fire,

So let’s go in pieces:

First: skip the insert element function

This is happening because you said the condition to enter the while is that the variable i is different from 0, but you didn’t start it, so you don’t enter the insertion loop.

Corrected code:

void InserirElemento(){
  int i=1; //Inicializando a variável para garantir que ela entre no loop
  atual=primeiro;

  if(atual==NULL){ /* Verifica se a lista foi criada*/
      cout << "lista ainda nao criada \n\n";
  }else{
      while(i!=0){

          while(atual->proximo!=NULL){
              atual=atual->proximo;
          }

          cout<<"Insira um elemento na lista: \t";
          cin>>atual->elemento;


          cout<<"\n";
          cout<<"deseja inserir outro elemento na lista 1/0:  \t";
          cin>>i;
          if(i==1){
              NovaLista=(lista*)malloc(sizeof(lista));
              atual->proximo=NovaLista;
          }
          cout<<"\n";


      }
  }
} 

Second: Why my code does not work on Ubunto?

Windows and Linux are different operating systems, and therefore use different architectures. In case, your code does not run for a compatibility problem, I will not go into much detail as it is a somewhat complex subject, but to solve this problem you can search for the C++ commands that work on Linux and replace in your code.

I hope I’ve helped!

Hugs!

Browser other questions tagged

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