PDA

Ver la versión completa : Duda programa C



FlipFlopX
05/06/2010, 08:03
Buenas famigos, llevo toda la noche con un programilla en C y entre los manuales de listas enlazadas y ejemplos no consigo avanzar.
Básicamente es un procedimiento para borrar nodos de una lista enlazada, recibo el pid y me cargo el nodo que tenga ese pid. Lo que no consigo saber es como borrar un nodo intermedio o el final sin cargarme la lista, lo que tengo subrayado no me funciona ya que con eso si quiero eliminar el último nodo, elimino todos menos el inicial, y si quiero eliminar un nodo intermedio elimino el intermedio y el anterior, que lio :confused:

//////////////////PROCESO BORRAR//////////////////////////////
void borrar(int pid){
struct proceso *primero;
struct proceso *auxiliar;//Usamos para recorrer lista
struct proceso *anterior;
int i;
i=0;//Con este indice podemos ver la posicion del nodo si i=0 es que eliminamos primer nodo
auxiliar=lista;//cargamos lista en auxiliar;
anterior=lista;
while(auxiliar!=NULL){
if((pid==(auxiliar->pid))&&(i==0)){//BORRAMOS EL PRIMER ELEMENTO
lista=auxiliar->siguiente;
}


if(pid==(auxiliar->pid))
if(i!=0){//BORRAMOS CUALQUIER NODO PERO NO INICIAL
anterior->siguiente=auxiliar->siguiente;
}
i++;
auxiliar=auxiliar->siguiente;
}
if(i==0) printf("\nLa lista esta vacia!!");
}

Solucionado con:
CODE]//////////////////PROCESO BORRAR//////////////////////////////
void borrar(int pid){
struct proceso *primero;
struct proceso *auxiliar;//Usamos para recorrer lista
struct proceso *anterior;
int i;
i=0;//Con este indice podemos ver la posicion del nodo si i=0 es que eliminamos primer nodo
auxiliar=lista;//cargamos lista en auxiliar;
anterior=lista;
while(auxiliar!=NULL){
if((pid==(auxiliar->pid))&&(i==0)){//BORRAMOS EL PRIMER ELEMENTO
lista=auxiliar->siguiente;
}


if(pid==(auxiliar->pid))
if(i!=0){//BORRAMOS CUALQUIER NODO PERO NO INICIAL
anterior->siguiente=auxiliar->siguiente;
}
i++;
anterior=auxiliar;
auxiliar=auxiliar->siguiente;
}
if(i==0) printf("\nLa lista esta vacia!!");
} [/CODE]

Sigo sin entender bien las dichosas listas y no sé bien porque ahora me va..

juanvvc
05/06/2010, 11:36
Hombre, antes no funcionaba porque "anterior" no lo cambiabas nunca, así que siempre apuntaba al principio de la lista y siempre borrabas del segunda para adelante :)

De todas maneras esta propuesta tiene un problema grave: en realidad no estás borrando nada, solo apuntando a nuevos nodos. Los nodos que "borras" en realidad se quedan en memoria ocupando espacio y con el tiempo se comerían toda la memoria del ordenador. Probablemente tengas que liberar memoria dentro de los if's para no tener problemas.

FlipFlopX
05/06/2010, 14:30
Hombre, antes no funcionaba porque "anterior" no lo cambiabas nunca, así que siempre apuntaba al principio de la lista y siempre borrabas del segunda para adelante :)

De todas maneras esta propuesta tiene un problema grave: en realidad no estás borrando nada, solo apuntando a nuevos nodos. Los nodos que "borras" en realidad se quedan en memoria ocupando espacio y con el tiempo se comerían toda la memoria del ordenador. Probablemente tengas que liberar memoria dentro de los if's para no tener problemas.

Oído cocina, free(auxiliar) de ingrediente

FlipFlopX
06/06/2010, 21:48
Bueno pues otra dudilla en otro módulo, en la lista se van ordenando los nodos de manera creciente según pri, si llega un nodo con igual pri que otros, éste se pondrá al final de los mismos. Bueno, no sé si me he explicado bien, pues el módulo me funciona salvo en el caso de que quiera añadir un nodo con igual prioridad que el primero..Pego el código y lo que me falla


////////ANADIR/////////////////
void add(struct proceso *nuevo) {

int pri, ciclos;
pid++;
nuevo = (struct proceso *) malloc (sizeof(struct proceso));//Reservamos memoria
if (nuevo==NULL) printf("\nNo hay memoria suficiente!");

(nuevo->pid)=pid;
printf("\nIntroduce prioridad: ");
scanf("%i",&pri);
(nuevo->pri)=pri;
printf("\nIntroduce numero de ciclos: ");
scanf("%i",&ciclos);
(nuevo->ciclos)=ciclos;
///El campo siguiente sera NULL por ser el ultimo de la lista
nuevo->siguiente=NULL;
///Ahora metemos el elemento nuevo en la lista

if((lista==NULL)||((lista->pri)>pri)){//Lista vacia o se añadira en primer lugar
nuevo->siguiente=lista;
lista=nuevo;
}


/////////////////////////Se añade en otro lugar
if(((lista->pri)<(pri))||(lista->pri==pri)){
anterior=lista;//cargamos la lista en anterior;
//Avanzamos hasta el ultimo elemento o hasta que eñ siguiente tenga una prioridad mayor
while ((anterior->siguiente!=NULL) && (anterior->siguiente->pri < pri || anterior->siguiente->pri == pri)){
anterior=anterior->siguiente;
}
//Insertamos el nodo a continuacion
nuevo->siguiente=anterior->siguiente;
anterior->siguiente=nuevo;
}


}

Si añado lo remarcado, es decir nodo con misma prioridad a continuación del 1º, no me rula y ni idea de porqué :loco:

swapd0
07/06/2010, 23:21
Creo que asi funciona, lo he hecho de cabeza:


if( lista==NULL || lista->pri>pri )
{
//Lista vacia o se añadira en primer lugar
nuevo->siguiente=lista;
lista=nuevo;
}
else
{
//cargamos la lista en anterior;
anterior=lista->siguiente;

//Avanzamos hasta el ultimo elemento o hasta que
// eñ siguiente tenga una prioridad mayor
while (anterior && anterior->siguiente->pri < pri)
anterior=anterior->siguiente;

//Insertamos el nodo a continuacion
nuevo->siguiente=anterior->siguiente;
anterior->siguiente=nuevo;
}