Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luthien

Lista: função Inserir nomes em ordem crescente em uma lista

Recommended Posts

Tenho que inserir elementos na ordem crescente, fiz uma função usando strcmp, fiz só um teste pra testar mas n está dando certo, o programa para de responder. Alguém me ajuda?

#include <stdio.h>#include <stdlib.h>typedef struct{    char nome;    char sobrenome[50];    char data_nasc[15];    char id[15];    char ---o[20];    int idade;}TipoItem;typedef struct celula{    TipoItem item;    struct celula *prox;}Celula;typedef struct{    Celula *prim;    Celula *ult;}Lista;void FLVazia(Lista *lista){    lista->prim=(Celula*)malloc(sizeof(Celula));    lista->prim->prox=NULL;    lista->ult=lista->prim;}int Vazia(Lista lista){    if(lista.prim==lista.ult)        return 0;    else        return 1;}void Insere(Lista *lista, TipoItem x){//tipoitem x é valor pois não precisa altera-lo    lista->ult->prox=(Celula*)malloc(sizeof(Celula));//aloca memoria para o prox do ultimo    lista->ult->prox->item=x;//acessa o campoitem e coloca x dentro dele    lista->ult=lista->ult->prox;//o ultimo avança para a primeira    lista->ult->prox=NULL;//aterra}void Imprime(Lista lista){    Celula *aux;    aux = (Celula*)malloc(sizeof(Celula));    aux = lista.prim->prox;    while(aux!=NULL){        printf("Nome: %s ", aux->item.nome);        printf("Sobrenome: %s ", aux->item.sobrenome);        printf("Idade: %d",aux->item.idade);        printf("Identidade: %s",aux->item.id);        printf("Data de nascimento: %s ", aux->item.data_nasc);        printf("---o: %s ", aux->item.---o);        aux = aux->prox;    }}//Celula *Pesquisa(TipoItem x, Lista lista)//{//    if(!Vazia(lista)){//        Celula *aux =lista.prim;//        while(aux->prox != NULL){//            if(aux->prox->item.cod==x.cod){//                return aux;//            }//        aux=aux->prox;//        }//        printf("Posicao nao existente!")//    }else//        printf("Posicao nao existente!")//}void Retira(Celula *p, Lista *lista, TipoItem *x){    if(p==NULL || p->prox==NULL || Vazia(*lista)){        printf("\nNão [e possivel retirar!");        return;    }    Celula *aux;    aux=p->prox;    p->prox=aux->prox;    *x=aux->item;    free(aux);    if(p->prox==NULL){        lista->ult=p;    }}void ordenaNome(Lista* lista, TipoItem x){    Celula *aux;    Celula *aux2;    aux2 = (Celula*)malloc(sizeof(Celula));    aux2->item.nome = x.nome;//aux2 é a celula que vai armazenar o nome digitado    aux = lista->prim->prox;;//aux vai apontar pro prox da cabeça    //se o nome digitado for maior que o que está no prox da aux, e menor que o prox do prox da aux    if(strcmp(x.nome, aux->item.nome) == 1 && strcmp(x.nome, aux->prox->item.nome) == -1){        aux2 = aux->prox;//aux de prox passa a apontar para aux2        aux2->prox = aux->prox;//aux2 passa a apontar para a celula que aux apontava    }}int main(){    TipoItem item;    Lista lista;    FLVazia(&lista);    int qtd, i;    printf("Informe a quantidade de pessoas que deseja cadastrar: ");    scanf("%d",&qtd);    for(i = 0 ; i < qtd; i++){        printf("Informe o nome: ");        scanf("%s",&item.nome);        Insere(&lista,item);        printf("Informe o sobrenome: ");        scanf("%s",&item.sobrenome);        Insere(&lista,item);        printf("Informe a idade: ");        scanf("%d",&item.idade);        Insere(&lista,item);        printf("Informe a data de nascimento no formato dd/mm/aa: ");        scanf("%s",&item.data_nasc);        Insere(&lista,item);        printf("Informe a identidade: ");        scanf("%s",&item.id);        Insere(&lista,item);        printf("Informe o ---o: ");        scanf("%s",&item.---o);        Insere(&lista,item);    }    Imprime(lista);    ordenaNome(&lista,item);}

Estava tentando imprimir a lista normal primeiro, mas fui testar e o programa n responde dps q digito os dados. Oq pode ser?

 

 

Minha função imprime nao funciona em nenhum exercicio, n consigo nem ver se meus codigos estao certos D:

sempre para de responder na hora q chamo a função...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde,

 

você precisa se atentar às partes que envolvem alocação dinâmica.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
    char nome[50];
    char sobrenome[50];
    char data_nasc[15];
    char id[15];
    char ___o[20];
    int idade;
}TipoItem;

typedef struct celula{
    TipoItem item;
    struct celula *prox;
}Celula;

typedef struct{
    Celula *prim;
    Celula *ult;
}Lista;

void FLVazia(Lista *lista){
    lista->prim=(Celula*)malloc(sizeof(Celula));
    lista->prim->prox=NULL;
    lista->ult=lista->prim;
}

