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++