How do I resolve this error by trying to delete a specific node from a chained double list?

Asked

Viewed 81 times

0

In my project, I am making a double-padlock list in C, where it has simple objectives, such as adding at the beginning or end, removing a specific or zeroing.

I took a shallow code and was adding the modules I needed, using code Blocks.

Then in the part of adding the option delete the specific element, began to appear the errors that could no longer solve.

#include <stdio.h>
#include <stdlib.h>

struct Banco{
    int numero_conta;
    char nome_cliente[30];
    float saldo;
    struct Banco *atras;
    struct Banco *agora;
    struct Banco *prox;
    struct Banco *ant;
};
typedef struct Banco node;

void inicia(node *LISTA);
int menu(void);
void opcao(node *LISTA, int op);
node *criaNo();
void insereFim(node *LISTA);
void insereInicio(node *LISTA);
void exibe(node *LISTA);
void libera(node *LISTA);
void excluir (node *LISTA);


int main(void)
{
 node *LISTA = (node *) malloc(sizeof(node));
 if(!LISTA){
  printf("Sem memoria disponivel!\n");
  exit(1);
 }
 inicia(LISTA);
 int opt;

 do{
  opt=menu();
  opcao(LISTA,opt);
 }while(opt);

 free(LISTA);
 return 0;
}

void inicia(node *LISTA)
{
 LISTA->prox = NULL;
}

int menu(void)
{
 int opt;

 printf("Escolha a opcao\n");
 printf("0. Sair\n");
 printf("1. Exibir lista\n");
 printf("2. Adicionar cliente no inicio\n");
 printf("3. Adicionar cliente no final\n");
 printf("4. Zerar lista\n");
 printf("5. Excluir cliente especifico\n");
 printf("Opcao: "); scanf("%d", &opt);

 return opt;
}

void opcao(node *LISTA, int op)
{
 switch(op){
  case 0:
   libera(LISTA);
   break;

  case 1:
   exibe(LISTA);
   break;

  case 2:
   insereInicio(LISTA);
   break;

  case 3:
   insereFim(LISTA);
   break;

  case 4:
   inicia(LISTA);
   break;


  default:
   printf("Comando invalido\n\n");
 }
}

int vazia(node *LISTA)
{
 if(LISTA->prox == NULL)
  return 1;
 else
  return 0;
}


void insereFim(node *LISTA)
{
 node *novo=(node *) malloc(sizeof(node));
 if(!novo){
  printf("Sem memoria disponivel!\n");
  exit(1);
 }
 //Comeco ediчуo do professor
 printf("Numero conta: "); scanf("%d", &novo->numero_conta);
 printf("Nome: "); scanf("%s", novo->nome_cliente);
 printf("Saldo: "); scanf("%f", &novo->saldo);
 novo->prox = NULL;
 //Fim da ediчуo do professor

 if(vazia(LISTA))
  LISTA->prox=novo;
 else{
  node *tmp = LISTA->prox;

  while(tmp->prox != NULL)
   tmp = tmp->prox;

  tmp->prox = novo;
 }
}

void insereInicio(node *LISTA)
{
 node *novo=(node *) malloc(sizeof(node));
 if(!novo){
  printf("Sem memoria disponivel!\n");
  exit(1);
 }
 printf("Numero conta: "); scanf("%d", &novo->numero_conta);
 printf("Nome: "); scanf("%s", novo->nome_cliente);
 printf("Saldo: "); scanf("%f", &novo->saldo);

 node *oldHead = LISTA->prox;

 LISTA->prox = novo;
 novo->prox = oldHead;
}

void exibe(node *LISTA)
{
 if(vazia(LISTA)){
  printf("Lista vazia!\n\n");
  return ;
 }

 node *tmp;
 tmp = LISTA->prox;
//Edicao do professor ("%d %s %f\n", tmp->numero_conta, tmp->nome_cliente, tmp->saldo)
 while( tmp != NULL){
  printf("\n");
  printf("Numero conta: %d\n", tmp->numero_conta);
  printf("Nome: %s\n", tmp->nome_cliente);
  printf("Saldo: %f\n", tmp->saldo);
  printf("\n");
  tmp = tmp->prox;
 }
 printf("\n\n");
}

void libera(node *LISTA)
{
 if(!vazia(LISTA)){
  node *proxNode,
     *atual;

  atual = LISTA->prox;
  while(atual != NULL){
   proxNode = atual->prox;
   free(atual);
   atual = proxNode;
  }
 }
}

The first mistake is when I add:

case 5:
excluir(LISTA);
   break;

