0 Pluspunkte 0 Minuspunkte
Ich habe schon verstanden was eine Linked List ist aber wo soll ich anfangen meine eigene zu schreiben? Also mit den ganzen Funktionen zum einfügen, bearbeiten, löschen u.s.w.
von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Hier ein einfaches Beispiel einer Linked List mit Funktionen zum Einfügen, Suchen, Bearbeiten und Löschen.

#include <stdio.h>
#include <stdlib.h>

// Struktur für ein Listenknoten
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// Funktion zum Erstellen eines neuen Knotens
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL) {
        printf("Fehler: Speicher konnte nicht allokiert werden.\n");
        exit(1);
    }
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// Funktion zum Einfügen eines neuen Knotens am Anfang der Liste
Node* insertNode(Node* head, int data) {
    Node* newNode = createNode(data);
    if (head == NULL) {
        head = newNode;
    } else {
        newNode->next = head;
        head = newNode;
    }
    printf("Knoten mit Wert %d wurde eingefügt.\n", data);
    return head;
}

// Funktion zum Suchen eines Knotens mit gegebenem Wert
Node* searchNode(Node* head, int data) {
    Node* currentNode = head;
    while (currentNode != NULL) {
        if (currentNode->data == data) {
            printf("Knoten mit Wert %d wurde gefunden.\n", data);
            return currentNode;
        }
        currentNode = currentNode->next;
    }
    printf("Knoten mit Wert %d wurde nicht gefunden.\n", data);
    return NULL;
}

// Funktion zum Löschen eines Knotens mit gegebenem Wert
Node* deleteNode(Node* head, int data) {
    Node* currentNode = head;
    Node* prevNode = NULL;

    while (currentNode != NULL) {
        if (currentNode->data == data) {
            if (prevNode == NULL) {
                head = currentNode->next;
            } else {
                prevNode->next = currentNode->next;
            }
            printf("Knoten mit Wert %d wurde gelöscht.\n", data);
            free(currentNode);
            return head;
        }
        prevNode = currentNode;
        currentNode = currentNode->next;
    }

    printf("Knoten mit Wert %d wurde nicht gefunden und konnte nicht gelöscht werden.\n", data);
    return head;
}

// Funktion zum Ändern des Werts eines Knotens mit gegebenem Wert
void modifyNode(Node* head, int data, int newData) {
    Node* node = searchNode(head, data);
    if (node != NULL) {
        node->data = newData;
        printf("Wert des Knotens mit Wert %d wurde zu %d geändert.\n", data, newData);
    } else {
        printf("Knoten mit Wert %d konnte nicht gefunden und nicht geändert werden.\n", data);
    }
}

// Funktion zum Anzeigen der gesamten Liste
void displayList(Node* head) {
    Node* currentNode = head;
    if (currentNode == NULL) {
        printf("Die Liste ist leer.\n");
    } else {
        printf("Liste: ");
        while (currentNode != NULL) {
            printf("%d ", currentNode->data);
            currentNode = currentNode->next;
        }
        printf("\n");
    }
}

// Funktion zum Freigeben des Speichers der gesamten Liste
void freeList(Node* head) {
    Node* currentNode = head;
    Node* tempNode = NULL;
    while (currentNode != NULL) {
        tempNode = currentNode;
        currentNode = currentNode->next;
        free(tempNode);
    }
}

int main() {
    Node* head = NULL;

    head = insertNode(head, 10);
    head = insertNode(head, 20);
    head = insertNode(head, 30);

    displayList(head);

    searchNode(head, 20);
    searchNode(head, 40);

    head = deleteNode(head, 20);
    displayList(head);

    modifyNode(head, 10, 50);
    displayList(head);

    freeList(head);

    return 0;
}

Hier noch ein Beispiel auf GDB Online.

von (716 Punkte)