Operacion y mantenimiento de una lista

¿Has encontrado un error? ¿Tienes la solución? Deja tu correción ;-)

Antes de comentar: Gran parte de los ejercicios propuestos no tienen librerías debido a que Wordpress las eliminó al verlas como etiquetas HTML. Si sabes/tienes/conoces las librerías que hacen falta, déjalo en los comentarios. Y lo mas importante: Todos los ejemplos fueron realizados por estudiante con únicamente conocimiento básico del lenguaje, no de programación.

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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#include <stdio.h>
#include <stdlib.h>
 
/* estructura auto_referenciada */
struct nodoLista {               char dato; /* cada nodoLista contiene un caracter */
   struct nodoLista *ptrSiguiente; /* apuntador al siguiente nodo */ 
}; /* fin de la estructura nodoLista */
 
typedef struct nodoLista NodoLista; /* sinónimo para la estructura nodoLista */typedef NodoLista *ptrNodoLista; /* sinónimo para de NodoLista* */
 
/* prototipos */
void insertar( ptrNodoLista *ptrS, char valor );
char eliminar( ptrNodoLista *ptrS, char valor );int estaVacia( ptrNodoLista ptrS );
void imprimeLista( ptrNodoLista ptrActual );
void instrucciones( void );
 
int main(){ 
   ptrNodoLista ptrInicial = NULL; /* inicialmente no existen nodos */
   int eleccion;  /* eleccion del usuario */
   char elemento; /* carácter introducido por el usuario */
    instrucciones(); /* despliega el menú */
   printf( "? " );
   scanf( "%d", &eleccion );
 
   /* repite mientras el usuario no elija 3 */   while ( eleccion != 3 ) { 
 
      switch ( eleccion ) { 
 
         case 1:            printf( "Introduzca un caracter: " );
            scanf( "n%c", &elemento );
            insertar( &ptrInicial, elemento ); /* inserta el elemento en la lista */
            imprimeLista( ptrInicial );
            break; 
         case 2:
 
            /* si la lista no esta vacía */
            if ( !estaVacia( ptrInicial ) ) {                printf( "Introduzca un caracter para eliminar: " );
               scanf( "n%c", &elemento );
 
               /* si encuentra el caracter, lo remueve */
               if ( eliminar( &ptrInicial, elemento ) ) { /* elimina elemento */                  printf( "caracter %c eliminado.n", elemento );
                  imprimeLista( ptrInicial );
               } /* fin de if */
               else {
                  printf( "no se encuentra el caracter %c.nn", elemento );               } /* fin de else */
 
            } /* fin de if */
            else {
               printf( "La lista esta vacia.nn" );            } /* fin de else */
 
            break;
 
         default:            printf( "Opcion invalida.nn" );
            instrucciones();
            break;
      
      } /* fin de switch */ 
      printf( "? " );
      scanf( "%d", &eleccion );
   } /* fin de while */
    printf( "Fin de la ejecucion.n" );
   
   return 0; /* indica terminación exitosa */
 
} /* fin de main */ 
/* despliega las instrucciones del programa para el usuario */
void instrucciones( void )
{ 
   printf( "Introduzca su eleccion:n"      "   1 para insertar un elemento en la lista.n"
      "   2 para eliminar un elemento de la lista.n"
      "   3 para terminar.n" );
} /* fin de la función instrucciones */
 /* Inserta un nuevo valor dentro de la lista en orden  */
