0
Good morning. I have a problem to solve a question of a question here in the college. Follow the question.
The teacher gave the source code (below)
#include<stdio.h>
#include<stdlib.h>
#include <locale.h>
#define dimencao 10
typedef struct celula{
int *endereco;
int cont;
int tam;
}Celula;
void menu();
void verifica(int *espaco);
void liberarEspaco(Celula vetor[]);
void inicializa(Celula vetor[]);
void cria_vetor(Celula vetor[], int posicao);
void insere(Celula vetor[]);
void imprime(Celula vetor[]);
void imprimirIntercalado(Celula vetor[]);
int maiorTam(Celula vetor[]);
int main(){
setlocale(LC_ALL, "Portuguese");
Celula vetor[dimencao];
int opcao;
inicializa(vetor); // Inicializa todo o vetor com valor NULL
menu();
scanf("\n%d", &opcao);
while(opcao != 0){
system("PAUSE");
system("cls");
switch(opcao){
case 1: insere(vetor); break;
case 2: liberarEspaco(vetor); break;
case 3: imprime(vetor); break;
case 4: imprimirIntercalado(vetor);
default: printf("\nValor inválido!\n"); break;
}
menu();
scanf("\n%d", &opcao);
}
return 0;
}
void menu(){
printf("********************* MENU *************************");
printf("\n*\tDigite uma das opções abaixo: *");
printf("\n*\tDigite 1 para inserir elementos no vetor. *");
printf("\n*\tDigite 2 para liberação de espaço no vetor.*");
printf("\n*\tDigite 3 para imprimir todo o vetor. *");
printf("\n*\tDigite 4 Imprimir intercalado inicial *");
printf("\n*\tDigite 0 para SAIR. *");
printf("\n----------------------------------------------------\n");
printf("Digite AQUI -> ");
}
void liberarEspaco(Celula vetor[]){
int espaco;
printf("Informe o vetor que deseja liberar: Faixa entre 1 - 10:");
printf(" -> ");
scanf("\n%d", &espaco);
verifica(&espaco);
if (vetor[espaco].endereco == NULL){
printf("\nVetor %d VAZIO não é possível liberar espaço !!!\n\n", espaco);
} else{
int i = 0;
for(i = 0; i < vetor[espaco-1].tam; i++)
free (vetor[espaco-1].endereco[i]);
}
}
void inicializa(Celula vetor[]){
int i;
for (i=0; i<dimencao; i++){
vetor[i].endereco = NULL;
}
}
void cria_vetor(Celula vetor[], int posicao){
int size;
printf("\nInforme o tamanho do vetor na posição %d: ", posicao);
scanf("\n%d",&size);
while(size <= 0){
printf("\nTamanho deve ser maior que zero !!! "); // validar a faixa
printf("\nInforme novamente -> ");
scanf("\n%d",&size);
}
vetor[posicao-1].endereco = (int *) malloc(size*sizeof(int));
vetor[posicao-1].cont = 0;
vetor[posicao-1].tam = size;
}
void insere(Celula vetor[]){
int posicao, num;
printf("\nQual posição você deseja inserir? Faixa entre 1 - 10: "); // validar a faixa
printf("-> ");
scanf("\n%d",&posicao);
verifica(&posicao);
if(vetor[posicao-1].endereco == NULL){
cria_vetor(vetor, posicao);
}
if(vetor[posicao-1].cont == vetor[posicao-1].tam) //verificar se o vetor endereço está cheio
printf("\nVetor %d está CHEIO !!! \n\n", posicao);
else{
printf("\nInforme o elemento: ");
printf("-> ");
scanf("\n%d",&num);
vetor[posicao-1].endereco[vetor[posicao-1].cont] = num;
vetor[posicao-1].cont++;
printf("\n");
}
}
void imprime(Celula vetor[]){
int i, j;
for(i=0; i<dimencao; i++){
if (vetor[i].endereco != NULL){
printf("\n------------");
printf("\nVetor %d", i+1);
printf("\n____________");
for(j=0; j<vetor[i].cont; j++)
printf("\n%d", vetor[i].endereco[j]);
printf("\n\n");
}else
printf("\nVetor %d VAZIO", i+1);
}
printf("\n\n");
}
void verifica(int *espaco){
while(*espaco < 1 || *espaco > 10){
printf("\nPosição do vetor não corresponde! Faixa entre 1 - 10: "); // validar a faixa
printf("\nInforme novamente -> ");
scanf("\n%d", &(*espaco));
}
}
int maiorTam(Celula vetor[]) {
int i = 0;
int maior = 0;
for(i = 0; i < dimencao; i++)
if(vetor[i].tam > maior)
maior = vetor[i].tam;
return maior;
}
void imprimirIntercalado(Celula vetor[]) {
int maior = maiorTam(vetor);
int i, ic = 0, j;
for(i = 0; i < maior; i++) {
for(j = 0; j < dimencao; j++)
if(vetor[j].endereco[0] != NULL)
if(vetor[j].endereco[ic] != NULL)
printf("%d ", vetor[j].endereco[ic]);
ic++;
}
}
Every time I try to run option 4 the program hangs.
If you could give me that strength, I’d appreciate it. :)
Option 4 = void printIntercalado(Vector cell[]);
– HDeiro
Can you be more specific about what you want? What’s the problem?
– Maniero
Bigown, what’s happening is that I fill in the values and at the time I ask to print intercalated locks. Type, I did the test of printing every vector (option 3), it shows the filled value, but at the time of intercalation... I tried to check if the Cell vector is NULL before reading, but Codeblocks did not allow, saying I was comparing a pointer with integer.
– HDeiro
Aren’t you comparing the address the pontriro points to instead of the value it stores? I didn’t see the code. By the way, try debug step by step, step by step, from code Blocks. So you can know which problematic line.
– krystalgamer