
Originariamente inviata da
infinitejustice
Con una double linked list, dat oche la testa abbia *prev = NULL e la coda *next = NULL, ti serve un puntatore ad un qualunque elemento della lista ed una strategia. Come pensi di aggiungere nuovi elementi? In testa o in coda?
Creati una funzione di supporto che generi un nuovo elemento, allocandone la memoria, inizializzando i suoi elementi (next e prev a NULL). Poi agganci l'elemento dove ritieni piu opportuno nella lista.
All'inizio la tua lista sara vuota, quindi avrai un puntatore a NULL. Aiutati con una seconda funzione che aggiunga nuovi elementi. Qui, se il puntatore alla lista 'e vuoto, rendera il primo nuovo elemento la testa e coda della lista stessa .Else lo agigungera dove ritieni sia corretto. Qualora lo voglia agigungere alla coda, itera fino all'elemento con next = NULL. Qui farai elemento_corrente->next = nuovo_elemento. nuovo_element_>prev = elemento->corrente.
Se il nuovo elemento sara la nuova testa il discorso e' simile. Se lo aggiungi invece nel mezzo della lista, attento a non perder la reference tra i due elementi tra i quali lo aggiungerai.
Similmente, potresti creare funzioni che rimuovan un elemento e che la scorrano.
Allora, spiego bene la mia situazione. Sto creando un programma che legga i file .ply, questo programma si occupa di estrarre tramite fgets, una riga per volta. Sorvolando la parte iniziale dei file .ply (quindi sino ad end_header) dopo ci sono i vertici, allineati con le normali e il colore assegnato in rgb. io con la funzione sscanf estraggo ogni riga dal file come stringa e poi la suddivido nei dati utili dato che so esattamente come è organizzato il file .ply
Il mio lavoro consiste nel creare due liste, una di vertici e una di facce concatenarle tra di loro perchè hanno alcune informazioni comuni
codice:
struct Face{
int index; //Indice della faccia/triangolo
int v1; //Indice del primo vertice del triangolo
int v2; //Indice del secondo vertice del triangolo
int v3; //Indice del terzo vertice del triangolo
Face *next; //Puntatore all'elemento successivo della lista
Face *prev; //Puntatore all'elemento precedente della lista
Vertex *v1p; //Puntatore al primo vertice del triangolo
Vertex *v2p; //Puntatore al secondo vertice del triangolo
Vertex *v3p; //Puntatore al terzo vertice del triangolo
};
codice:
struct Vertex{
int index; //Indice del vertice
Point3D vertexCoordinates; //Coordinate del vertice
Normal3D vertexNormals; //Valori della normale sul vertice
ColorRGB vertexColor; //Colore del vertice
Vertex *next; //Puntatore all'elemento successivo della lista
Vertex *prev; //Puntatore all'elemento precedente della lista
Face *face; //Puntatore all'elemento faccia a cui il vertice appartiene
};
codice:
//questo è il codice che uso per salvare le informazioni e allocarle nella lista
//salvo il puntatore iniziale in myModel->DCvertexList
sscanf(s, "%f %f %f %f %f %f",&nodoV->vertexCoordinates.x,
&nodoV->vertexCoordinates.y,
&nodoV->vertexCoordinates.z,
&nodoV->vertexNormals.x,
&nodoV->vertexNormals.y,
&nodoV->vertexNormals.z);
nodoV->index=v_counter;
nodoV->vertexColor.r=0;
nodoV->vertexColor.g=0;
nodoV->vertexColor.b=0;
if(ListVertex==NULL){
ListVertex=(Vertex*)malloc(sizeof(Vertex));
ListVertex=nodoV;
correnteV=nodoV;
myModel->DCvertexList=ListVertex;
ListVertex->next=NULL;
ListVertex->prev=NULL;
}else{correnteV->next=(Vertex*)malloc(sizeof(Vertex));
correnteV=correnteV->next;
correnteV=nodoV;
correnteV->prev=ListVertex;
correnteV->next=NULL;
ListVertex=correnteV;
codice:
//raggiunti gli n_vertices presenti nel file .ply leggo le facce nello stesso modo
sscanf(s, "%d %d %d %d",&aux, // non uso questa informazione, sono tutti triangoli
&nodoF->v1,
&nodoF->v2,
&nodoF->v3);
nodoF->index=f_counter;
if(ListFace==NULL){
ListFace=(Face*)malloc(sizeof(Face));
myModel->DCfaceList=nodoF;
nodoF->next=NULL;
nodoF->prev=NULL;
correnteF=nodoF;
ListFace=nodoF;
}else if(ListFace->next==NULL){
ListFace->next=(Face*)malloc(sizeof(Face));
correnteF=correnteF->next;
correnteF=nodoF;
correnteF->prev=ListFace;
correnteF->next=NULL;
ListFace=correnteF;}
Il mio problema oltre non capire se la lista è efficente o no, è concatenare le informazioni comuni
xk mi da errore di segmentation fault in debug mode, ma in compilazione nessun errore, quindi non capisco
codice:
//ricerca per v1
ListVertex=myModel->DCvertexList;
ListFace=myModel->DCfaceList;
do{ if(ListVertex->index==ListFace->v1)
ListFace->v1p =ListVertex;
ListVertex->face = ListFace;
else{
ListVertex=ListVertex->next;
}
}while(ListVertex->index!=ListFace->v1);
//ricerca per v2
ListVertex=myModel->DCvertexList;
do{ if(ListVertex->index==ListFace->v2){
ListFace->v2p =ListVertex;
ListVertex->face = ListFace;}
else{
ListVertex=ListVertex->next;
}
}while(ListVertex->index!=ListFace->v2);
//ricerca per v3
ListVertex=myModel->DCvertexList;
do{ if(ListVertex->index==ListFace->v3){
ListFace->v3p =ListVertex;
ListVertex->face = ListFace;}
else{
ListVertex=ListVertex->next;
}
}while(ListVertex->index!=ListFace->v3);