void insertar( ptrNodoLista *ptrS, char valor )
{ 
   ptrNodoLista ptrNuevo;    /* apuntador a un nuevo nodo */
   ptrNodoLista ptrAnterior; /* apuntador a un nodo previo de la lista */   ptrNodoLista ptrActual;   /* apuntador al nodo actual de la lista */
 
   ptrNuevo = malloc( sizeof( NodoLista ) ); /* crea un nodo */
 
   if ( ptrNuevo != NULL ) {    /* es espacio disponible */      ptrNuevo->dato = valor;   /* coloca el valor en el nodo */
      ptrNuevo->ptrSiguiente = NULL; /* el nodo no se liga a otro nodo */
 
      ptrAnterior = NULL;
      ptrActual = *ptrS; 
      /* ciclo para localizar la ubicación correcta en la lista */
      while ( ptrActual != NULL && valor > ptrActual->dato ) { 
         ptrAnterior = ptrActual;          /* entra al ...   */
         ptrActual = ptrActual->ptrSiguiente;  /* ... siguiente nodo */      } /* fin de while */
 
      /* inserta un nuevo nodo al principio de la lista */
      if ( ptrAnterior == NULL ) { 
         ptrNuevo->ptrSiguiente = *ptrS;         *ptrS = ptrNuevo;
      } /* fin de if */
      else { /* inserta un nuevo nodo entre ptrAnterior y ptrActual */
         ptrAnterior->ptrSiguiente = ptrNuevo;
         ptrNuevo->ptrSiguiente = ptrActual;      } /* fin de else */
   
   } /* fin de if */
   else {
      printf( "No se inserto %c. No hay memoria disponible.n", valor );   } /* fin de else */
 
} /* fin de la función insertar */
 
/* Elimina un elemento de la lista */char eliminar( ptrNodoLista *ptrS, char valor )
{ 
   ptrNodoLista ptrAnterior; /* apuntador a un nodo previo de la lista */
   ptrNodoLista ptrActual;   /* apuntador al nodo actual de la lista */
   ptrNodoLista tempPtr;     /* apuntador a un nodo temporal */ 
   /* elimina el primer nodo */
   if ( valor == ( *ptrS )->dato ) { 
      tempPtr = *ptrS; /* almacena el nodo a eliminar */
      *ptrS = ( *ptrS )->ptrSiguiente; /* desata el nodo */      free( tempPtr ); /* libera el nodo desatado */
      return valor;
   } /* fin de if */
   else { 
      ptrAnterior = *ptrS;      ptrActual = ( *ptrS )->ptrSiguiente;
 
      /* ciclo para localizar la ubicación correcta en la lista */
      while ( ptrActual != NULL && ptrActual->dato != valor ) { 
         ptrAnterior = ptrActual;         /* entra al ...   */         ptrActual = ptrActual->ptrSiguiente; /* ... siguiente nodo */
      } /* fin de while */
 
      /* elimina el nodo de ptrActual */
      if ( ptrActual != NULL ) {          tempPtr = ptrActual;
         ptrAnterior->ptrSiguiente = ptrActual->ptrSiguiente;
         free( tempPtr );
         return valor;
      } /* fin de if */     
   } /* fin de else */
 
   return '�';
 } /* fin de la función eliminar */
 
/* Devuelve 1 si la lista esta vacía, de lo contrario, 0  */
int estaVacia( ptrNodoLista ptrS )
{    return ptrS == NULL;
 
} /* fin de la función function estaVacia */
 
/* Imprime la lista */void imprimeLista( ptrNodoLista ptrActual )
{ 
 
   /* si la lista esta vacía */
   if ( ptrActual == NULL ) {      printf( "La lista esta vacia.nn" );
   } /* fin de if */
   else { 
      printf( "La lista es:n" );
       /* mientras no sea el final de la lista */
      while ( ptrActual != NULL ) { 
         printf( "%c --> ", ptrActual->dato );
         ptrActual = ptrActual->ptrSiguiente;   
      } /* fin de while */ 
      printf( "NULLnn" );
   } /* fin de else */
 
} /* fin de la función imprimeLista */

Punto importante: Si vas a sugerir un segmento de código en algún lenguaje debes hacerlo así:

  • Si es lenguaje C <code lang="c">Código en C</code>
  • Si es lenguaje Pascal <code lang="pascal">Aquí dentro el código de Pascal</code>.

De esta manera el código coloreas el código.

Deja un comentario

Suscribirse a los comentarios.