Buscar

Lista Encadeada Ordenada

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 3 páginas

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;
}

Outros materiais