Resolução da Primeira Lista Exercício 1)b) #include #define _MAX_ 100 typedef int Indice; typedef int TipoDoElemento; typedef struct _Pilha{ Indice topo; /* topo = -1, quando a pilha está vazia*/ TipoDoElemento elementos[_MAX_]; } Pilha; void InicializaPilha (Pilha *S){ S->topo = -1; } /* Procedimento para inserir um elemento x na pilha S */ void OVERFLOW(){ printf("Capacidade da pilha ultrapassada !!"); exit(1); } void Underflow(){ printf("Na sequencia desejada existem elementos repetidos !!"); exit(1); } void Empilha( Pilha *S, TipoDoElemento x){ S->topo++; if( S->topo == _MAX_ ) OVERFLOW(); /* a pilha já está cheia*/ else S->elementos[S->topo] = x; } /* Procedimento para remover um elemento na pilha S */ void Desempilha( Pilha *S, TipoDoElemento *x ){ if( S->topo == -1 ) Underflow(); /* a pilha está vazia*/ else *x = S->elementos[S->topo--]; } int main(){ int proximo=1; /* proximo elemento a empilhar/ retirar */ int n=1; int dapilha, /* elemento tirado da pilha */ el; /* elementos lidos pelo teclado */ Pilha p; InicializaPilha(&p); printf("Qual a quantidade de elementos "); scanf("%d",&n); printf("Digite %d numeros de 1 a %d\n",n,n); while ((proximo<=n)||(p.topo!=-1)){ printf("Entre com um elemento: "); scanf("%d",&el); if (el==proximo) /* pega o elemento e ja o retira */ proximo++; else if (el n, empilho até n */ while (proximo #include typedef struct no1{ int info; struct no1 *prox; } No, *apontNo; /* Leitura de uma sequencia terminada por zero */ void Leitura(apontNo *p){ int num; apontNo paux; *p=NULL; Printf("Digite uma sequencia de numeros terminada por zero \n"); scanf("%d",&num); while (num!=0){ paux = (apontNo) malloc (sizeof(No)); paux->info=num; paux->prox=*p; *p=paux; scanf("%d",&num); } } /* Faça uma função que insere um elemento no início da lista */ void Insere(apontNo *p, int x){ int num; apontNo paux; paux = (apontNo) malloc (sizeof(No)); paux->info= x; paux->prox= *p; *p=paux; } /* Faça uma função que dados $p$ remove o elemento na posição $p$ (a partir do primeiro elemento) da lista; */ void Remove(apontNo *p, int pos, int *x){ int i=1; apontNo ant,atual; atual=*p; if (pos==1){ if (atual==NULL){ printf("Elemento inexistente\n"); *x=0; } else{ *p=(*p)->prox; *x=atual->info; free(atual); } } else{ while ((iprox; } if (atual==NULL){ printf("Elemento inexistente\n"); *x=0; } else { *x = atual->info; ant->prox=atual->prox; free(atual); } } } /* Faça uma função onde dadas duas listas de números ordenadas retorna uma única lista também ordenada */ apontNo ordena(apontNo p1, apontNo p2){ apontNo aux=NULL; while ((p1!=NULL)&&(p2!=NULL)){ if (p1->infoinfo){ insere(&aux,p1->info); p1=p1->prox; } else { insere(&aux,p2->info); p2=p2->prox; } } while(p1!=NULL){ insere(&aux,p1->info); p1=p1->prox; } while(p2!=NULL){ insere(&aux,p2->info); p2=p2->prox; } return aux; } /* Faça uma função que dada uma lista remove o seu nó com o maior valor */ void removeMaior(apontNo *p,int *x){ apontNo paux, pmaior; int maior, onde, i; if (*p!=NULL){ pmaior=*p; maior=(*p)->info; paux=pmaior; onde = 1; i = 1; while(paux!=NULL){ if (paux->info>maior){ maior = paux->info; onde = i; } i++; paux=paux->prox; } Remove(p,onde,x); } } /* Faça uma função que ordena uma lista */ void Ordena(apontNo *p){ apontNo paux=NULL; int maiorAtual; while (*p!=NULL){ removeMaior(p, &maiorAtual); Insere(&paux, maiorAtual); } *p = paux; } /* Faça uma função que remove o primeiro elemento da lista*/ void RemovePrimeiro(apontNo *p, int *x){ Remove(p, 1, x); } /* Faça uma função onde dada uma lista retorna duas listas, uma com os números pares e outra com os ímpares */ void ParImpar(apontNo p, apontNo *pimp, apontNo *ppar){ *pimp=*ppar=NULL; while (p!=NULL){ if (p->info%2==0) /* par */ Insere(ppar, p->info); else Insere(pimp, p->info); p=p->prox; } } /* Faça uma função que dada uma lista, inverte a mesma */ void Inverte(apontNo *p){ apontNo aux1, aux2, aux3; if ((*p!=NULL)&&((*p)->prox!=NULL)){ /* se a lista tiver ao menos 2 elementos */ aux1 = *p; aux2 = aux1->prox; aux3 = aux2->prox; while (aux3!=NULL){ aux2->prox = aux1; aux1 = aux2; aux2 = aux3; aux3 = aux3->prox; } aux2->prox = aux1; *p = aux2; } } /* Faça uma função que dada uma lista ordenada, e um novo elemento x, insere x na posição certa da lista */ void InsereOrdenado(apontNo *p, int x){ int num; apontNo paux, ant, prox; paux = (apontNo) malloc (sizeof(No)); paux->info= x; if (*p==NULL){ /* lista vazia */ paux->prox= *p; *p=paux; } else { ant= *p; prox= ant->prox; while (prox!=NULL){ if (prox->infoprox; } else { /* encontrou a posição */ break; /* forca a saida do laço */ } } ant->prox = paux; paux->prox = prox; } }