UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos 10/9/2010 Primer Certamen Pregunta 1: Utilizando las siguientes definiciones: #define RC_OK 0 #define RC_ERROR_NODE_BLANK 1 typedef struct node_template { char name[100]; struct node_template *next; } node, *pnode; pnode CreateNode(char *new_name); a) Implemente la siguiente función: int addOrdered(pnode *pp_node, pnode new_node); Que agregue un nuevo nodo a una lista (pp_node) manteniendola en orden incremental. Si falla debe retornar RC_ERROR_NODE_BLANK de otra forma RC_OK. (40 pts) int addOrdered(pnode *pp_node, pnode new_node) { if (!new_node) { return RC_ERROR_NODE_BLANK; } if (*pp_node==NULL) { *pp_node=new_node; return RC_OK; } for ( ; *pp_node;(*pp_node)= (*pp_node)->next) { if ((strcmp((*pp_node)->name, new_node->name)<0) && (((*pp_node)->next)==NULL)) { // pp_node is greater than new and next is NULL (*pp_node)->next=new_node; break; // exit for loop } else if ((strcmp((*pp_node)->name, new_node->name)>=0) && (((*pp_node)->next)==NULL)) { // pp_node is less than or equal to new and next is null new_node->next=*pp_node; *pp_node=new_node; break; } 01-10-2010 1 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos else if ((strcmp((*pp_node)->name, new_node->name)>0) && (strcmp(((*pp_node)->next)->name, new_node->name)>0)) { ; // both are greater than new_node so go to next node } else if ((strcmp((*pp_node)->name, new_node->name)<=0) && (strcmp(((*pp_node)->next)->name, new_node->name)>=0)) { // pp_node is less than or equal to new_node // and second node is greater than or equal so insert between new_node->next=(*pp_node)->next; (*pp_node)->next=new_node; break; } } return RC_OK; } b) Escriba un main( ) que use addOrdered para agregar nodos con los nombres "apple", "chocolate" y "banana" en ese orden. Muestre diagramas con los contenidos de la lista en la medida en que se va agregando cada nodo. (10 pts) int main() { int rc=0; pnode list=NULL; if((rc=addOrdered(&list, CreateNode("apple")))!=RC_OK) { printf("Error adding apple: %d\n", rc); return(rc); } if((rc=addOrdered(&list, CreateNode("chocolate")))!=RC_OK) { printf("Error adding chocolate: %d\n", rc); return(rc); } if((rc=addOrdered(&list, CreateNode("banana")))!=RC_OK) { printf("Error adding banana:%d\n", rc); return(rc); } return 0; } 01-10-2010 2 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos Pregunta 2: Implemente la función: void strcpyTrim(char *dest, char *source, char *ignore); Que copie desde el string source al string dest exceptuando todos los caracteres en el string ignore. Puede usar strlen( ) como función dada. (25 pts) void strcpyTrim(char *dest, char *source, char *ignore) { int source_len=strlen(source); int ignore_len=strlen(ignore); int copy_flag=0; for ( ;*source; source++) { copy_flag=1; for (int i=0; i < ignore_len; i++) { if (*source == *(ignore+i)) { copy_flag=0; break; // get out of for loop } } if (copy_flag) { *dest=*source; dest++; } } if (source_len) { *(dest)='\0'; } } Pregunta 3: Implemente la función: void reverseUpper(char *string); Que reverse el orden de todos los caracteres en el string s al mismo tiempo que convierta todos las letras minusculas ('a' - 'z') a capitales ('A' -'Z'). Puede usar strlen( ) como función dada. (25 pts) Notar: En tabla ASCII: 'A' = 0x41, 'a' = 0x61 01-10-2010 3 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos void reverseUpper(char *string) { char temp; int string_len=strlen(string); int i, j; for ( i=0, j=string_len-1; j >= i; i++, j--) { if ((*(string+i) >='a') && (*(string+i) <='z')) { *(string+i)=*(string+i)-'a'+'A'; } if ((*(string+j) >='a') && (*(string+j) <='z')) { *(string+j)=*(string+j)-'a'+'A'; } temp=*(string+i); *(string+i) = *(string+j); *(string+j) = temp; } } 01-10-2010 4