Sol-C1 - Departamento de Electrónica

Anuncio
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
Descargar