Ir para conteúdo
Fórum Script Brasil

paulomiguel

Membros
  • Total de itens

    2
  • Registro em

  • Última visita

Tudo que paulomiguel postou

  1. Pessoal! Nunca postei aqui e realmente estou precisando de ajuda o mais rapido possivel! Eu preciso fazer um código que faça duas pilhas e compare se são iguais, depois preciso que as duas pilhas se tornem uma pilha na ordem crescente Eu tenho três paginas de código que meu professor fez de exemplo: Main.c, pilha.c e pilha.h Vou tentar colocar eles para vocês! Main: #include <stdio.h> #include <stdlib.h> #include "Pilha.h" int main () { // As operações abaixo exemplificam a utilização de uma Pilha TipoPilha *Topo1; TipoInfo dado; Topo1 = InicializaPilha(Topo1); Topo1 = PushPilha(Topo1,2); Topo1 = PushPilha(Topo1,4); Topo1 = PushPilha(Topo1,6); Topo1 = PushPilha(Topo1,8); Topo1 = PushPilha(Topo1,10); ImprimirPilha(Topo1); Topo1 = PopPilha(Topo1, &dado); printf("elemento %d retirado da pilha\n\n",dado); Topo1 = PopPilha(Topo1, &dado); printf("elemento %d retirado da pilha\n\n",dado); if (Vazia(Topo1)) printf("a pilha esta vazia\n\n"); else printf("a pilha não esta vazia\n\n"); Topo1 = PopPilha(Topo1, &dado); printf("elemento %d retirado da pilha\n\n",dado); Topo1 = PopPilha(Topo1, &dado); printf("elemento %d retirado da pilha\n\n",dado); Topo1 = PopPilha(Topo1, &dado); printf("elemento %d retirado da pilha\n\n",dado); if (Vazia(Topo1)) printf("a pilha esta vazia\n\n"); else printf("a pilha não esta vazia\n\n"); system("pause"); } Pilha.c; #include <stdio.h> #include <stdlib.h> #include "Pilha.h" TipoPilha* InicializaPilha (TipoPilha *Topo) { return NULL; } int Vazia (TipoPilha *Topo) { if (Topo==NULL) return 1; else return 0; } void ImprimirPilha (TipoPilha *Topo) { TipoPilha *ptaux; if (Topo != NULL) { puts("---Imprimindo pilha---"); for (ptaux=Topo; ptaux!=NULL; ptaux=ptaux->elo) printf("%d\n",ptaux->dado); puts("-------Fim pilha------"); } else puts("Pilha vazia"); } TipoPilha* PushPilha (TipoPilha *Topo, TipoInfo Dado) { TipoPilha *novo; //novo elemento /*aloca um novo nodo */ novo = (TipoPilha*) malloc(sizeof(TipoPilha)); novo->elo = NULL; /*insere a informação no novo nodo*/ novo->dado = Dado; /*encaeia o elemento*/ novo->elo = Topo; Topo = novo; return Topo; } TipoPilha* PopPilha (TipoPilha *Topo, TipoInfo *Dado) { TipoPilha* ptaux; if (Topo == NULL) return NULL; //não tem nada na pilha else { *Dado = (Topo)->dado; //devolve o valor do topo ptaux = Topo; //guarda o endereço do topo Topo = (Topo)->elo; //o próximo passa a ser o topo free(ptaux); //libera o que estava no topo ptaux=NULL; return Topo; //retorna novo topo } } TipoInfo ConsultaPilha (TipoPilha *Topo) { if (Topo==NULL) return 0; else return Topo->dado; } TipoPilha* DestroiPilha (TipoPilha *Topo) { TipoPilha *ptaux; while (Topo != NULL) { ptaux = Topo; //guarda o endereço do topo Topo = Topo->elo; //o próximo passa a ser o topo free(ptaux); //libera o que estava no topo } return NULL; } Pilha.h: #include <stdio.h> #include <stdlib.h> typedef int TipoInfo; struct TPtPilha { TipoInfo dado; struct TPtPilha *elo; }; typedef struct TPtPilha TipoPilha; TipoPilha* InicializaPilha (TipoPilha *Topo); int Vazia (TipoPilha *Topo); TipoPilha* PushPilha (TipoPilha *Topo, TipoInfo Dado); TipoPilha* PopPilha (TipoPilha *Topo, TipoInfo *Dado); TipoInfo ConsultaPilha (TipoPilha *Topo); TipoPilha* DestroiPilha (TipoPilha *Topo); void ImprimirPilha (TipoPilha *Topo); Agradeço desde já a todos vocês! O enunciado seria este: 1) Implemente uma função que receba como entrada duas pilhas e verifique se elas são iguais. A função deve retornar o valor 1 se as duas pilhas forem iguais, e 0 caso contrário. 2) Considere duas pilhas (por exemplo, P1 e P2) cujos nodos contém números inteiros. Cada pilha deve estar em ordem crescente a partir da base da pilha. Escrever uma função para formar uma terceira pilha que contenha todos os elementos das duas pilhas originais. A pilha resultante também deve estar em ordem crescente a partir da base. Exemplo: 3) Implemente no arquivo main o código necessário para testar essa função utilizando diferentes casos de teste: Principais testes: • Pilha 1 vazia • Pilha 2 vazia • Pilha 1 e Pilha 2 vazias • Pilha 1 com valores iguais e na mesma ordem que a Pilha 2 • Pilha 1 com a mesma quantidade de valores que a Pilha 2, porém valores diferentes (vice-versa) • Pilha 1 com mais valores do que a Pilha 2, porém os valores da Pilha 2 são subconjunto da Pilha 1 • Outros casos de teste que você imaginar
  2. Pessoal! Nunca postei aqui e realmente estou precisando de ajuda o mais rapido possivel! Eu tenho um código pronto e preciso adicionar duas funções nele, a de inserir em ordem alfabética e a de remover. eu consegui fazer em listas simplesmente encadeadas mas não consegui em duplamente encadeadas. Eu tenho três paginas de código: Main.c, LDE.c e LDE.h O código que fiz compila mas da um erro e encerra o programa. Eu escrevi somente a parte de remover e inserir ordenada, o resto já veio pronto pelo professor. Vou tentar colocar eles para vocês! Este é o LDE.c: #include <stdio.h> #include <stdlib.h> #include "LDE.h" PtNo* inicializa(void) { return NULL; } PtNo* destroi(PtNo* ptLista) { PtNo *ptaux; //ponteiro auxiliar para percorrer a lista while (ptLista != NULL) { ptaux = ptLista; ptLista = ptLista->prox; free(ptaux); } free(ptLista); return NULL; } void imprime(PtNo* PtLista) { PtNo* ptaux=PtLista; if (PtLista == NULL) puts("lista vazia"); else do { printf("Codigo = %d, Nome = %s, preço = %.2f.\n", ptaux->info.codigo, ptaux->info.nome, ptaux->info.preço); ptaux = ptaux->prox; } while (ptaux != NULL); } void imprime_invertida(PtNo *PtLista) { PtNo *PtAux; if (PtLista==NULL) { printf("Lista vazia ! "); } else { PtAux=PtLista; while (PtAux->prox!=NULL) PtAux=PtAux->prox; while (PtAux!=NULL) { printf("Codigo = %d, Nome = %s, preço = %.2f.\n", PtAux->info.codigo, PtAux->info.nome, PtAux->info.preço); PtAux=PtAux->ant; } } } PtNo* insere_inicio(PtNo *PtLista, InfoNo Dado) { PtNo *novo; novo = (PtNo*) malloc(sizeof(PtNo)); novo->info = Dado; novo->ant = NULL; novo->prox = PtLista; if (PtLista != NULL) PtLista->ant = novo; PtLista = novo; return PtLista; } PtNo* insere_fim(PtNo *PtLista, InfoNo Dado) { PtNo *novo, *PtAux; novo = (PtNo*) malloc(sizeof(PtNo)); //aloca novo nodo novo->info = Dado; //coloca dados no novo nodo if ((PtLista) == NULL) //lista vazia { PtLista = novo; novo->ant = NULL; novo->prox = NULL; } else // lista tem pelo menos um nodo { PtAux = PtLista; //auxiliar no início da lista while (PtAux->prox != NULL) //PtAux avança até o último elemento da lista { PtAux=PtAux->prox; } PtAux->prox = novo; novo->ant = PtAux; //Encadeia novo com PtAux novo->prox = NULL; } return PtLista; } // --------------------------------------------------- /* IMPLEMENTE O CÒDIGO PARA INSERÇÃO ORDENADA AQUI */ PtNo* insere_ordenada(PtNo *PtLista, InfoNo Dado) { PtNo *novo, *prox; //novo elemento PtNo *ant = NULL; //ponteiro auxiliar para a posição anterior PtNo *ptaux = PtLista; //ponteiro auxiliar para percorrer a lista /*aloca um novo nodo */ novo = (PtNo*) malloc(sizeof(InfoNo)); /*insere a informação no novo nodo*/ novo->info = Dado; /*procurando a posição de inserção*/ while ((ptaux!=NULL) && (strcmp(ptaux->info.nome,Dado.nome)<0)) //se info.titulo < dados.titulo então strcmp retorna um valor menor que zero { ant = ptaux; ptaux = ptaux->prox; } /*encadeia o elemento*/ if (ant == NULL) /*o anterior não existe, logo o elemento será inserido na primeira posição*/ { // puts("inserindo primeiro"); novo->prox = PtLista; PtLista = novo; } else /*elemento inserido no meio da lista*/ { novo->prox = ant->prox; ant->prox = novo; novo->prox->ant=novo; novo->ant->prox=novo; } return PtLista; } /* IMPLEMENTE O CÒDIGO PARA REMOÇÃO AQUI */ PtNo* remove_no(PtNo *PtLista, char nome[]) { PtNo *ant = NULL; //ponteiro auxiliar para a posição anterior PtNo *ptaux = PtLista; //ponteiro auxiliar para percorrer a lista /*procura o elemento na lista*/ while (ptaux !=NULL && (strcmp(ptaux->info.nome, nome))) { ant = ptaux; ptaux = ptaux->prox; } /*verifica se achou*/ if (ptaux == NULL) return PtLista; /*retorna a lista original*/ if (ant == NULL) /*vai remover o primeiro elemento*/ PtLista = ptaux->prox; else /*vai remover do meio ou do final*/ ant->prox = ptaux->prox; ant->prox->ant=ant; free(ptaux); /*libera a memória alocada*/ return PtLista; } Este é o main.c: #include <stdio.h> #include <stdlib.h> #include "LDE.h" int main() { int op; InfoNo dados; char rem[20]; PtNo *l; l = inicializa(); do { system("cls"); printf("1-Inserir no Final\n"); printf("2-Inserir no Inicio\n"); printf("3-Inserir Ordenado\n"); printf("4-Remover\n"); printf("5-Imprimir\n"); printf("6-Imprimir Invertida\n"); printf("0-Fim\n"); printf("\nDigite sua opcao: "); scanf("%d",&op); switch(op) { case 1: printf("\n*** Insercao no Fim ***\n\n"); printf("Codigo: "); fflush(stdin); scanf("%d",&dados.codigo); printf("Nome: "); fflush(stdin); gets(dados.nome); printf("preço: "); fflush(stdin); scanf("%f",&dados.preço); l=insere_fim(l,dados); system("pause"); break; case 2: printf("\n*** Insercao no Inicio ***\n\n"); printf("Codigo: "); fflush(stdin); scanf("%d",&dados.codigo); printf("Nome: "); fflush(stdin); scanf("%s",dados.nome); printf("preço: "); fflush(stdin); scanf("%f",&dados.preço); l=insere_inicio(l,dados); system("pause"); break; case 3: //printf("\n*** Operacao não implementada ***\n\n"); printf("\n*** Insercao ordenada ***\n\n"); printf("Codigo: "); fflush(stdin); scanf("%d",&dados.codigo); printf("Nome: "); fflush(stdin); gets(dados.nome); printf("preço: "); fflush(stdin); scanf("%f",&dados.preço); l=insere_ordenada(l,dados); system("pause"); break; case 4: //printf("\n*** Operacao não implementada ***\n\n"); printf("\n*** Remocao ***\n\n"); printf("Qual elemento deseja remover?"); fflush(stdin); gets(rem); l = remove_no(l, rem); system("pause"); break; case 5: printf("\n*** Impressao ***\n\n"); imprime(l); system("pause"); break; case 6: printf("\n*** Impressao Invertida ***\n\n"); imprime_invertida(l); system("pause"); break; } } while (op !=0); l=destroi(l); return 0; } E este o LDE.h: struct TipoInfoNo { int codigo; char nome[20]; float preço; }; typedef struct TipoInfoNo InfoNo; struct TipoPtNo { InfoNo info; struct TipoPtNo* ant; struct TipoPtNo* prox; }; typedef struct TipoPtNo PtNo; PtNo* inicializa(void); PtNo* destroi(PtNo* ptLista); void imprime(PtNo* PtLista); void imprime_invertida(PtNo *PtLista); PtNo* insere_inicio(PtNo *PtLista, InfoNo Dado); PtNo* insere_fim(PtNo *PtLista, InfoNo Dado); PtNo* insere_ordenada(PtNo *PtLista, InfoNo Dado); PtNo* remove_no(PtNo *PtLista, char nome[]); Eu preciso fazer as funções de inserir ordenado e remover Muito obrigado pela paciência!
×
×
  • Criar Novo...