Dev - C++ - dude sobre un error tema:listas simples y apuntadores

 
Vista:
sin imagen de perfil
Val: 6
Ha disminuido su posición en 6 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

dude sobre un error tema:listas simples y apuntadores

Publicado por tian long (3 intervenciones) el 23/04/2020 02:44:45
hola necesito ayuda con este codigo que se supone que debe crear una lista dinamica o uqe permita ingresar cuantos números se requiera y que elimine los repetidos un ejemplo se tiene la siguiente listas
1 2 3 5 2 3 4 1 6 y al eliminar los repetidos quedar asi 5 4 6
pero aqui esta el error al eliminar los repetidos si elimina el primer numero de la lista en programa deja de funcionar
si alguien me podría ayudar se lo agradecería o decir una forma de solucionarlo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
 
using namespace std;
 
struct nodo{   //creación del nodo para crear listas
	int dato;
	struct nodo *enlace;
};
 
void imprimir_lista(struct nodo *primero){
	while(primero != NULL){
		cout << primero->dato<<endl; //muestra la informacion
		primero = primero->enlace; //pone el apuntador en el primer dato
 
	}
}
 
void eliminar_nodo(struct nodo *primero, int valor ){
	struct nodo *q, *r;
	q=primero;
	cout<<"eliminar "<<valor<<endl;
 
	while(q != NULL){
		cout<<"Entro "<<q->dato<<endl; //imprime el numero repetido
		if((q->dato == valor)&&(q == primero)){
			primero = primero->enlace;
 
		}
		if(q->dato == valor){
 
			r = primero;
			while (r->enlace != q){
				r=r->enlace;
			}
			r->enlace = q->enlace;
			delete(q);
			q=primero;
		}
		q = q->enlace;
		system("PAUSE");
	}
 
 
	//imprimir_lista(primero);
	while(primero != NULL){
		cout << primero->dato<<endl; //muestra la informacion
		primero = primero->enlace;
 
	}
}
 
void buscar_repetido(struct nodo *primero){
	struct nodo *q, *r;
	q = primero;
	while (q != NULL){
		r = q->enlace;
		while(r != NULL){
			if(r->dato == q->dato){ //si el dato que hay el el apuntador r es el mismo que la cabeza "q" entre al if
				eliminar_nodo(primero, r->dato); //llama a la funcion eliminar nodo
				q=primero;//iguala el apuntador al inicio
				r=primero;//iguala el apuntador al unicio
			}
			r=r->enlace;
		}
		q=q->enlace;
	}
 
 
}
 
main(){
	struct nodo *cab, *nuevo, *ult, *p; //apuntadores de trabajo
	char desea;
 
 
	cab = new struct nodo();  // reserva espacio de memoria para almacenar información
	cout<< "Digite el valor: ";
	cin >> cab->dato;  // asigna un valor al espacio reservado
	ult = cab;  // asigna el apuntador ult al mismo lugar donde esta apuntando cab
 
	cout << "Desea continuar? s/n: ";
	cin >> desea;
 
	while(desea == 's' || desea == 'S'){
		nuevo = new struct nodo(); //creando nodo nuevo
		cout<< "Digite el valor: ";
		cin >> nuevo->dato;
		ult->enlace = nuevo; // conecta los dos nodos creados
		ult = nuevo;  //moviendo el apuntador ult al lugar del apuntador nuevo
 
		cout << "Desea continuar? s/n: ";
		cin >> desea;
 
	}
 
	ult->enlace = NULL;
	p=cab;   //ubica el apuntador p al inicio de la lista
	imprimir_lista(p);
	p=cab;
	buscar_repetido(p);
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder