首页 > 解决方案 > 如何删除链表中用户指定的数据节点?

问题描述

在函数void eliminarXdato()中,将要求用户输入一个数字,如果该数字与在链表结构cedula中找到的数字相同,它将删除它们。这个问题可能是合乎逻辑的,每当我尝试初始化所述函数时,它就会崩溃并突然结束程序,所以我不知道为什么。

我试图省略未使用的功能。

warning: ‘cab’ may be used uninitialized in this function

cab 打算担任团长。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
#include <windows.h>

using namespace std;

void menu();
void ingresar();

// void mostrar();
// void eliminarInicio();
// void eliminarCentral();
// void eliminarFinal();

void eliminarXdato();

// void funcionLeccion();

struct nodo
{
    int cedula; // cedula aka data
    struct nodo* nxt;
};

typedef struct nodo* lista;

lista cab, aux, aux1;
int opc = 0;

/*
int contador(struct nodo* cab)
{
    int cont = 0;
    while (cab != NULL) {
        cab = cab->nxt;
        cont++;
    }
    return cont;
}
*/

int main()
{
    menu();
    return 0;
}

void menu()
{
    system("cls");
    do
    {
        printf("MENU PRINCIPAL\n\n");
        printf("1. Ingresar nuevos datos\n");
        printf("2. Mostrar la lista\n");
        printf("3. Eliminar el primer dato de la lista (Mas antiguo)\n");
        printf("4. Eliminar el dato central de la lista\n");
        printf("5. Eliminar el ultimo dato de la lista (Mas nuevo)\n");
        printf("6. Eliminar dato el deseado de la lista\n");
        printf("7. Terminar el proceso\n");
        cin >> opc;

        switch (opc)
        {
            case 1:
                ingresar();
                break;
            case 2:
                mostrar();
                break;

/*          case 3: eliminarInicio();
                break;
            case 4: eliminarCentral();
                break;
            case 5: eliminarFinal();
                break;
*/
            case 6:
                eliminarXdato(); // function
                break;
            default:
                break;
        }
    } while (opc != 7);
}

void ingresar()
{
    do
    {
        system("cls");
        aux = new (struct nodo);

        cout << "Cedula del ciudadano\n\nIngrese la cedula: \n";
        cin >> aux->cedula;

        aux->nxt = NULL;

        if (cab == NULL)
        {
            cab = aux;
        }
        else
        {
            aux1->nxt = aux;
        }

        aux1 = aux;

        cout << "Desea agregar mas personas? [si=1/no=2]"; // TL: add more data?
        cin >> opc;

        system("cls");
    } while (opc == 1);
}

void eliminarXdato()
{
   // lista cab, aux, aux1;
    int tkn = 0; // tried to use tkn for equal value check

    cout << "Ingrese la cedula a eliminar: \n";
    cin >> tkn;

    if (cab != NULL && cab->cedula == tkn)
    {
        cab = cab->nxt;
        delete cab;
    }

    while (cab != NULL && cab->cedula != tkn)
    {
        aux1 = cab;
        cab = cab->nxt;
    }

    if (cab == NULL)
        aux1->nxt = cab->nxt;

    delete cab;
}

标签: c++data-structureslinked-listsingly-linked-list

解决方案


自己修好了,拜拜。

void eliminarXdato(){
    
    aux=cab; // initialize stuff
    int tkn = 0;
  
    cout<<"Ingrese la cedula a eliminar: \n";
    cin>> tkn;

    if (aux != NULL && aux->cedula == tkn) 
    { 
        cab = aux->nxt;   
        free(aux); // free function           
    } 
  
    while (aux != NULL && aux->cedula != tkn) 
    { 
        aux1 = aux; 
        aux = aux->nxt; 
    } 
  
    if (aux == NULL) return; 
    aux1->nxt = aux->nxt; 
    free(aux); // free function
}

推荐阅读