Ir ao conteúdo

Posts recomendados

Postado

esse programa tinha que inserir 10 números e remover mais da erro de segmentação mais não sei onde

#include<stdio.h>
#include<stdlib.h>
#define max 10
typedef struct no{
    int dado;
    struct no *prox, *ant;
}No;
typedef struct lista{
    int qtd;
    No *inicio;
    No *fim;

}Lista;
void inicializa(Lista *l){
l->qtd=0;
l->fim=NULL;
l->inicio=NULL;
}

int listavazia(Lista *l){
    if(l->qtd==0){
    return 0;
    }
    return 1;
}

No *buscap(Lista *l,int k){
    No *nav;
    int i;
    if(k<l->qtd/2){
    nav=l->inicio;
    for(i=0;i<=k;i++)
    nav=nav->prox;
    }
    else{
        nav=l->fim;
        for(i=l->qtd-1;i>=k-1;i--){
        nav=nav->ant;
        }
    }
    return nav;
}
int inserirlistavazia(Lista *l, int valor){
    No *novo=malloc(sizeof(No));
    novo->dado=valor;
    l->fim=novo;
    novo->prox=NULL;
    novo->ant=NULL;
    l->qtd++;
    return l->qtd;
}
int inseririnicio(Lista *l,int valor){
    No *novo=malloc(sizeof(No));
    novo->dado=valor;
    novo->prox=l->inicio;
    l->inicio->ant=novo;
    novo->ant=NULL;
    l->inicio=novo;
    l->qtd++;
    return l->qtd;

}
int inserirfim(Lista *l,int valor){
    No *novo=malloc(sizeof(No));
    novo->dado=valor;
    l->fim->prox=novo;
    novo->ant=l->fim;
    novo->prox=NULL;
    l->fim=novo;
    l->qtd++;
    return l->qtd;
}
int remova_um(Lista *l){
    int aux=l->inicio->dado;
    free(l->inicio);
    l->inicio=NULL;
    l->fim=NULL;
    l->qtd--;
    return aux;
}
int inserirp(Lista *l,int valor,int k){
    if(k<0 || k>l->qtd){
        printf("posiçao invalida\n");
        return -1;
    }
    if(l->qtd==0){
        inserirlistavazia(l,valor);
        return l->qtd;
    }
    if(k==0){
        inseririnicio(l,valor);
        return l->qtd;
    }
    if(k==l->qtd){
        inserirfim(l,valor);
        return l->qtd;
    }
    No*novo=malloc(sizeof(No));
    novo->dado=valor;
    No *nav=buscap(l,k-1);
    novo->prox=nav->prox;
    novo->ant=nav;
    nav->prox->ant=novo;
    return++l->qtd;
}
int removerinicio(Lista *l){
    if(l->qtd==0){
        printf("lista vazia");
        return -1;
    }
    if(l->qtd==1){
        return remova_um(l);
    }
    int aux=l->inicio->dado;
    No *lixo=l->inicio;
    lixo->prox->ant=NULL;
    l->inicio=lixo->prox;
    free(lixo);
    lixo=NULL;
    l->qtd--;
    return aux;
}
int removerfim(Lista *l){
    if(l->qtd==0)
    return -1;
    if(l->qtd==1){
        return remova_um(l);
    }
    int aux=l->fim->dado;
    No *lixo=l->fim;
    lixo->ant->prox=NULL;
    l->fim==lixo->ant;
    free(lixo);
    lixo=NULL;
    l->qtd--;
    return aux;
}


int removerp(Lista *l,int k){
    if(l->qtd==0){
        return -1;
    }
    if(k<0 || k>l->qtd){
        printf("posiçao invalida");
        return -1;
    }
    if(k==0){
        return removerinicio(l);

    }

    if(k==l->qtd-1){
        return removerfim(l);
    }
    No *lixo=buscap(l,k);
    lixo->ant->prox=lixo->prox;
    lixo->prox->ant=lixo->ant;
    int aux=lixo->dado;
    free(lixo);
    lixo=NULL;
    l->qtd--;
    return aux;
}
int main(){
    int i;
    Lista l;

    inicializa(&l);
    for(i=0;i<10;i++){

     	printf("%d\n",inserirp(&l,i*5,i));

    }
    for(i=0;i<10;i++){
    	printf("%d\n",removerp(&l,0));
    }



    return 0;
}

 

Postado
16 minutos atrás, Edgard Silva disse:

usa ubuntu? que tipo de programa você quer criar e o que ele vai fazer?

ele so tem de inserir depois listar e remover mais usando esse tipo de estrutura de dados

Postado

de uma olhada na programação, se não tiver nada errado e ainda não funcionar dai pode ser seu Sistema, tipo, alguma alteração no sistema operacional do seu computador

  • 2 semanas depois...
