programacao em C
-------------------------------------------------------------------------------
1-
a funcao tira cartao tem dado varios erros
se eu retiro o ultimo elemento da lista ele poe o penultimo com numero errado
se eu retiro o primeiro elemento ele poe o segundo com numero errado
se eu retiro do meio está certo
se eu retiro o segundo elemento ele retira o primeiro junto e retorna o terceiro com numero errado
ese rodo o programa e o priomeiro q retiro eh o primeiro o programa dá erro e sai (windows)
-------------------------------------------------------------------------------
2- a funcao quicksort nao estava fazendo nada, deixava a lista como estava, eu achava q o erro estava no cartaoswip mas agora eu testei ela denovo e parece q da erro qdo chama ela, nao sei direito pq estou no windwos mas provavelmente dvee ser um seg fault
alguem sabe bem sobre quicksort?
-------------------------------------------------------------------------------
obrigado a todos
-------------------------------------------------------------------------------
1-
a funcao tira cartao tem dado varios erros
se eu retiro o ultimo elemento da lista ele poe o penultimo com numero errado
se eu retiro o primeiro elemento ele poe o segundo com numero errado
se eu retiro do meio está certo
se eu retiro o segundo elemento ele retira o primeiro junto e retorna o terceiro com numero errado
ese rodo o programa e o priomeiro q retiro eh o primeiro o programa dá erro e sai (windows)
Código:
void Retiracartao (int cliente, Lista *lc){
Cartao *aux,*t;
if (!lc) return;
t=AchaCartao(lc,cliente);
if (t==NULL){
printf ("Esse cartao nao existe. Tente denovo.\n");
return;
}
if(t->prox!=NULL && t->ant!=NULL){ /*quando o cartao nao é o primeiro nem ultimo*/
aux=t;
t=t->ant;
t->prox=aux->prox;
}
if(t->prox==NULL){ /*quando o cartao é o ultimo*/
lc->fim=(void *)t->ant;
aux=(Cartao *)lc->fim;
aux->prox=NULL;
free(t);
}
if(t->ant==NULL){ /*quando o cartao é o primeiro*/
lc->ini=(void *)t->prox;
aux=(Cartao *)lc->ini;
aux->ant=NULL;
free(t);
}
if(t->prox==NULL && t->ant==NULL){ /*quando a lista tem um elemento*/
aux=t;
lc->ini = lc->fim = NULL;
free(t);
}
free(aux);
return;
}
/*
função AchaCartao
descrição: devolve um ponteiro para o Cartao com numero n,
e NULL caso nao encontra-lo.
*/
Cartao *AchaCartao(Lista *l, int n)
{
Cartao *c;
if (!l) return NULL;
for (c = (Cartao *)l->ini; c!=NULL; c = c->prox) {
if (c->numero == n) return c;
}
return NULL;
}
/* Definicao da estrutura de dados para Cartoes: lista duplamente ligada */
typedef struct _CC_ {
int numero; /* numero do cartao */
float limite; /* limite de credito */
float gastos; /* total de gastos do mes */
int ano; /* ano de validade do cartao */
char nome[TAM_NOME+1]; /* nome do cliente */
struct _CC_ *prox, *ant;
} Cartao;
typedef struct _lista_ {
void *ini; /* inicio e fim da lista */
void *fim;
} Lista;
2- a funcao quicksort nao estava fazendo nada, deixava a lista como estava, eu achava q o erro estava no cartaoswip mas agora eu testei ela denovo e parece q da erro qdo chama ela, nao sei direito pq estou no windwos mas provavelmente dvee ser um seg fault
alguem sabe bem sobre quicksort?
Código:
/*
************************************************************
funcoes para ordenacao
************************************************************
*/
void CartaoSwip ( int i , int j ,int Tamanho,Lista *lc)
{
Cartao *p1 , *p2 , *p3 = NULL ;
int temp;
if ( i == j ) return ;
if ( i > j ) {
temp = i ;
i = j ;
j = i ;
}
p1 = ponteiro (i,lc) ;
p2 = ponteiro (j,lc ) ;
p3 = p2->prox ;
if ( j != Tamanho ) {
p2->prox->ant = p1 ;
}
if ( i == ( j -1 ) ) {
p1->ant->prox = p2 ;
p1->prox = p2->prox ;
p2->prox = p1 ;
p2->ant = p1->ant ;
p1->ant = p2 ;
}
else {
p1->prox->ant = p2 ;
p2->ant->prox = p1 ;
p1->ant->prox = p2 ;
p2->prox = p1->prox ;
p1->prox = p3 ;
p3 = p1->ant ;
p1->ant = p2->ant ;
p2->ant = p3 ;
}
}
void quicksort (Lista *lista,int inicio,int fim) {
int pivop;
if (inicio<fim){
pivop=divide(lista,inicio,fim);
quicksort(lista,inicio,pivop-1);
quicksort(lista,pivop+1,fim);
}
}
int divide (Lista *lc,int ini, int fim){
int i,j,tamanho=1,a=1;
float pivo;
Cartao *c;
i=ini-1;
pivo=Saldon(fim+1,lc);
for (c = (Cartao *)lc->ini; c ; c = c->prox)
tamanho++;
for (j=ini; j<fim; j++)
if (Saldon(j+1,lc)<pivo){
i++;
CartaoSwip(i+1,j+1,tamanho,lc);
}
CartaoSwip(pivo,i+1,tamanho,lc);
return (i+1);
}
float Saldon (int n, Lista *lc)
{
float a;
int j=0;
Cartao *c;
for (c = (Cartao *)lc->ini; j<(n+1) ; c = c->prox)
j++;
a=(c->limite) - (c->gastos);
}
Cartao * ponteiro (int b, Lista *lc)
{
Cartao *c;
int j=0;
for (c = (Cartao *)lc->ini; j<(b+1) ; c = c->prox)
j++;
return c;
}
obrigado a todos
Última edição: