Linked list



  • Hallo!
    Ich würd gerne von euch wissen ob meine Logik bei diesem codesnippet richtig ist, da ich zum ersten mal mit d-l-l`s arbeite

    //////////////////////////////////////////////////////////////////////////////////////////////////
    	// Name: SearchAristOfAlbum()
    	// Desc: Returns the count of found albums of this artist and a list with the results.
    	//////////////////////////////////////////////////////////////////////////////////////////////////
    	int SearchForArtistOfAlbum(string strArist, LPMIAlbumList pResult) {
    
    		pResult = new MIAlbumList;
    
    		LPMIAlbumList pTemp1 = gpAlbumList;
    		int iCnt = 0;
    
    		while(pTemp1) {
    
    			if(strstr(pTemp1->strArtist.c_str(), strArist.c_str())) {
    				if(pResult != NULL && pResult->pNext == NULL) {
    						pResult->pNext = new MIAlbumList;
    						pResult = pResult->pNext;
    				}
    				pResult = pTemp1;
    				pTemp1  = pTemp1->pNext;
    			}
    			iCnt++;
    		}
    
    		return iCnt;
    	}
    	//////////////////////////////////////////////////////////////////////////////////////////////////
    

    greets,
    cNc



  • was soll d-l-l heißen? doubly-linked-list? dann hast du aber jeweils die prev-Zeiger vergessen.

    Ansonsten kann ich die Logik nur schwer nachvollziehen, hast du mal dran gedacht, für Sachen wie add_to_front usw. Funktionen zu schreiben (wenn die Liste schon keine Klasse ist)? Das heißt natürlich nicht dass sie zwangsläufig falsch ist, aber mir kommt beispielsweise die Zuweisung 'pResult = pTemp1' ziemlich spanisch vor. Und was auf jeden Fall fehlt: pResult muß per Referenz übergeben werden, sonst bekommt der Aufrufer von der geänderten Liste nichts mit.



  • pResult wird in dieser funktion erst alloziiert.

    pPrev brauche ich in diesem fall nicht, da ich vom ersten element anfange zu suchen (bis zum letzten)
    und dann je nach treffer/fehler, erhöhe ich iCnt um eins, erstelle ne neue node, und weise sie zu ...

    obwohl, du hast recht, ich muss pPrev wohl auch benutzen ...

    so oder?
    pResult->pNext->pPrev = pResult;



  • cNcMasta schrieb:

    pResult wird in dieser funktion erst alloziiert.

    das seh ich. und?

    pPrev brauche ich in diesem fall nicht, da ich vom ersten element anfange zu suchen (bis zum letzten)
    und dann je nach treffer/fehler, erhöhe ich iCnt um eins, erstelle ne neue node, und weise sie zu ...

    beim bauen der Liste darfst du das aber nicht ignorieren



  • Hi,

    irgendwie sieht das ganze nicht wie eine Übung zu veketteten Listen aus. Warum nimmst Du nicht std::list ?

    grüße Con@n



  • Hab es jetzt auf std::list umgebaut,
    wollte eig. nur fragen, ob das so richtig ist, also kompilieren tuts

    //////////////////////////////////////////////////////////////////////////////////////////////////
    	// Name: SearchTitleOfTrack()
    	// Desc: Returns the count of found albums of this artist and a list with the results.
    	//////////////////////////////////////////////////////////////////////////////////////////////////
    	std::list<LPMIAlbum> SearchForReleaseDateOfTrack(string strReleaseDate) {
    
    		std::list<LPMIAlbum> pResult;
    		std::list<LPMIAlbum>::iterator pIt = gpAlbumList.begin();
    		std::list<LPMITrack> pTrack;
    		std::list<LPMITrack>::iterator pTIt = (*pIt)->pTracks.begin();
    
    		while(*pIt) {
    
    			while(*pTIt) {
    				if(strstr(&*(*pTIt)->strReleaseDate.c_str(), strReleaseDate.c_str())) {
    
    					pResult.push_back(*pIt);
    					(*pResult.end())->pTracks.clear();
    					(*pResult.end())->pTracks.push_back(*pTIt);
    				}
    				++(*pTIt);
    			}
    			++(*pIt);
    		}
    
    		return pResult;
    	}
    	//////////////////////////////////////////////////////////////////////////////////////////////////
    

Anmelden zum Antworten