Postado

Oi, tenta o seguinte código

#include<stdio.h>
#include<stdlib.h>
/*#define max 10 não é usado*/
typedef struct no{
    int dado;
    struct no *prox, *ant;
}No;
/* fim e inicio não precisa ser ponteiro */
typedef struct lista{
    int qtd;
    No inicio;
    No fim;

}Lista;
/* usa fim e inicio como sentinela */
void inicializa(Lista *l){
l->qtd=0;
l->fim.ant = &l->inicio;
l->fim.prox = NULL;
l->inicio.prox = &l->fim;
l->inicio.ant = NULL;
}
/*função não usada
int listavazia(Lista *l){
    if(l->qtd==0){
    return 0;
    }
    return 1;
}
*/
/*função não usada para os valores
de k em main
No *buscap(Lista *l,int k){
    No *nav;
    int i;
    if(k<l->qtd/2){
    	nav=&l->inicio;
    	for(i=0;i<k;i++)
    	    nav=nav->prox;
    }
    else{
    	nav=&l->fim;
        for(i=l->qtd;i>k;i--)
            nav=nav->ant;
    }
    return nav;
}*/
/* inserirlistavazia e inseririnicio pode ser uma função só
int inserirlistavazia(Lista *l, int valor){
    No *novo=malloc(sizeof(No));
    novo->dado=valor;
    novo->prox = l->inicio.prox;
    l->inicio.prox = novo;
    novo->ant = &l->inicio;
    l->qtd++;
    return l->qtd;
}*/
int inseririnicio(Lista *l,int valor){
    No *novo=malloc(sizeof(No));
    novo->dado=valor;
    novo->prox = l->inicio.prox;
    l->inicio.prox = novo;
    novo->prox->ant=novo;
    novo->ant = &l->inicio;
    l->qtd++;
    return l->qtd;

}
int inserirfim(Lista *l,int valor){
    No *novo=malloc(sizeof(No));
    novo->dado=valor;
    novo->ant = l->fim.ant;
    l->fim.ant = novo;
    novo->ant->prox = novo;
    novo->prox = &l->fim;
    l->qtd++;
    return l->qtd;
}
int remova_um(Lista *l){
    int aux=l->inicio.prox->dado;
    free(l->inicio.prox);
    l->inicio.prox=NULL;
    l->qtd--;
    return aux;
}
int inserirp(Lista *l,int valor,int k){
    if(k<0 || k>l->qtd){
        printf("posiçao invalida\n");
        return -1;
    }
    if(l->qtd==0 || k==0)
        return inseririnicio(l,valor);
    if(k==l->qtd)
        return inserirfim(l,valor);
/*essa região de código nunca é executada para
os valores de k em main
    No*novo=malloc(sizeof(No));
    novo->dado=valor;
    No *nav=buscap(l,k);
    novo->prox=nav->prox;
    novo->ant=nav;
    nav->prox->ant=novo;
    return++l->qtd;
/*********************************************/
}
int removerinicio(Lista *l){
    No *lixo;
    if(l->qtd==0){
        printf("lista vazia");
        return -1;
    }
    if(l->qtd==1){
        return remova_um(l);
    }
    int aux=l->inicio.prox->dado;
    lixo=l->inicio.prox;
    l->inicio.prox=lixo->prox;
    free(lixo);
    lixo=NULL;
    l->qtd--;
    return aux;
}
int removerfim(Lista *l){
    No *lixo;
    if(l->qtd==0)
    return -1;
    if(l->qtd==1){
        return remova_um(l);
    }
    int aux=l->fim.ant->dado;
    lixo=l->fim.ant;
    l->fim.ant = lixo->ant;
    free(lixo);
    lixo=NULL;
    l->qtd--;
    return aux;
}


int removerp(Lista *l,int k){
    if(l->qtd==0){
        return -1;
    }
    if(k<0 || k>l->qtd){
        printf("posiçao invalida");
        return -1;
    }
    if(k==0){
        return removerinicio(l);

    }

    if(k==l->qtd-1){
        return removerfim(l);
    }
/*essa região de código nunca é executada para
os valores de k em main
    No *lixo=buscap(l,k);
    lixo->ant->prox=lixo->prox;
    lixo->prox->ant=lixo->ant;
    int aux=lixo->dado;
    free(lixo);
    lixo=NULL;
    l->qtd--;
    return aux;
/**********************************************/
}
int main(){
    int i;
    Lista l;

    inicializa(&l);
    for(i=0;i<10;i++){

     	printf("%d\n",inserirp(&l,i*5,i));

    }
    for(i=0;i<10;i++){
    	printf("%d\n",removerp(&l,0));
    }



    return 0;
}

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...