• Lunes 18 de Noviembre de 2024, 10:35

Autor Tema:  Lista Circulares  (Leído 1394 veces)

RoChIsA

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Lista Circulares
« en: Miércoles 4 de Abril de 2007, 00:39 »
0
hola quisiera que alguin me ayude a convertir el codigo que dare a conocer de lista simple a lista circular es urgente si estoy pidiendo esta ayuda es por que soy prioncipiante en este tema espero que alguin me ayude

//inserta un dato despues de saber cual es la referencia
void insertarant()
{
 int dato;
 char x,v,f;
 if(x==v)
 {
  cout<<endl;
 cout<<"\nAntes de Referencia\n";
 cout<<"Ingresar Dato:";
 cin>>dato;
  if(q==p)
  {
   q=new nodo;
   q->inf=dato;
   q->liga=p;
   p=q;
  }
  else
  {
   q=new nodo;
   q->inf=dato;
   q->liga=t->liga;
   t->liga=q;
   t=q;
  }
 }
 else
 cout<<"No existe referencia";
}

solo me fata este modulo espero que alguin me ayude es urgente por favor

Bicholey

  • Moderador
  • ******
  • Mensajes: 1234
    • Ver Perfil
Re: Lista Circulares
« Respuesta #1 en: Miércoles 4 de Abril de 2007, 01:07 »
0
&lt;_&lt;  &lt;_&lt;  &lt;_&lt;

Que acaso esto no ya se habia publicado ?????


bueno ahi te va:
Citar
Primero que nada te recomiendo que leas algun libro de C++ y con respecto a tu duda lo que tienes que hacer al insertar es que el ultimo nodo apunte a la raiz y al eliminar que el nodo anterior apunte al nodo actual (el que se quiere eliminar) en su parte siguiente, liberar la memoria del nodo que quieres eliminar y problema resuelto.

mas informacion aqui:

http://c.conclase.net/edd/index.php?cap=004

si no sabes nada, date el tiempo de leer el vinculo.
[size=109]LOS GATOS SIEMPRE CAEMOS DE PIE !!![/size]


Karman

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
    • http://www.inexinferis.com.ar
Re: Lista Circulares
« Respuesta #2 en: Jueves 5 de Abril de 2007, 16:49 »
0
fijate si esto te sirve:

Código: Text
  1.  
  2.  
  3. #include &#60;stdlib.h&#62;
  4. #include &#60;stdio.h&#62;
  5.  
  6. typedef struct nodo{
  7.   int dato;
  8.   struct nodo *prox;  
  9. }*punt,nd;
  10.  
  11. punt p,ant,t,prim;
  12. char tc;int dt;
  13.  
  14. int main(int argc, char *argv[])
  15. {
  16.   prim=NULL;
  17.  
  18.   do{
  19.    
  20.     printf(&#34;&#092;n&#092;nLista Circular 1.0&#092;n&#092;n&#34;);
  21.     printf(&#34;  1 - Buscar&#092;n&#34;);
  22.     printf(&#34;  2 - Insertar&#092;n&#34;);
  23.     printf(&#34;  3 - Eliminar&#092;n&#34;);
  24.     printf(&#34;  4 - Listar&#092;n&#34;);
  25.     printf(&#34;  5 - Terminar&#092;n&#092;n&#34;);
  26.     printf(&#34;Seleccione su Opción: &#34;);
  27.    
  28.     do scanf(&#34;%1s&#34;,&tc);while(tc&#60;'1'&&tc&#62;'5');
  29.    
  30.     if(tc&#62;='1'&&tc&#60;'4'){
  31.       printf(&#34;&#092;n&#092;nDato: &#34;);
  32.       scanf(&#34;%d&#34;,&dt);
  33.     }
  34.  
  35.     switch(tc){
  36.       case '1':  
  37.         if(!prim)printf(&#34;&#092;nError lista vacía&#092;n&#34;);
  38.         else{        
  39.           t=prim;
  40.           while(t-&#62;prox!=prim &&(t-&#62;dato!=dt))t=t-&#62;prox;
  41.          
  42.           if(t-&#62;dato!=dt)printf(&#34;No se encuentra dato.&#092;n&#34;);
  43.           else printf(&#34;Valor %d hallado.&#092;n&#34;,dt);
  44.         }
  45.       break;
  46.       case '2':
  47.         p=new nd;
  48.         p-&#62;dato=dt;
  49.         if(!prim){
  50.           p-&#62;prox=p;
  51.           prim=p;
  52.         }else{
  53.           p-&#62;prox=prim-&#62;prox;
  54.           prim-&#62;prox=p;
  55.         }
  56.       break;
  57.       case '3':
  58.         if(!prim)printf(&#34;&#092;nError lista vacía&#092;n&#34;);
  59.         else{        
  60.           t=prim;
  61.           while(t-&#62;prox!=prim && t-&#62;dato!=dt){ant=t;t=t-&#62;prox;}
  62.          
  63.           if(t-&#62;dato!=dt)printf(&#34;&#092;nNo se encuentra dato.&#34;);
  64.           else {
  65.             if(t-&#62;prox==t)prim=NULL;
  66.             else            
  67.               if(t==prim){
  68.                 p=prim;
  69.                 while(p-&#62;prox!=prim)p=p-&#62;prox;
  70.                 prim=t-&#62;prox;
  71.                 p-&#62;prox=prim;
  72.               }else ant-&#62;prox=t-&#62;prox;    
  73.             delete t;
  74.           }
  75.         }
  76.       break;
  77.       case '4':
  78.         if(!prim)printf(&#34;&#092;nError lista vacía&#092;n&#34;);
  79.         else{
  80.           t=prim;
  81.           while(t-&#62;prox!=prim){
  82.             printf(&#34;&#092;nDato: %d&#34;,t-&#62;dato);
  83.             t=t-&#62;prox;  
  84.           }
  85.           printf(&#34;&#092;nDato: %d&#34;,t-&#62;dato);
  86.          
  87.         }
  88.       break;
  89.      
  90.     }
  91.   }while(tc!='5');
  92.  
  93.   t=prim;
  94.   while(t){
  95.     p=t;
  96.     t=t-&#62;prox;
  97.     delete p;
  98.   }
  99.  
  100.   system(&#34;PAUSE&#34;);
  101.   return EXIT_SUCCESS;
  102. }
  103.  
  104.  
  105.  

S2

exjoe

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Lista Circulares
« Respuesta #3 en: Jueves 12 de Abril de 2007, 07:57 »
0
Lo unico que tienes que hacer es cambiar como enlazas los punteros,
1-debes detener un puntero que te indique si la lista contine algun elemento o no
(un punteroa lista -yo usu prim) con ele objetivo de empezar a insertar depues del mismo.
2-cuando insertas por primera vez el puntero prim se actualiza con el nuevo nodo que creaste, suponiendo que el nodo creado es q, seria:

prim=q;
q->prox=prim;//o bien prim->prox=prim

En este caso prox es el puntero al siguiente nodo

3-Si vas a insertar y tu lista ya contine nodos o sea, ya has insertado a lmenos una ves seria.(Recuerda que q es el nuevo nodo a insertar, en este caso)

prim->prox=q;
q->prox=prim;
prim=q;     //actualiza de forma tal que prim apuntara al nodo actual, o sea al que cacabas de insertar.

Espero te ayude..