-
Notifications
You must be signed in to change notification settings - Fork 0
/
ListaCargarOrdenadaWebCampus.c
146 lines (130 loc) · 3.47 KB
/
ListaCargarOrdenadaWebCampus.c
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
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning(disable:4996)
//constantes
#define LNOM 32
//estructuras
struct n{
char nombre[LNOM];
struct n *pSig;
};
typedef struct n nodo, *pNodo;
//prototipos
int ingresarCadena(char cad[],int tam, char mensaje[]);
pNodo vaciarLista(pNodo inicio);
void imprimirLista(pNodo inicio);
pNodo insertarOrd(pNodo inicio, pNodo nuevo);
//main
int main(void)
{
char nombre[LNOM];
pNodo inicio,nuevo,liberar, actual; //actual una copia de inicio para no perder la lista.
inicio=NULL;
//cargarLista
ingresarCadena(nombre,LNOM,"Nombre: ");
while(strlen(nombre)>0){//para salir si ingresan un Enter.
nuevo=(pNodo)malloc(sizeof(nodo)); //malloc debo castearlo porque que tiene por defecto un void*, como ya definimos *pNodo,
if(nuevo==NULL) //es por ello que arriba no hace falta el *, de no haber definido typedef *pNodo tendria que poner *nodo.
{
printf("No hay memoria disponible.\n");
nombre[0]='\0';
}
else
{
strcpy(nuevo->nombre,nombre);
nuevo->pSig=inicio;
//inicio=nuevo;
inicio=insertarOrd(inicio,nuevo);
ingresarCadena(nombre,LNOM,"Nombre: ");
}
}
//imprimir la lista:
//actual=inicio; //me hago una copia de inicio en actual para no perderla.
//while(actual!=NULL) //mientras la lista no sea vacia
//{
// printf("%s\n",actual->nombre);
// actual=actual->pSig;
//}
imprimirLista(inicio);
//vaciar la lista:
inicio=vaciarLista(inicio);
//while(inicio!=NULL)
//{
// liberar=inicio;//lo copio dentro del while porque me sirve para tener la referencia del siguiente, sino no puedo avanzar
// inicio=inicio->pSig;
// free(liberar);
//}
imprimirLista(inicio);
}
//funciones
int ingresarCadena(char cad[],int tam, char mensaje[]){
printf("%s",mensaje);
fgets(cad,tam,stdin);
if(strchr(cad,'\n')){//si el ultimo caracter valido es un '\n' (antes del '\0' (NULL))
*strchr(cad,'\n')='\0'; //al contenido de '\n' le asignamos '\0' (NULL)
}else
while(fgetc(stdin)!='\n'){}
return strlen(cad);
}
//char nombre para almacenar el ingreso.
//pNodo inicio //sera el 1er nodo de la lista.
// strcpy((*nuevo).nombre,nombre);
//lo simplifico con strcpy(nuevo->nombre,nombre)
void imprimirLista(pNodo inicio){
pNodo actual;
actual=inicio; //me hago una copia de inicio en actual para no perderla.
if(actual==NULL){ //lista vacia
printf("%s","Lista vacia.\n");
}else{
while(actual!=NULL) //mientras la lista no sea vacia
{
printf("%s\n",actual->nombre);
actual=actual->pSig;
}
}
}
pNodo vaciarLista(pNodo inicio){
pNodo liberar;
while(inicio!=NULL)
{
liberar=inicio;//lo copio dentro del while porque me sirve para tener la referencia del siguiente, sino no puedo avanzar
inicio=inicio->pSig;
free(liberar);
}
return NULL;
}
//cuando ya tengo un nuevo nodo que le usuario ha ingresado, podremos usar la siguiente funcion:
pNodo insertarOrd(pNodo inicio, pNodo nuevo){ //para usar la funcion haré: inicio=inserartOrd(inicio, nuevo);
pNodo act, ant;
if(inicio==NULL)//si lista vacia.
{
nuevo->pSig=NULL;
inicio=nuevo;
return inicio;
}
if(strcmp(nuevo->nombre, inicio->nombre)<0) //insertar al inicio
{
nuevo->pSig=inicio;
inicio=nuevo;
return inicio;
}
ant=NULL;
act=inicio;
while(act!=NULL && strcmp(act->nombre, nuevo->nombre)<=0)
{
ant=act;
act=act->pSig;
}
if(act==NULL) //insertar al final
{
nuevo->pSig=NULL;
ant->pSig=nuevo;
}
else //inserto entre nodos
{
nuevo->pSig=act;
ant->pSig=nuevo;
}
return inicio;
}