paulo1205
(usa Ubuntu)
Enviado em 19/05/2014 - 17:30h
O que você está fazendo parece um pouco estranho. Normalmente, quando o elemento da estrutura tem um campo para apontar para o próximo registro, você está trabalhando com listas encadeadas, e, nesse caso, geralmente não se usam arrays para conter a lista, mas vão se alocando ou removendo dinamicamente os elementos.
Por outro lado, quando se usam arrays, os elementos do array não costumam ser ponteiros, e a estrutura geralmente prescinde de um campo que indique o próximo elemento -- a não ser que você o empregue para alguma forma criativa de ordenar os elementos sem fazer
swaps . Mas mesmo que você tenha alguma função para o ponteiro
prox que eu não consiga enxergar, não existe a necessidade de fazer com que cada elemento do array seja um ponteiro pois, uma vez que todos os elementos ocupam uma posição fixa no momento em que o array é alocado, você poderia fazer algo como vai abaixo.
struct celula {
char nome[100], sobrenome[100];
int numero;
struct celula *prox;
};
struct celula lista[27]; /* Sem usar ponteiros! */
/* ... */
/* Usa elementos. Note o uso do campo “prox”. */
lista[n].prox=&lista[m]; /* ou “lista[n].prox=lista+m;”, que é equivalente */
snprintf(lista[n].nome, sizeof lista[0].nome, "%s", algum_nome);
snprintf(lista[n].sobrenome, sizeof lista[0].sobrenome, "%s", algum_sobrenome);
lista[n].numero=algum_numero;
Fazendo do jeito como você fez, cada ponteiro vai precisar, primeiro, apontar para uma região válida de memória, que você vai ter de obter por meio de funções que fazem alocação dinâmica de memória.
struct celula {
char *nome, *sobrenome;
int numero;
struct celula *prox;
};
struct celula *lista[27];
/* ... */
/* Aloca os elementos do array, sem tocar nos campos de cada elemento. */
for(i=0; i<27; i++){
lista[i]=calloc(1, sizeof(struct celula));
if(lista[i]==NULL){
perror("calloc");
exit(1);
}
}
/* ... */
/* Usa os elementos. */
lista[n]->prox=lista[m];
lista[n]->nome=strdup(algum_nome);
if(lista[n]->nome==NULL){
perror("strdup");
exit(1);
}
lista[n]->sobrenome=strdup(algum_sobrenome);
if(lista[n]->sobrenome==NULL){
perror("strdup");
exit(1);
}
lista[n]->numero=algum_numero;
/* ... */
/* Libera elementos da lista. */
for(i=0; i<27; i++){
/* Primeiro tem de liberar os dados alocados dentro do elemento. */
free(lista[i].nome);
free(lista[i].sobrenome);
free(lista[i]);
}
Se você estiver usando C++, com a biblioteca STL você tem os benefícios sintáticos (até melhores, aliás) e de automatismo de alocação dos arrays, ao mesmo tempo em que, na prática, não desperdiça memória, já que a alocação, por trás das cortinas, é dinâmica, não apenas para a estrutura, mas também para as strings.
#include <string>
#include <vector>
#include <list>
using namespace std;
struct celula {
string nome, sobrenome;
int numero;
celula(string _nome, string_sobrenome, int _numero):
nome(_nome), sobrenome(_sobrenome), numero(_numero) { }
};
/*
Cria uma lista encadeada. Note que o próximo não
é uma propriedade da célula de dados, mas de cada
nó da lista. A lista é percorrida sempre sequen-
cialmente, de modo que para chegar ao N-ésimo ele-
mento, é necessário partir de uma das pontas e ir
contando até chegar ao elemento desejado, mas a
lista admite inserir com facilidade novos elemen-
tos em qualquer parte (início, meio ou fim).
*/
list<celula> lista;
list<celula>::iterator iter_lista; // para percorrer a lista
/*
Cria um array (vetor). Os elementos do array são
acedidos por meio do índice, que vai de 0 a N-1,
como um array nativo do C, mas também é possível
andar de um em um, como na lista. Mas, ao contrário
da lista, mudar o tamanho do array e inserir ele-
mentos no meio de dois outros elementos podem ser
operações custosas.
*/
vector<celula> array;
vector<celula>::iterator iter_array; // para percorrer o array
/* ... */
lista.push_back(celula("Jose", "da Silva", 42));
array.resize(15);
array[0]=celula("Joao", "de Souza", 18);
for(int i=1; i<15; i++)
array[i]=celula("Joao", string("de Souza ") + numeral_romano(i), 18+i*3)
// Copia elementos do array para lista
iter_lista=lista.begin();
for(iter_array=array.begin(); iter_array!=array.end(); iter_array++)
lista.insert(iter_lista, *iter_array);