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;
}