c++ - 如何删除链表中用户指定的数据节点?
问题描述
在函数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;
}
解决方案
自己修好了,拜拜。
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
}
推荐阅读
- javascript - 无法将数据传递给 chart.js 图表
- opencv - 使用 Yocto 的 OpenCV 4.4.0 构建错误
- pytorch - PyTorch:在哪些情况下 register_hook 可以返回无梯度?
- sql - 在 SQL WHERE 子句中将值与自身进行比较是否会失败
- python-3.x - 是否可以对 python 字符串进行惰性格式化?
- discord.py - Discord.py 命令前缀不调用命令?
- r - R 新手。我有一组来自 Stata 的代码,我想在 R 中重现
- javascript - 如何将 JSON 数组存储到本地存储
- ipa - iOS 14 - 无法加载 ipa(Apple Developer Enterprise Program)
- windows - 自签名 SSL 证书适用于 IE 和 curl,但不适用于现代浏览器