You are not logged in.

  • Login

1

Saturday, November 19th 2011, 2:04pm

verkette liste insert();

Hallo leute!

Ich schreibe gerade an einer verkette liste das ganze funzt soweit auch ganz gut nur habe ich ein Problem mit meinem Insert:

Also meine liste besteht aus zwei Struct :

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
struct element
{
  int value;
  struct element *next;
}
 
struct list
{
  struct element *first;
   struct element *last;
}


meine Insert funktion :

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void einfügen(struct list *list, int val)
{
   struct element *nele;
   struct list *list_itr = list;
   nele = malloc(sizeof(struct element);
  nele -> value = val;
 
  if (list_itr -> first == NULL)
   {
   list_itr->first = nele;
   list_itr->last = nele;
   nele -> next = NULL;
  }else
  {
nele ->next = list_itr-last;
list_itr->last = nele;
 }
 
}


Zu erklärung der insert ich schau einfach ob es schon ein erstes element gibt wenn nicht schreib ich das an die erste und an die letzte stelle der liste klar da die liste ja zu dem zeitpunkt nur aus einem Element besteht falls ein element vorhanden ist setze ich das neue einfach an die letzte stelle so nun zu meinem problem das ganze funktioniert nicht es wird mir immer nur das erste element ausgegeben.

Aber wenn ich das ganze so schreibe:

C/C++ Quellcode

1
2
3
4
5
else
   {
 nele ->next = list_itr-last;
 list_itr->first = nele;
  }

also praktisch das neue element einfach an den anfang setze dann funktionier es ist aber in der umgekehrten reihenfolge also das zuletzt eingefügte element ist am anfang möchte es aber umgekehrt ich weiß aber nicht wo der Fehler liegt ?
Die Logik sollte doch passen ? ich hoffe ihr könnt mir helfen

Viele Grüße

PS: nele steht für newelement... bin faul ;)

EDIT:

MIr ist gerade aufgefallen das bei 3 elementen immer das zuletzt eingefügte element überschrieben wird daher habe ich das ganze noch etwas umgeschrieben:

C/C++ Quellcode

1
2
3
4
5
6
7
else
  {
temp = list->first;
list_itr->first = nele;
 
nele ->next =temp;
 }


So kann ich zumindest mehrere elemente einfügen aber das eigentliche problem habe ich immer noch nicht gelöst !
Außerdem habe ich noch ein problem in der remove gefunden
die fälle das das löschende element am anfang oder am ende ist wird zuerst vernachlässigt

C/C++ Quellcode

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
int löschen(struct list *list, int val)
{
   struct element * itr;
struct element * itr2;
struct list * lsit_itr = list;
struct element *tmp;
 
if (list_itr->first == NULL)
{
   printf("liste leer");
}
else {
 
   itr = list->first;
while (itr ! = NULL)
{
  itr2 = itr->next;
 
  if (itr2->value == val)
 {
 	itr -> next = itr->next->next;
}
 itr = itr->next;
}
 
 
}
}


Zur beschreibung ich fange an mit dem ersten element schaue nach ob das nachfolge element entsprechenden wert hat falls ja setze ich die zeiger des aktuellen elementes einfach zwei weiter also überspringe sozusagen das zu löschende element! allerdings bekomme ich dann immer ein: segmentation fault

verstehe aber nicht warum hängt aber wohl mit itr und itr2 zusammen

denn wenn ich ohne itr2 arbeite dann fuktioniert es wunderbar nur leider löscht es mir dann das element nach dem gesuchten logisch da ich eben nicht das nachfolgende ausgehend vom akutellen überprüfe sondern das aktuelle überprüfe und dessen zeiger ich dann ändere

bitte helft mir könnte echt verzweifeln so langsam

This post has been edited 3 times, last edit by "the_old_Pirate" (Nov 19th 2011, 3:25pm)


Social bookmarks