Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/04/2010, 19:06
batiguason
 
Fecha de Ingreso: marzo-2010
Mensajes: 10
Antigüedad: 14 años, 1 mes
Puntos: 0
ayuda con listas dinamicas en C :)

Veran tengo el siguiente código pero me falla al intentar insertar en orden me sale mi error favorito segmentation fault la clase solo tuve 1 hora asi que no entendi bn mi clase se lo que significa el error pero no se porque me lo da :S me podrian ayudar porfavor aca dejo mi código y antes que lo olvide al eliminar datos mi código no me funciona para el primer y último nodo

Código:
/*  ************************************ 
    Programa que crea una lista simplemente ligada insertando nodos al inicio de la lista, y
    elimina el nodo que esta al final de la lista, ademas incluye una rutina que permite listar el contenido
    de la lista ligada.
    ************************************ */
#include <stdio.h>
#include <stdlib.h>

typedef struct n{
       int dato;
       struct n *sig;
       }NODO;
 
NODO *raiz;

void insertaInicio(int d) {
  NODO *aux;
  
  aux=(NODO *)malloc(sizeof(NODO));
  aux->dato=d;
  aux->sig=NULL;
  if (raiz==NULL) raiz=aux;
  else {
    aux->sig=raiz;
    raiz=aux;
  }
}      

void imprimeLista() {
  NODO *aux;
  
  aux=raiz;
  printf("\nImprime");
  while (aux!=NULL) {
    printf("\nDato: %d", aux->dato);
    aux=aux->sig;
  }
}
void eliminar() {
	int eliminar;
	NODO *auxiliar,*anterior;
	printf("\nQue dato desea eliminar ?");
	scanf("%i",&eliminar);
	printf("\n%i",eliminar);
	auxiliar=raiz;
	anterior=raiz;
	while(auxiliar->sig!=NULL) {
		printf("\nciclo bien");
		if(auxiliar->dato == eliminar){
				printf("\nentre");
				anterior->sig=auxiliar->sig;
				free(auxiliar);
				break;
		}	
		anterior=auxiliar;
		auxiliar=auxiliar->sig;
	}
	if (eliminar==auxiliar->dato){
		
	}
}
void insertar_orden(int nuevo_valor) {
	NODO *auxiliar,*nuevo_nodo,*anterior;
	auxiliar=raiz;
	anterior=raiz;
	nuevo_nodo=(NODO *)malloc(sizeof(NODO));
	nuevo_nodo=raiz;
	if(auxiliar==NULL) {
		auxiliar->dato=nuevo_valor;
		auxiliar->sig=raiz;
	}
	else 
		if(auxiliar->sig==raiz)
			if (auxiliar->dato>nuevo_valor) {
				nuevo_nodo->dato=nuevo_valor;
				nuevo_nodo->sig=auxiliar;
				auxiliar->sig=NULL;
			}
			else {
				nuevo_nodo->dato=nuevo_valor;
				auxiliar->sig=nuevo_nodo;
				nuevo_nodo->sig=NULL;
			}
		else {
			while(auxiliar->sig!=NULL) {
				if (nuevo_valor < auxiliar->dato){
					nuevo_nodo->dato=nuevo_valor;
					anterior->sig=nuevo_nodo;
					nuevo_nodo->sig=auxiliar;
					break;
				}
				anterior=auxiliar;
				auxiliar=auxiliar->sig;
			}
			if (auxiliar->sig==NULL) {
				nuevo_nodo->dato=nuevo_valor;
				auxiliar->sig=nuevo_nodo;
				nuevo_nodo->sig=NULL;
			}
		}
}
void eliminaFinal() {
     NODO *aux;
     NODO *ant;
     
     aux=raiz; 
     ant=raiz;
     if (raiz!= NULL) {  //la lista no esta vacia
       while (aux->sig !=NULL)  {
         ant=aux;     
         aux=aux->sig;
       }       
       if (raiz->sig==NULL) {
         free(aux);    //quiere decir que la lista solo tiene un nodo
         raiz=NULL;
       }
       else {
         free(aux);
         ant->sig=NULL;
       }
     }
}

main() {
	int i,valor;
  raiz=NULL;
	for (i=0;i<=5;i++) {
		printf("\nDame el valor a insertar ");
		scanf("%i",&valor);
		insertar_orden(valor);
	}
	eliminar();
  imprimeLista();
  getchar();
}
Desde ya muchas gracias :D