FALHA DE SEGMENTAÇÃO (IMAGEM DO NÚCLEO GRAVADA)

1. FALHA DE SEGMENTAÇÃO (IMAGEM DO NÚCLEO GRAVADA)

Matheus Amaral de Araujo
theuamaral

(usa Ubuntu)

Enviado em 30/07/2017 - 18:51h

Boa noite, estou fazendo um trabalho da faculdade, fiz o código, ele está funcionando normalmente no windows. No Ubuntu ele está compilando, quando eu começo a usar a função Insere, ele dá esse erro que está no assunto.

Segue o meu código:

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

#define N 11
int tamanho = 1; //Numero de inserções

typedef struct pessoa{
int idadep;
char nomep[20];
char enderecop[20];
struct pessoa *prox;
}Pessoa;

void inicializa(Pessoa **p){
*p = NULL;
}

int iq(char Nome[]);

void insere(Pessoa **p, char nome[], int idade, char endereco[]){
Pessoa *ultimo,*aux,*penultimo;
int i = 0;
tamanho++;
// printf("inserindo %s no vetor de posicao %d\n",nome,iq(nome));

aux = (Pessoa*) malloc(sizeof(Pessoa));
ultimo = (Pessoa*) malloc(sizeof(Pessoa));
penultimo = (Pessoa*) malloc(sizeof(Pessoa));

if (*p == NULL){
// printf("nulo\n");
strcpy(ultimo->nomep,nome);
ultimo->idadep = idade;
strcpy(ultimo->enderecop,endereco);
ultimo->prox = NULL;
*p = ultimo;

}
else{
penultimo = *p;
ultimo = *p;
while(ultimo != NULL){
if(strcmp(nome,ultimo->nomep) < 0){//nome tem que ficar antes de ultimo->nome
strcpy(aux->nomep,nome);
aux->idadep = idade;
strcpy(aux->enderecop,endereco);
aux->prox = ultimo;
if(i == 0)
*p = aux;
else{
penultimo->prox = aux;
}
break; //sai do while
}
else if(strcmp(nome, ultimo->nomep) == 0) //O nome a ser inserido já existe na lista
return;
else{ //nome tem que ficar depois de ultimo->nome
if(ultimo->prox == NULL){ //chegou ao final, então insere ele no final
strcpy(aux->nomep,nome);
aux->idadep = idade;
strcpy(aux->enderecop,endereco);
aux->prox = NULL;
ultimo->prox = aux;
break;
}
penultimo = ultimo;
ultimo = ultimo->prox;
}
i++;
}
}
}

void consulta(Pessoa **p, char nome[]){
Pessoa *aux;
aux = *p;
while(aux != NULL){
if (strcmp(aux->nomep, nome) == 0){
printf("%s\n", aux->nomep);
printf("%d\n", aux->idadep);
printf("%s\n", aux->enderecop);
}
aux = aux->prox;
}
}

void Remove(Pessoa** p, char nome[] ){
Pessoa* ant, * aux;
ant = NULL;
aux = *p;
while(aux != NULL && strcmp(aux->nomep, nome) !=0){
ant = aux;
aux = aux->prox;
}
if (aux == NULL || p == NULL){
return;
}
else if(ant == NULL && strcmp(aux->nomep, nome) ==0){ //tá no primeiro elemento
*p = aux->prox;
}
else if(aux->prox == NULL && strcmp(aux->nomep, nome) ==0){
ant->prox = NULL;
}
else{
ant->prox = aux->prox;
}
}

void print(Pessoa **p){
Pessoa *aux;
aux = *p;
while (aux != NULL){
printf("%s \n", aux->nomep);
//printf("%d \n", aux->idadep);
//printf("%s \n", aux->enderecop);
aux = aux->prox;
}
}


int ordc(char LetraNome){
int x;

if(LetraNome == ' ')
return 27;
else{
if(LetraNome >= 65 && LetraNome <= 90) //Entre A e Z
x = LetraNome - 64;
else //Entre a e z
x = LetraNome - 96;
}
return x;
}

int iq(char Nome[]){
int i, rordc = 0;

for(i = 0; i < strlen(Nome); i++){
rordc += ordc(Nome[i]);
}
return rordc%N;
}

void criaHeap(Pessoa *vet, int i, int f){
Pessoa aux = vet[i];
int j = i * 2 + 1;
while (j <= f){
if(j < f){
if(strcmp(vet[j].nomep,vet[j + 1].nomep) < 0){
j = j + 1;
}
}
if(strcmp(aux.nomep, vet[j].nomep) < 0 ){
vet[i] = vet[j];
i = j; //j é o novo pai
j = 2 * i + 1;
}else{
j = f + 1;
}
}
vet[i] = aux;
}

void heapSort(Pessoa *vet, int n){
int i;
Pessoa aux;
for(i=(n - 1)/2; i >= 0; i--){
criaHeap(vet, i, n-1);
}
for (i = n-1; i >= 1; i--){
aux = vet[0];
vet [0] = vet [i];
vet [i] = aux;
criaHeap(vet, 0, i - 1);
}
}

int salvaLista(Pessoa* v, int tamV, Pessoa** p){
Pessoa *aux;
aux = *p;
int i = tamV;
while (aux != NULL){
strcpy(v[i].nomep,aux->nomep);
v[i].idadep = aux->idadep;
strcpy(v[i].enderecop,aux->enderecop);
aux = aux->prox;
i++;
}
return i;
}

void imprimeTudo(Pessoa **p){
Pessoa* copia = (Pessoa*) malloc(sizeof(Pessoa)*tamanho);
int tam = 0, in;
for(in = 0 ; in < N; in++)
tam = salvaLista(copia,tam,&p[in]);
heapSort(copia,tam);
for(in = 0 ; in < tam; in++)
printf("%s\n", copia[in].nomep);
}

int main(){
int indice, idade, qtd, in = 0;
char metodo, nome[20], endereco[20];
Pessoa **p = (Pessoa**) malloc(sizeof(Pessoa*)*N);
for(in = 0; in < N; in++)
inicializa(&p[in]);
while(metodo != 'e'){
scanf("%c", &metodo);
switch(metodo){
case 'i':
fflush(stdin);
scanf("%d", &qtd);
for(in = 0; in < qtd; in++){
fflush(stdin);
gets(nome);
fflush(stdin);
scanf("%d",&idade);
fflush(stdin);
gets(endereco);
fflush(stdin);
insere(&p[iq(nome)], nome, idade, endereco);
}
break;
case 'r':
fflush(stdin);
gets(nome);
Remove(&p[iq(nome)], nome);
break;
case 'c':
fflush(stdin);
gets(nome);
consulta(&p[iq(nome)], nome);
break;
case 'l':
fflush(stdin);
scanf("%d", &indice);
print(&p[indice]);
break;
case 'o':
fflush(stdin);
imprimeTudo(p);
break;
}

}

return 0;
}



  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts