Baixe o app para aproveitar ainda mais
Prévia do material em texto
(Lista Encadeada Ordenada – Funções: InsereOrd, Imprime, RetiraOrd, LstCopia) typedef struct funcionario Funcionario; struct elemento { Funcionario* info; struct elemento* prox; }; typedef struct elemento Elemento; struct funcionario { char nome[81]; int matricula; char departamento[21]; float salario; }; typedef struct funcionario Funcionario; Elemento* lst_insereOrd (Elemento* lst,char* nome, int matricula,char* depto, float sal) { Elemento *novoele, *p, *a; Funcionario *novofunc, *funcp; p=lst; a=NULL; /*O antecessor começa com NULL e a p é igual a lista*/ novofunc=(Funcionario*)malloc(sizeof(Funcionario)); /*Aloca espaço para um novo funcionario*/ if(novofunc==NULL) exit(1); strcpy(novofunc->departamento,depto); strcpy(novofunc->nome, nome); novofunc->matricula=matricula; novofunc->salario=sal; novoele=(Elemento*)malloc(sizeof(Elemento)); /*Aloca espaço para um novo NÓ*/ if(novoele==NULL) exit(1); novoele->info=novofunc; /*a info do novo NÓ é o novo funcionario*/ while((p!=NULL) && (strcmp(novofunc->nome,p->info->nome)>0)) {/*Enquanto a lista não é igual a vazio e o nome do funcionario vem depois do nome q ta na lista*/ a=p; p=p->prox; } if(a==NULL) /*Se a lista for vazia*/ { novoele->prox=lst; lst=novoele; /* o prox do novo NÓ será a lista, e a lista vira o novo NÓ*/ /*O novo NÓ será o primeiro da lista*/ } else/*Se a lista não for vazia*/ { novoele->prox=a->prox; /* o prox do novo NÓ será o prox do antecessor*/ a->prox=novoele; /*o prox do antecessor será o novo NÓ*/ } return lst; } void percorre (Elemento *no) { Elemento *p; Funcionario *t; for(p=no;p!=NULL;p=p->prox) { t=p->info; printf("NOME:%s MAT:%d DEPTO:%.s SAL:%.2f\n", t->nome, t->matricula, t->departamento, t->salario); } } Elemento* lst_retiraOrd (Elemento* lst, char* nome)/*Essa função é recursiva*/ { Elemento *suc; if(lst!=NULL) /*Se a lista não for vazia*/ { if(strcmp(lst->info->nome, nome)==0) /*Se o nome for o procurado: RETIRA o nome da lista*/ { suc = lst->prox; /*o sucessor sera o prox da lista*/ free(lst); /*libera a lista*/ return(lst_retiraOrd(suc,nome)); /*retorna pra func com o suc como sendo a nova lista*/ } else { if(strcmp(lst->info->nome, nome)<0) /*se o nome da lista vier antes do procurado*/ { lst->prox = lst_retiraOrd(lst->prox,nome); /* o prox da lista será fun, com o prox sendo a lista*/ } return lst; } } return NULL; } Outra implementação de Lista: Elemento* lst_copia (Elemento* lst) /*faz um copia identica da lista*/ { Elemento *lst2, *p, *p2, *cele; Contato *ccont; lst2=NULL; /*cria lista2 vazia*/ for(p=lst;p!=NULL;p=p->prox, cele=cele->prox) { cele=(Elemento*)malloc(sizeof(Elemento));/* a loca espaço pro nó da lista2*/ if(cele==NULL) exit(1); ccont=(Contato*)malloc(sizeof(Contato));/* aloca espaço pro contato da lista2*/ if(ccont==NULL) exit(1); /*aqui copiamos as infs dos contatos da lista1 para a lista2*/ strcpy(ccont->nome,p->info->nome); strcpy(ccont->telefone,p->info->telefone); strcpy(ccont->celular,p->info->celular); strcpy(ccont->endereco,p->info->endereco); cele->info=ccont; /*a info do novo NÓ da lista2 será o novo contato*/ cele->prox=NULL;/*o prox do nó sera o NULL, to inserindo no fim da lista2*/ if(lst2==NULL) /*se a lista2 for vazia, a lista2 sera igual a copia do NÓ da lista1*/ lst2=cele; else /*a lista2 não é vazia*/ { p2=lst2; /*p2 para percorrer a lista2*/ while(p2->prox!=NULL) { p2=p2->prox; } p2->prox=cele; /*o prox do ultimo é o novo NÓ*/ } } return lst2; }
Compartilhar