Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

25.05.2011, 15:31

[C++] Verkettete Liste in einer verketteten Liste

Um einen dynamischen 2D-Array zu realisieren der mir zwei Strings speichert, habe ich in eine verkettete Liste, eine weitere verkette Liste eingebunden.

Gedanklich sehe das ganze so aus: http://666kb.com/i/btser4c41ff5jlnf9.png

Sinn der ganzen Geschichte ist, ich möchte aus einem Log-File zu jeder GUID, alle unterschiedlichen Nicknamen zuordnen. D.h. es soll keine GUID doppelt vorkommen und bei jeder GUID, sollte auch kein Nickname doppelt sein. Doppelte Nicknamen dürfen nur mit unterschiedlichen GUIDs existieren.

Hier der Quellcode der die Liste ggf. um eine GUID und/oder Nicknamen erweitert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
 //Liste fuer Nicknamen
struct SNicknameList
{
    string nickname;
    SNicknameList *next; // Verknüpfung zum Nachfolger
    
};

 //Liste fuer GUIDs und fuer das erste Element der NicknameList
struct SGUIDList
{
    string guid;
    SGUIDList *next;
    SNicknameList *first;
};

//GLOBAL
SGUIDList *GUIDAnker = NULL;

void AddNickname(string guid, string nickname)
{
    //Temp. Var fuer GUID Ueberpruefung
    SGUIDList *tempGUID;
    tempGUID = GUIDAnker;

    while(tempGUID) {

        //Wenn die GUID bereits eingetragen ist
        if(tempGUID->guid == guid) {

            //Temp. Var fuer Nickname Ueberpruefung
            SNicknameList *tempNick;
            tempNick = tempGUID->first;

            while(tempNick) {

                //Wenn der Nickname bereits eingetragen ist                         
                if(tempNick->nickname == nickname) {
                    //Verlasse die Funktion, da nichts in die Liste eingetragen werden soll
                    return;
                }   

                tempNick = tempNick->next;
            }

            //Wenn der Nickname noch nicht eingetragen ist, fuege ihn in die innere Liste ein
            SNicknameList *nodeNick = new SNicknameList;
            nodeNick->nickname = nickname;
            nodeNick->next = tempGUID->first;

            tempGUID->first = nodeNick;

            //Verlasse danach die Funktion
            return;
        }
        tempGUID = tempGUID->next;
    }

    //Falls weder GUID noch Nickname vorhanden sind
    //Fuege beide hinzu
    SGUIDList *nodeGUID = new SGUIDList;
    nodeGUID->guid = guid;
    nodeGUID->next = GUIDAnker;

    GUIDAnker = nodeGUID;
    
    SNicknameList *nodeNick = new SNicknameList;
    nodeNick->nickname = nickname;
    nodeNick->next = nodeGUID->first;

    nodeGUID->first = nodeNick;
}


Und mit dieser Funktion gebe ich testweise den Inhalt meiner verketteten Liste aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void ShowNickList()
{
    SGUIDList *tempGUID;
    tempGUID = GUIDAnker;
    
    while(tempGUID) {

        SNicknameList *tempNick;
        tempNick = tempGUID->first;

        while(tempNick) {   

            cout << tempGUID->guid << " " << tempNick->nickname << endl;

            tempNick = tempNick->next;
        }

        tempGUID = tempGUID->next;
    }


}


Starte ich nun mein Programm und rufe die Funktion ShowNickList() auf, so hält es nach kurzer Zeit an und auf der Konsole erhalte ich folgende Nachricht:
"Segmentation fault"

Leider kann ich keinen Fehler in meinem Code erkennen ?(

PS: compiliert unter Ubuntu mit g++

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

2

25.05.2011, 16:06

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
//Falls weder GUID noch Nickname vorhanden sind
    //Fuege beide hinzu
    SGUIDList *nodeGUID = new SGUIDList;
    nodeGUID->guid = guid;
    nodeGUID->next = GUIDAnker;

    GUIDAnker = nodeGUID;
    
    SNicknameList *nodeNick = new SNicknameList;
    nodeNick->nickname = nickname;
    nodeNick->next = nodeGUID->first;    // <-- Ist undefiniert !!!

    nodeGUID->first = nodeNick;


Also hier sehen nen fehler... da ist nodeGUID->first undefiniert und wird erst danach gesetzt.

Ich empfehle dir trotzdem einfach in diesem fall std::map/std::set zu nehmen, anstatt das selbst zu proggen.
Das ist schneller, einfacher (einfach std::map<...>::find(...) aufrufen fertig.), und sicherer.
Achja wenn du alle Elemente durchiterieren willst, kannst du einfach den Iterator benutzen.