Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Lokirs en 7 Junio 2011, 23:24 pm



Título: Listas - Ayuda porfavor [Dev C++]
Publicado por: Lokirs en 7 Junio 2011, 23:24 pm
Buenas tardes.

Amigos alguien de buena voluntad podria ayudarme con una duda ya que mi profesor se niega a ayudarme y no tengo con quien apoyarme y no encuentro lo nesesario en tutoriales.

Problema: Debo crear un Menu de opciones, Crear nodo, Eliminar nodo, Mostrar nodos, Salir.

Tengo todo hecho pero la idea es que al crear el nodo salgan 3 opciones mas:
Insertar al inicio, Insertar entre (num,num) y insertar alfinal. Eso es lo que me tiene complicado como hacerlo con listas... tengo todo el codigo hecho en Dev C++ lo dejo por siacaso... estoy muy complicado


La más complicada es insertar entre (num,num) alguna idea? talvez modificando las funciones... lo intente y nada u.u

Código
  1. #include <stdlib.h>
  2. #include <conio.h>
  3. #include <stdio.h>
  4. #include<windows.h>
  5.  
  6. typedef struct _nodo {
  7. int dato;
  8. struct _nodo *siguiente;
  9. } tiponodo;
  10. typedef tiponodo *pnodo;
  11. typedef tiponodo *Lista;
  12.  
  13.  
  14. void Insertar(Lista *l, int v);
  15. void Borrar(Lista *l, int v);
  16. void BorrarLista(Lista *);
  17. void MostrarLista(Lista l);
  18.  
  19.  
  20. main(){
  21.  
  22.   system("Color 1A");
  23.   Lista lista = NULL;
  24.   pnodo p;
  25.   int i=0; //Contador para agregar nodos
  26.   int nusuario=0;
  27.   int nborrar=0;
  28.   int ciclo=1;
  29.   int op=0;
  30.   int ops=0;
  31.  
  32.       while(ciclo==1){
  33.  
  34.          printf("**********  MENU  **********\n\n\n\n");
  35.          printf(" 1) Crear nodo \n");
  36.          printf(" 2) Eliminar\n");
  37.          printf(" 3) Mostrar\n");
  38.          printf(" 4) Salir\n\n\n\n\n");
  39.  
  40.          printf("Opcion: ");
  41.          scanf("%d",&op);
  42.          system("cls");
  43.  
  44.          if(op==1){
  45.  
  46.             printf("\n\n 1) Insertar al inicio \n");
  47.             printf(" 2) Insertar al medio\n");
  48.             printf(" 3) Insertar al final\n");
  49.             printf("Opcion:");
  50.             scanf("%d",&ops);
  51.  
  52.             if(ops==1){
  53.                 system("cls");
  54.                 printf("nada");
  55.             }
  56.  
  57.         i=i+1; //Contador que indicara la cantidad de numeros ingresados
  58.             printf(" \nIngrese un numero %d: ",i);
  59.             scanf("%d",&nusuario);
  60.             Insertar(&lista, nusuario);
  61.  
  62.          }
  63.  
  64.      if(op==2){
  65.  
  66.             printf("\n Ingrese numero que desea borrar: ");
  67.     scanf("%d",&nborrar);
  68.     Borrar(&lista,nborrar);
  69.  
  70.          }
  71.  
  72.      if(op==3){
  73.  
  74.     MostrarLista(lista);
  75.             getchar();
  76.      }
  77.  
  78.      if(op==5){
  79.  
  80.     ciclo=2;
  81.  
  82.          }
  83.  getchar();
  84.  
  85.      }
  86.  
  87. }
  88.  
  89.  
  90.  
  91. void Insertar(Lista *lista, int v){
  92.  
  93.    pnodo nodo;
  94.    nodo = (pnodo)malloc(sizeof(tiponodo));
  95.    nodo->dato = v;
  96.    if(*lista == NULL) *lista = nodo;
  97.    else nodo->siguiente = (*lista)->siguiente;
  98.    (*lista)->siguiente = nodo;
  99.  
  100. }
  101.  
  102. void Borrar(Lista *lista, int v){
  103.    pnodo nodo;
  104.    nodo = *lista;
  105.    do{
  106.  
  107.   if((*lista)->siguiente->dato != v) *lista = (*lista)->siguiente;
  108.  
  109.    }while((*lista)->siguiente->dato != v && *lista != nodo);
  110.  
  111.    if((*lista)->siguiente->dato == v){
  112.   if(*lista == (*lista)->siguiente){
  113.  free(*lista);
  114.  *lista = NULL;
  115.   }
  116.       else{
  117.      nodo = (*lista)->siguiente;
  118.      (*lista)->siguiente = nodo->siguiente;
  119.      free(nodo);
  120.       }
  121.    }
  122. }
  123.  
  124. void BorrarLista(Lista *lista){
  125.    pnodo nodo;
  126. while((*lista)->siguiente != *lista) {
  127. nodo = (*lista)->siguiente;
  128. (*lista)->siguiente = nodo->siguiente;
  129. free(nodo);
  130. }
  131. free(*lista);
  132. *lista = NULL;
  133. }
  134.  
  135. void MostrarLista(Lista lista){
  136.    pnodo nodo = lista;
  137. do {
  138.   printf("%d -> ", nodo->dato);
  139.   nodo = nodo->siguiente;
  140. } while(nodo != lista);
  141. printf("\n");
  142. }

De antemano gracias


Título: Re: Listas - Ayuda porfavor [Dev C++]
Publicado por: Don Pollo en 8 Junio 2011, 12:20 pm
Para insertar entre el nodo1 y el nodo2 lo que debes hacer es crear un nuevo nodo3 y hacer que el puntero de éste apunte al mismo sitio donde apunta el nodo1, depués haces que el puntero del nodo1 apunte al nuevo nodo3 y ya tienes tu nuevo nodo metido en medio de los dos anteriores.

Es importante que lo hagas en el orden que te he dicho ya que si no se perdería el puntero que apunta al nodo2 y la lista se partiría en dos.