UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos 28/8/2005 Solución Primer Certamen Pregunta 1 (20 puntos) : a. #include <stdio.h> #include <stdlib.h> #include <string.h> char *palindrome(char *str) { int largo = 0; char *temp; int i; if (str == NULL) return NULL; largo = strlen(str); temp = (char *) malloc((2*largo)+1); for (i = 0; i < largo ; i++) temp[i] = str[i]; for (i = 0; i < largo ; i++) temp[i+largo] = str[largo-1-i]; return temp; } b. main() { printf("%s\n", palindrome("calabaza")); } Tipos de memoria: - global: fija, no cambia durante programa. e.g.: “calabaza” en main( ). - stack: variables en funciones, automáticas. e.g.: “str” en palindrome( ). - heap: memoria pedida dinámicamente. e.g.: “temp” en palindrome( ). Pregunta 2 (20 puntos) : a. Compara los dos strings hasta el largo de s o hasta n caracteres. -- n decremento los caracteres a comparar. En el ejemplo retorna 0. 30-08-2005 1 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos b. itoa esta definido en el libro de K&R (p. 64) : void itoa(int n, char s[]) { int i, sign; if ((sign = n) n = -n; i = 0; do { s[i++] = } while ((n /= if (sign < 0) s[i++] = s[i] = ‘\0’; reverse(s); < 0) /* record sign */ /* make n positive */ /* generate digits in reverse order */ n % 10 + ‘0’; /* get next digit */ 10) > 0); /* delete it */ ‘-‘; } Pregunta 3 (40 puntos) : Una posible solución. #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct moldenodo { char *clave; struct moldenodo *proximo; } *pnodo, nodo; int intercambio(pnodo lista, char *clave1, char* clave2) { pnodo temp=NULL; pnodo temp2=NULL; pnodo temp3=NULL; pnodo pn1=NULL; pnodo pn2=NULL; if (lista == NULL) return 1; for(temp=lista->proximo; temp->proximo != lista->proximo; temp=temp>proximo) { // buscar nodos a intercambiar (hace busqueda desde el 2do nodo en lista) if(!strcmp((temp->proximo)->clave,clave1)) pn1 = temp; // encontro el nodo que apunta al nodo 1 else if(!strcmp((temp->proximo)->clave,clave2)) pn2 = temp; // encontro el nodo que apunta al nodo 2 } if ((pn1 == NULL)||(pn2 == NULL)) { // temp apunta a la cola (ver el primer nodo para buscar pn1 o pn2...) 30-08-2005 2 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos if(!strcmp((temp->proximo)->clave,clave1)) pn1 = temp; // encontro el nodo que apunta al nodo 1 else if(!strcmp((temp->proximo)->clave,clave2)) pn2 = temp; // encontro el nodo que apunta al nodo 2 if ((pn1 == NULL)||(pn2 == NULL)) // si todavia no los encontramos return 1; } temp=pn1->proximo; // temp apunta a nodo 1 temp2=pn2->proximo; // temp2 apunta a nodo 2 temp3 = temp->proximo; // temporal para no perder a lo que nodo1 apunta pn1->proximo = temp2; // pn1 ahora apunta al nodo 2 pn2->proximo = temp; // pn2 ahora apunta al nodo 1 temp->proximo = temp2->proximo; // nodo1 apunta a lo que apuntaba nodo2 temp2->proximo= temp3; // nodo2 apunta a lo que apuntaba nodo1 if (temp2->proximo==temp2) temp2->proximo= temp; if (temp->proximo==temp) temp->proximo= temp2; // si nodo2 queda con un // nodo2 debe apuntar // si nodo1 queda con un // nodo1 debe apuntar loop entonces : ... a nodo1 loop entonces : ... a nodo1 return 0; } pnodo insertar(pnodo lista, char *str) { pnodo ult; pnodo temp = (pnodo) malloc(sizeof(nodo)); temp->clave = (char *) malloc(sizeof(str)); temp->proximo = lista; strcpy(temp->clave, str); if (lista != NULL) { // hacer que el ultimo nodo apunte al nuevo for(ult=lista; ult->proximo != lista; ult=ult->proximo) ; ult->proximo=temp; } else temp->proximo=temp; return(temp); } pnodo borrar(pnodo lista, char *str) { pnodo temp; pnodo del; if (lista == NULL) return NULL; 30-08-2005 3 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos for(temp=lista; temp->proximo != lista; temp=temp->proximo) { // buscar nodo a borrar (hace busqueda desde el 2do nodo en lista) if(!strcmp((temp->proximo)->clave,str)) { // encontre el nodo a borrar del = temp->proximo; temp->proximo=temp->proximo->proximo; free(del->clave); free(del); return lista->proximo; } } if(!strcmp((temp->proximo)->clave,str)) { // si estamos aca el nodo a borrar puede ser el primer nodo en lista del = temp->proximo; // nodo a borrar (temp->proximo=lista->proximo) if (temp->proximo == temp->proximo->proximo) // unico nodo lista->proximo = NULL; // centinela apunta a NULL else { lista=temp->proximo->proximo; // nuevo primer nodo de lista temp->proximo=temp->proximo->proximo; // enlazar ultimo al primero } free(del->clave); free(del); } return lista->proximo; } main() { // crear centinela pnodo lista = (pnodo) malloc(sizeof(nodo)); lista->clave = (char *) malloc(2); strcpy(lista->clave,"0"); lista->proximo = NULL; lista->proximo lista->proximo lista->proximo lista->proximo lista->proximo = = = = = insertar(lista->proximo, insertar(lista->proximo, insertar(lista->proximo, insertar(lista->proximo, insertar(lista->proximo, "jose"); "pedro"); "miguel"); "andres"); "juan"); intercambio(lista, "jose", "juan"); lista->proximo lista->proximo lista->proximo lista->proximo lista->proximo = = = = = borrar(lista->proximo, borrar(lista->proximo, borrar(lista->proximo, borrar(lista->proximo, borrar(lista->proximo, "andres"); "jose"); "juan"); "pedro"); "miguel"); // liberar centinela free(lista->clave); free(lista); } 30-08-2005 4 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos Pregunta 4 (20 puntos): a. && : AND lógico, if (A && B) & : AND bits, int a=101&100; / dirección de variable, &var || : OR lógico, if (A || B) | : OR bits, a=101|100; -> : referenciar puntero, p->clave; ~ : complementar bits, a=~1101 % : modulo, a=5%2; / especificación de tipo de dato en formato, %d = : asignación, a=2; == : prueba de igualdad lógica, if (A == TRUE) != : prueba de inigualdad lógica, if (A != TRUE) b. make sirve para organizar proyectos de desarrollo de software, el makefile (e.g. test.mak) es una descripción de los pasos necesarios para compilar los archivos fuente y enlazar los objetos del proyecto para obtener un ejecutable. EXE = test OBJECTS = main.o librerias1.o librerias2.o CFLAGS = -g all: $(EXE) $(EXE): $(OBJECTS) g++ $(CFLAGS) -o $(EXE) $(OBJECTS) main.o: main.cc g++ $(CFLAGS) -c $(INCDIR) -o main.o main.cc librerias1.o: librerias1.cc g++ $(CFLAGS) -c $(INCDIR) -o librerias1.o librerias1.cc librerias2.o: librerias2.cc g++ $(CFLAGS) -c $(INCDIR) -o librerias2.o librerias2.cc 30-08-2005 5