int Vazia(Lista lista){
    if(lista.prim==lista.ult)
        return 0;
    else
        return 1;
}

void Insere(Lista *lista, TipoItem x){//tipoitem x é valor pois não precisa altera-lo

    lista->ult->prox=(Celula*)malloc(sizeof(Celula));//aloca memoria para o prox do ultimo
    lista->ult->prox->item=x;//acessa o campoitem e coloca x dentro dele
    lista->ult=lista->ult->prox;//o ultimo avança para a primeira
    lista->ult->prox=NULL;//aterra

}

void Imprime(Lista lista){
//    aux = (Celula*)malloc(sizeof(Celula));
    Celula *aux = lista.prim->prox;
    while(aux!=NULL){
        printf("Nome: %s ", aux->item.nome);
        printf("Sobrenome: %s ", aux->item.sobrenome);
        printf("Idade: %d ",aux->item.idade);
        printf("Identidade: %s ",aux->item.id);
        printf("Data de nascimento: %s ", aux->item.data_nasc);
        printf("---o: %s\n", aux->item.___o);
        aux = aux->prox;
    }
}

//Celula *Pesquisa(TipoItem x, Lista lista)
//{
//    if(!Vazia(lista)){
//        Celula *aux =lista.prim;
//        while(aux->prox != NULL){
//            if(aux->prox->item.cod==x.cod){
//                return aux;
//            }
//        aux=aux->prox;
//        }
//        printf("Posicao nao existente!")
//    }else
//        printf("Posicao nao existente!")
//}

void Retira(Celula *p, Lista *lista, TipoItem *x){
    if(p==NULL || p->prox==NULL || Vazia(*lista)){
        printf("\nNão [e possivel retirar!");
        return;
    }
    Celula *aux;
    aux=p->prox;
    p->prox=aux->prox;
    *x=aux->item;
    free(aux);
    if(p->prox==NULL){
        lista->ult=p;
    }
}

void ordenaNome(Lista* lista, TipoItem x){

    Celula *aux, *aux2, *temp;
    temp = (Celula*)malloc(sizeof(Celula));
    aux = lista->prim->prox;
    while (aux->prox)
    {
        aux2 = aux->prox;
        while (aux2)
        {
            if (strcmp(aux->item.nome, aux2->item.nome) > 0)
            {
                temp->item = aux->item;
                aux->item = aux2->item;
                aux2->item = temp->item;
            }
            aux2 = aux2->prox;
        }
        aux = aux->prox;
    }
    free(temp);
//    aux2->item.nome = x.nome;//aux2 é a celula que vai armazenar o nome digitado
//    aux = lista->prim->prox;;//aux vai apontar pro prox da cabeça
//    //se o nome digitado for maior que o que está no prox da aux, e menor que o prox do prox da aux
//    if(strcmp(x.nome, aux->item.nome) == 1 && strcmp(x.nome, aux->prox->item.nome) == -1){
//        aux2 = aux->prox;//aux de prox passa a apontar para aux2
//        aux2->prox = aux->prox;//aux2 passa a apontar para a celula que aux apontava
//    }
}

int main(){
    TipoItem item;
    Lista lista;
    FLVazia(&lista);
    int qtd, i;

    printf("Informe a quantidade de pessoas que deseja cadastrar: ");
    scanf("%d",&qtd);

    for(i = 0 ; i < qtd; i++){

        printf("Informe o nome: ");
        scanf("%s",item.nome);
        printf("Informe o sobrenome: ");
        scanf("%s",item.sobrenome);
        printf("Informe a idade: ");
        scanf("%d", &item.idade);
        printf("Informe a data de nascimento no formato dd/mm/aa: ");
        scanf("%s",item.data_nasc);
        printf("Informe a identidade: ");
        scanf("%s",item.id);
        printf("Informe o ---o: ");
        scanf("%s",item.___o);
        Insere(&lista,item);
    }

    ordenaNome(&lista,item);
    Imprime(lista);

    return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite, pessoal.

Estou como uma grande dificuldade neste algoritmo não sei por onde começar, alguém pode me dar uma ajuda.

Obrigado

Considere n cidades numeradas de 0 a n-1 que estão interligadas por uma série de estradas de mão única. As ligações entre as cidades são representadas pelos elementos de uma matriz quadrada Lnxn, cujos elementos lij assumem o valor 1 ou 0, conforme exista ou não estrada direta que saia da cidade i e chegue à cidade j. Assim, os elementos da linha i indicam as estradas que saem da cidade i, e os elementos da coluna j indicam as estradas que chegam à cidade j.

Por convenção lii = 1.

(a) Dado k, determinar quantas estradas saem e quantas chegam à cidade k. (usar o if)

A qual das cidades chega o maior número de estradas? (cont++)

(d) Relacionar as cidades que possuem saídas diretas para a cidade k.

(e) Relacionar, se existirem:

i. As cidades isoladas, isto é, as que não têm ligação com nenhuma outra;
ii. As cidades das quais não há saída, apesar de haver entrada;
iii. As cidades das quais há saída sem haver entrada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.