undefined reference to `excluir'

I’ve seen many tutorials, but none of them made me useful unfortunately.

Could someone help me ? How would it be to add a specific client Delete system in my code ?

Edit: I added this function

void excluir(LISTA* LISTA, int numero_conta) {
if (LISTA == 0)
    pop(list);
    else{
        node* atual = atPos (list, LISTA);

        if(atual !=null){
            node* atras = atual = atpost(list, LISTA - 1);
            atras->prox = atual->prox;

            free(atual)
                list-> menu --;
        }
    }
}

but the message appears error: Unknown type name 'LIST'|

  • where is the "delete function" ?

  • You set: void delete (Node LIST); but implemented: void delete(LIST LIST, int numero_conta) {. LIST is not a type, the type is Node and if there are two parameters you need to specify this in the function prototype.

3 answers

0

The code you presented is not from a double chained list, in fact the program contains a simple chained list with head, because although you have declared 4 pointers in struct Banco, two more than necessary, in the insertion functions you only use the pointer struct Banco *prox; and thus each of the list elements is connected only to the next element and not to the previous one.

And as the list has head, (I’ve always found head-to-head a waste of memory, but I agree it’s much easier to build and manage), the algorithm for deleting an element is relatively simpler. The code below probably solves your problem:

void excluir (node *LISTA, int n_conta){

   //verifica se a lista é vazia
   if (LISTA->prox == NULL){
      puts("Lista vazia!\n");
      return;
   }
   //procura o numero de conta na lista
   while(LISTA->prox){
      if(LISTA->prox->numero_conta == n_conta){
         break;
      }
      else LISTA = LISTA->prox;
   }

   //se o n. de conta não foi encontrado, informa o usuário
   if(LISTA->prox == NULL){
      puts("Numero de conta nao encontrado.");
   }
   //do contrário, exclui a conta da lista
   else{
      node* bufPtr = LISTA->prox;
      if(LISTA->prox->prox != NULL){
         LISTA->prox = LISTA->prox->prox;
      } else{
      LISTA->prox = NULL;
      }
      free(bufPtr);
      puts("Cliente excluido com sucesso!\n");
   }
   return;
}

0

I believe the implementation of the delete function is missing. This error occurs when you have the method call, but you do not have the implementation. It is implemented?

  • in fact I have tested several, but none gave success.]

  • And then I left without so that someone could give me a basis

  • So when I implemented the delete function here it was all right. You edited the post and included the method definition. But it’s wrong because LIST is no type. I believe you wanted to put. void excluir(node *LISTA)

0

Friend, apparently your delete function has not yet been implemented. If it has already been implemented and is in another part of the archive, please post here.

But here’s an example I did in Java:

(I know the question is for C, but since this code was already ready I put only for you to understand the logic that is the same if you have difficulty.)

public boolean ExcluirCandidato(int _p) 
{
    // Verifica se a posição informada para adicionar o novo nó é válida.
    if (_p < 0 && _p > this.getQuantidadeCandidatos()) {
        return false;
    }
    else{
        // Caso a quantidade de candidatos = 1, basta reinicializar.
        if (this.getQuantidadeCandidatos() == 1) {
            this.InicializarLista();
        }
        else
        {
            // Caso a posição seja igual a zero, iremos excluir o primeiro nó.

            No UA; // Usuário Atual

            if (_p == 0) {

               // Usuário atual = o próximo nó após o primeiro.
               UA = this.getInicioDaLista().getProximo();

               // Faz com que o ponteiro anterior receba null.
               UA.setAnterior(null);

               // Acessamos o primeiro nó e setamos o ponteiro próximo como null.
               this.getInicioDaLista().setProximo(null);

               // Mudamos o inicio da lista/
               this.setInicioDaLista(UA); 
            }
            else
            {
                // Caso seja a última posição, é o mesmo procedimento de forma inversa.

                if (_p == this.getQuantidadeCandidatos()-1) {

                    UA = this.getFinalDaLista().getAnterior();
                    UA.setProximo(null);

                    this.getFinalDaLista().setAnterior(null);
                    this.setFinalDaLista(UA);
                }
                else
                {
                    int C; // Contador
                    No PU;

                    // Remoção no meio da lista.

                    // Verificação de qual é o melhor lado para começar a percorrer a lista, inicio ou final.
                    if (_p <= (this.getQuantidadeCandidatos()/2)) {

                        C = 0;
                        UA = this.getInicioDaLista();

                        while(C < _p-1)
                        {
                            UA = UA.getProximo();
                            C++;
                        }

                        PU = UA.getProximo().getProximo();

                        UA.getProximo().setAnterior(null);
                        UA.getProximo().setProximo(null);

                        UA.setProximo(PU);
                        PU.setAnterior(UA);
                    }
                    else
                    {
                        C = this.getQuantidadeCandidatos()-1;
                        UA = this.getFinalDaLista();

                        while (C > _p) {                                
                            UA = UA.getAnterior();
                            C--;
                        }
                        PU = UA.getAnterior().getAnterior();

                        UA.getAnterior().setAnterior(null);
                        UA.getAnterior().setProximo(null);

                        UA.setAnterior(PU);
                        PU.setProximo(UA);
                    }
                }
            }
        }
    }
    // Diminuimos uma unidade de quantidade de candidatos;
    this.setQuantidadeCandidatos(this.getQuantidadeCandidatos()-1);
    return true;
}
  • eitcha, the question tag is C, not Java!

  • 1

    Yeah, buddy, I know. As I already had this code ready posted to help you understand the logic of exclusion, which in short is the same, what changes is the implementation, but there it is with him right.. I don’t think anyone’s gonna give the code away, not even C.

Browser other questions tagged

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