Hi there,
I'm having a problem with adding a data structure to an existing linked list that has highlighted a gap in my knowledge about the latter. Briefly, what I am trying to is add a 'particle' to the end (i.e. appending) of an existing linked list of particles. My 'particle' structure however contains a smaller linked list of neighbours i.e.
struct particle {
int Id;
double Mass;
double Pos[4]; // (r,x,y,z)
double Vel[3];
double neighbourdist; //distance of neighbour to particle (only used for those in neighbourlist)
int neighbourlistnum; //number of neighbouring particles
struct node_def *neighbourlist;
int cid; //Cluster id number for particle when it acts as a cluster
};
When adding a particle, then, I do the following:
node* add_to_clust(struct cluster *clust, struct particle *part) {
node *after = NULL;
node *current;
node *target;
node *added;
int i;
//First, don't add a particle if its id is already there
for(after = clust->clusterlist; after != NULL; after = after->next) {
if(after->p.Id == part->Id) {
return clust->clusterlist;
}
//previous = after;
}
// Create the new node for the particle
added = malloc(sizeof(node));
// Update fields of particle structure
added->p.Id = part->Id;
added->p.Mass = part->Mass;
for(i=0;i<4;i++) {
added->p.Pos[i] = part->Pos[i];
}
for(i=0;i<3;i++) {
added->p.Vel[i] = part->Vel[i];
}
// Need to also update neighbourlist field!
added->p.neighbourlist = part->neighbourlist;
// Assign cid to particle
added->p.cid = part->cid;
// Now append it to end of list
current = clust->clusterlist;
if(current == NULL) {
//List has no elements
printf("List currently empty\n");
current = added;
(clust->clusterlist) = current;
}
else if(current->next == NULL) {
//List has one element
printf("List has one element\n");
current->next = added;
}
else {
while(current->next != NULL) {
//Iterate through
current = current->next;
}
current->next = added;
}
added->next = NULL;
return clust->clusterlist;
}
When I later look at the final list and the properties of all the particles in it, I find that their Id, Mass, Pos, Vel, etc. fields are all there correctly, but the neighbourlist field is empty. This clearly has something to do with neighbourlist being a pointer to another linked list, but I can't figure out why it wouldn't copy that pointer over as it did with the other fields.
Any ideas would be greatly appreciated, has anyone come across this problem before?
Alex