Cheatography
https://cheatography.com
Einfach verkettete Listen
Datenstruktur definieren |
typedef struct sData { int Index; double Value; struct sData *Next; };
|
Globale Zeiger auf Listenanfang und Listenende |
extern TData *First = NULL; extern TData *Last = NULL; Schlüsselwort extern, damit die Zeiger über alle Quelltextdateien verfügbar sind. Alternativ in main definieren. |
Funktionen (bspw. in list.c/h auslagern) |
Neues Element anhängen |
int appendInList(TData *Neu) { //prüfen, ob neues Element existiert if (Neu == NULL) return 0; //Neues Element ist neues Listenende Neu->Next = NULL; if (First == NULL) //Fall 1: Liste ist leer First = Last = Neu; else //Fall 2: Liste ist nicht leer Last = Last->Next = Neu; return 1; }
|
Neues Element (sortiert) einfügen |
int insertInList(TData *Neu) { TData *tmp = First; //prüfen, ob neues Element existiert if(Neu == NULL) return 0; if(First == NULL) { //Fall 1: Liste ist leer Neu->Next = NULL; First = Last = Neu; return 1; } if (First->Value >= Neu->Value( { //Fall 2: am Listenanfang einfügen Neu->Next = First; First = Neu; return 1; } if (Last->Value <= Neu->Value) { //Fall 3: am Listenende anhängen Neu->Next = NULL; Last = Last->Next = Neu; return 1; } //Fall 4: zwischen zwei Elemente einfügen while (tmp->Next != NULL) { //prüfen, ob neues Listenelement vor dem nächsten Listenelement eingefügt werden muss if (tmp->Next->Value >= Neu->Value) { Neu->Next = tmp->Next; tmp->Next = Neu; return 1; } return 0; }
|
Element löschen |
TData *removeFromList(int delIndex) { TData tmp = NULL, prev = NULL; // Fall 1: Liste leer? if (First == NULL) return NULL; // Fall 2: Listenanfang entfernen? if (First->Index == delIndex) { tmp = First; // nur ein Element in Liste? if (Last == First) Last = NULL; First = First->Next; return tmp; } // Fall 3: zu entfernendes Element suchen prev = First; tmp = prev->Next; while (tmp != NULL) { if (tmp->Index == delIndex) { prev->Next = tmp->Next; if (tmp == Last) // letztes Element entfernt? Last = prev; return tmp; } prev = tmp; tmp = tmp->Next; } return NULL; }
|
|
|
Doppelt verkettete Listen
An Liste anhängen |
int appendInList(TData *Neu) { //prüfen, ob neues Element existiert if (Neu == NULL) return 0; if (First == NULL) //Fall 1: Liste ist leer Neu->Next = Neu->Prev = NULL; First = Last = Neu; else //Fall 2: Liste ist nicht leer Neu->Next = NULL; Neu->Prev = Last; Last = Last->Next = Neu; return 1; }
|
In Liste (sortiert) einfügen |
int insertInList(TData *Neu) { TData *tmp = First; //prüfen, ob neues Element existiert if(Neu == NULL) return 0; if(First == NULL) { //Fall 1: Liste ist leer Neu->Next = Neu->Prev = NULL; First = Last = Neu; return 1; } if (First->Value >= Neu->Value( { //Fall 2: am Listenanfang einfügen Neu->Next = First; Neu->Prev = NULL; First = First->Prev = Neu; return 1; } if (Last->Value <= Neu->Value) { //Fall 3: am Listenende anhängen Neu->Prev = Last; Neu->Next = NULL; Last = Last->Next = Neu; return 1; } //Fall 4: zwischen zwei Elemente einfügen while (tmp->Next != NULL) { //prüfen, ob neues Listenelement vor dem nächsten Listenelement eingefügt werden muss if (tmp->Next->Value >= Neu->Value) { Neu->Next = tmp->Next; Neu->Prev = temp; tmp->Next = temp->Next->Prev = Neu; return 1; } tmp = temp->Next; } return 0; }
|
Aus Liste entfernen |
TData *removeFromList(int delIndex) { TData *tmp = NULL, *prev = NULL; // Fall 1: Liste leer? if (First == NULL) return NULL; // Fall 2: Listenanfang entfernen? if (First->Index == delIndex) { tmp = First; First = First->Next; // nur ein Element in Liste? if (First == NULL) Last = NULL; else First->Prev = NULL; return tmp; } // Fall 3: Listenende entfernen? if (Last->Index == delIndex) { tmp = Last; Last = Last->Prev; Last->Next = NULL; return tmp; } //Fall 4: zu entfernendes Element suchen tmp = First->Next; while (tmp != NULL) { if (tmp->Index == delIndex) { prev = tmp->Prev; prev->Next = tmp->Next; prev->Next->Prev = prev; return tmp; } tmp = tmp->Next; } return NULL; }
|
Alle Elemente auflisten |
typedef enum {forward, backward} TDirection; void printList(TDirection Direction) { TData *tmp = (Direction == forward) ? First : Last; int AnzahlElemente = 0; printf("\nIndex "); while (tmp) { printf("| %3i ", tmp->Index); tmp = (Direction == forward) ? tmp->Next : tmp->Prev; AnzahlElemente++; } printf("\n------"); while (AnzahlElemente--) printf("------"); printf("\nWert "); tmp = (Direction == forward) ? First : Last; while (tmp != NULL) { printf("| %3.0f ", tmp->Value); tmp = (Direction == forward) ? tmp->Next : tmp->Prev; } printf("\n"); }
|
|
Created By
Metadata
Comments
No comments yet. Add yours below!
Add a Comment
Related Cheat Sheets
More Cheat Sheets by TimSch