rafzk
Power Member
Estou a fazer um projecto de estruturas de dados tipo lista, que consiste em receber do teclado numeros para as listas e no fim de isso temos varias operacoes como: mostrar operandos, soma, subtracao e assim.
Eu ja fiz como receber as listas do teclado, validar numero, contar numero de elementos e mostrar listas. Nao consigo fazer a soma e subtracao. Apartir daqui ja consigo fazer o produto e a divisao e depois consequentemente factorial e assim.
O codigo que fiz até agora foi:
Até esta engracado!
Eu ja fiz como receber as listas do teclado, validar numero, contar numero de elementos e mostrar listas. Nao consigo fazer a soma e subtracao. Apartir daqui ja consigo fazer o produto e a divisao e depois consequentemente factorial e assim.
O codigo que fiz até agora foi:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct DIGITO{
int valor;
struct DIGITO *nseg;
struct DIGITO *nant;
}Digito;
Digito* RecebeListaTeclado();
Digito* InsereFim(Digito *L,Digito *nv);
Digito* InsereInicio(Digito *L,Digito *nv);
Digito* CriaDigito(int valor);
int MostraElementos(Digito *L);
void MostraLista(Digito *L);
int NumeroValido(Digito *L);
Digito* ApagaLista(Digito *L);
Digito* RemoveElemento(Digito *L,Digito *del);
int ComparaNumeros(Digito *L1, Digito *L2);
Digito* Soma(Digito *L1,Digito *L2);
int MenuPrincipal();
// receber do teclado, os digitos.
Digito* RecebeListaTeclado(){
int polaridade=1;
Digito *L=NULL, *nv;
char c;
while(1){
scanf("%c",&c);
getchar();
if(c==10)
return(L);
if(c=='-'){
polaridade=-1;
}else{
nv=CriaDigito((c-'0')*polaridade);
L=InsereFim(L,nv);
polaridade=1;
}
}
}
// inserir os numeros nas listas
Digito* InsereFim(Digito *L,Digito *nv){
Digito *aux=L;
if(L==NULL)
return(InsereInicio(L,nv));
while(aux->nseg != NULL)
aux=aux->nseg;
aux->nseg=nv;
nv->nant=aux;
return(L);
}
Digito* InsereInicio(Digito *L,Digito *nv){
if(L==NULL)
return(nv);
nv->nseg=L;
L->nant=L;
return(nv);
}
Digito* CriaDigito(int valor){
Digito *nv=(Digito*)malloc(sizeof(Digito));
nv->valor=valor;
nv->nseg=NULL;
nv->nant=NULL;
return(nv);
}
// numero de elementos nas listas
int MostraElementos(Digito *L){
Digito *aux=L;
int c=0;
while(aux!=NULL){
c++;
aux=aux->nseg;
}
return(c);
}
// mostrar lista
void MostraLista(Digito *L){
if(L==NULL){
printf("0\n");
return;
}
while(L!=NULL){
printf("%d",L->valor);
L=L->nseg;
}
printf("\n");
}
// validacao do numero
int NumeroValido(Digito *L){
if(L==NULL)
return(1);
if(L->valor==0)
return(0);
if((L->valor>=-9)&&(L->valor<=9)){
L=L->nseg;
while(L!=NULL){
if((L->valor>9)||(L->valor<0))
return(0);
L=L->nseg;
}
return(1);
}
return(0);
}
// inicio do systeam clear, listas e elementos
Digito* ApagaLista(Digito *L){
Digito *del;
while(L!=NULL){
del=L;
L=RemoveElemento(L,del);
}
return(L);
}
Digito* RemoveElemento(Digito *L,Digito *del){
if(del==L){
if(del->nseg==NULL){
free(del);
return(NULL);
}
L=del->nseg;
del->nseg->nant=NULL;
free(del);
return(L);
}
if(del->nseg==NULL){
del->nant->nseg=NULL;
free(del);
return(L);
}
del->nant->nseg=del->nseg;
del->nseg->nant=del->nant;
free(del);
return(L);
}
// confirmar se os numeros sao positivos
int ComparaNumeros(Digito *L1, Digito *L2){
int t1,t2,polaridade;
if((L1==NULL)&&(L2==NULL))
return(0);
if(L1==NULL){
if(L2->valor>0)
return(-1);
return(1);
}
if(L2==NULL){
if(L2->valor>0)
return(1);
return(-1);
}
if((L1->valor>0)&&(L2->valor<0))
return(1);
if((L1->valor<0)&&(L2->valor>0))
return(-1);
if(L2->valor<0)
polaridade=-1;
t1=MostraElementos(L1);
t2=MostraElementos(L2);
if(t1<t2)
return(polaridade*-1);
if(t1>t2)
return(polaridade);
while(L1!=NULL){
if(L1->valor > L2->valor)
return(polaridade);
if(L2->valor > L1->valor)
return(polaridade * -1);
L1=L1->nseg;
L2=L2->nseg;
}
return(0);
}
// função soma (requisitos minimos)
Digito* Soma(Digito *L1,Digito *L2){
Digito *L3,*aux1=L1,*aux2=L2;
while(aux1!=NULL)
aux1=aux1->nseg;
while(aux2!=NULL)
aux2=aux2->nseg;
}
// Menu Principal
int MenuPrincipal(){
int opcao;
do{
system("cls");
printf("\n\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t + CALCULADORA INFINITA +\n");
printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
printf("\t<1> - Introduzir operando A.\n");
printf("\t<2> - Introduzir operando B.\n");
printf("\t<3> - Mostrar operandos e Total de Elementos.\n");
printf("\t<4> - Soma de dois numeros.\n");
printf("\t<5> - Subtracao de 2 numeros.\n");
printf("\t<6> - Produto de 2 numeros.\n");
printf("\t<7> - Divisao de 2 numeros.\n");
printf("\t<8> - Media de 2 numeros.\n");
printf("\t<9> - Maximo de 2 numeros.\n");
printf("\t<10> - Minimo de 2 numeros\n");
printf("\t<11> - Inversao de um numero.\n");
printf("\t<12> - Factorial de um numero.\n");
printf("\t<0> - Sair\n\n");
printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\tQual a sua opcao?\n");
printf("\t>");
scanf("%d", &opcao);
getchar();
printf("\n");
}while(opcao<0 || opcao>4);
return(opcao);
}
// config do Menu Principal
main(){
Digito *A=NULL,*B=NULL;
int opcao;
do{
opcao=MenuPrincipal();
switch(opcao){
case 0:
system("cls");
// limpa as listas
printf("\n\n\t\t< Pressione uma tecla para sair >\n\n\n");
getchar();
exit(0);
case 1:
ApagaLista(A); // apaga a lista antes de adicionar
printf("\n\nIntroduza a lista A:\n>");
A=RecebeListaTeclado(); // adiciona digitos a lista
break;
case 2:
ApagaLista(B);
printf("\n\nIntroduza a lista B:\n>");
B=RecebeListaTeclado();
break;
case 3:
printf("\n\nAs listas introduzidas sao:\n\n");
printf("(Lista A): ");
MostraLista(A);
printf("\n\n");
printf("Tem %d numero(s) de elementos.\n",MostraElementos(A));
printf("\n\n");
printf("(Lista B): ");
MostraLista(B);
printf("\n\n");
printf("Tem %d numero(s) de elementos.\n",MostraElementos(B));
printf("\n\n");
getchar();
}
}while(opcao!=0);
// Validacao das listas
int x=1;
Digito *L;
do{
if(x==0){
printf("A Lista Inserida é invalida\n");
ApagaLista(L);
}
printf("Insere Lista:\n");
L=RecebeListaTeclado();
x=NumeroValido(L);
}
while(x==0);
printf("A Lista Inserida e:\n");
MostraLista(L);
getchar();
}