Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    26

    [C] liste doppiamente concatenate (non circolare)

    codice:
    if(ListFace==NULL){
            ListFace=(Face*)malloc(sizeof(Face));
            ListFace=nodoF;
            correnteF=nodoF;
            ListFace->next=NULL;
            ListFace->prev=NULL;
      }
      else{
             correnteF->next=(Face*)malloc(sizeof(Face));
             correnteF=correnteF->next;
             correnteF=nodoF;
             correnteF->prev=ListFace;
             correnteF->next=NULL;
             ListFace=correnteF;
             }
    è un codice che può andare bene? se no, dove sbaglio concettualmente?

  2. #2
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    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.
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    26
    Quote Originariamente inviata da infinitejustice Visualizza il messaggio
    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);
    Ultima modifica di zenplus; 06-02-2015 a 16:58

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.