美文网首页
Concerning Graph Prologue: The L

Concerning Graph Prologue: The L

作者: 刘煌旭 | 来源:发表于2021-01-04 17:26 被阅读0次

    We address linked list in this post, which serves as the backbone of several other more advanced ADTs.

    #include <stdlib.h>
    #include <stdio.h>
    #include <limits.h>
    #include <stdbool.h>
    #ifndef LINKED_LIST
    #define LINKED_LIST
    typedef struct NodeStruct {
        int item;
        struct NodeStruct *next;
    }* Node;
    
    /**
     * head->...->tail
    */
    typedef struct LinkedListStruct {
        int count;
        Node head;
        Node tail;
    }* LinkedList;
    
    Node NodeCreate(int item) {
        Node node = (Node)malloc(sizeof(*node));
        node->item = item;
        node->next = NULL;
        return node;
    }
    
    void NodeRelease(Node node) { if (node != NULL) free(node); }
    
    LinkedList LinkedListCreate() { 
        LinkedList lst = (LinkedList)malloc(sizeof(*lst));
        lst->count = 0;
        lst->head = lst->tail = NULL;
        return lst;
     }
    
    void LinkedListRelease(LinkedList list) {
        if (list != NULL) {
            Node x = list->head;
            while (x != NULL) {
                Node t = x;
                x = x->next;
                NodeRelease(t);
            }
            free(list);
        }
    }
    
    int LinkedListCount(LinkedList list) { return list == NULL ? 0 : list->count; }
    
    bool LinkedListIsEmpty(LinkedList list) { return list == NULL || list->count == 0; }
    
    /**
     * Works when list == NULL, that is, insertion into a empty list
    */
    void LinkedListInsertHead(LinkedList list, int item) {
        Node x = NodeCreate(item);
        x->next = list->head;
        list->head = x;
        list->count++;
        if (list->count == 1) { list->tail = x; }
    }
    
    int LinkedListRemoveHead(LinkedList list) {
        if (list == NULL) return INT_MIN;
    
        Node x = list->head;
        list->head = x->next;
        int item = x->item;
        list->count--;
        NodeRelease(x);
        if (list->count == 0) { list->tail = NULL; }
        return item;
    }
    
    void LinkedListInsertTail(LinkedList list, int item) {
        if (list != NULL) {
            Node x = NodeCreate(item);
            if (list->count == 0) {
                list->head = list->tail = x;
            } else {
                list->tail->next = x;
                list->tail = x;
            }
            list->count++;
        }
    }
    
    int* LinkedListItems(LinkedList list, int *n) {
        if (list == NULL) return NULL;
        if (n != NULL) { *n = list->count; }
        int *items = (int*)malloc(list->count * sizeof(*items));
        Node x = list->head;
        while (x != NULL) {
            *(items++) = x->item;
            x = x->next;
        }
        return items - list->count;
    }
    
    /**
     * Not used
    */
    int LinkedListRemoveTail(LinkedList list) {return INT_MIN; }
    
    void LinkedListPrint(LinkedList list) {
        Node x = list->head;
        printf("[\n");
        while (x != NULL) { 
            printf("%s%i", x == list->head ? "" : "->", x->item); 
            x = x->next;
        }
        printf("\n]\n");
    }
    
    #endif
    

    Bag implementation:

    #include "linked_list.c"
    typedef struct LinkedListBagStruct {
        LinkedList list;
    }*LinkedListBag;
    
    LinkedListBag LinkedListBagCreate() {
        LinkedListBag bag = (LinkedListBag)malloc(sizeof(*bag));
        bag->list = LinkedListCreate();
        return bag;
    }
    
    void LinkedListBagRelease(LinkedListBag bag) {
        if (bag == NULL) return;
        if (bag->list != NULL) { LinkedListRelease(bag->list); }
        free(bag);
    }
    
    int LinkedListBagCount(LinkedListBag bag) { return bag == NULL ? 0 : LinkedListCount(bag->list); }
    
    bool LinkedListBagIsEmpty(LinkedListBag bag) { return LinkedListBagCount(bag) == 0; }
    
    void LinkedListBagAdd(LinkedListBag bag, int item) { if (bag != NULL) { LinkedListInsertHead(bag->list, item); } }
    
    int* LinkedListBagItems(LinkedListBag bag) {
        int count = LinkedListBagCount(bag);
        if (count == 0) return NULL;
        int *items = (int*)malloc(count * sizeof(*items));
        Node x = bag->list->head;
        while (x != NULL) {
            *(items++) = x->item;
            x = x->next;
        }
        return items - count;
    }
    
    void LinkedListBagPrint(LinkedListBag bag) {
        printf("(\n");
        if (bag != NULL) {
            printf("count: %i\n", LinkedListBagCount(bag));
            LinkedListPrint(bag->list);
        }
        printf(")\n");
    }
    

    Stack impl:

    #include "linked_list.c"
    typedef struct LinkedListStackStruct {
        LinkedList list;
    }*LinkedListStack;
    
    LinkedListStack LinkedListStackCreate() {
        LinkedListStack stack = (LinkedListStack)malloc(sizeof(*stack));
        stack->list = LinkedListCreate();
        return stack;
    }
    
    void LinkedListStackRelease(LinkedListStack stack) {
        if (stack != NULL) {
            if (stack->list != NULL) { LinkedListRelease(stack->list); }
            free(stack);
        }
    }
    
    int LinkedListStackCount(LinkedListStack stack) { return stack == NULL ? INT_MIN : LinkedListCount(stack->list); }
    
    bool LinkedListStackIsEmpty(LinkedListStack stack) { return LinkedListStackCount(stack) == 0; }
    
    void LinkedListStackPush(LinkedListStack stack, int item) { if (stack != NULL) { LinkedListInsertHead(stack->list, item); } }
    
    int LinkedListStackPop(LinkedListStack stack) {
        if (stack == NULL || LinkedListStackIsEmpty(stack)) return INT_MIN;
        return LinkedListRemoveHead(stack->list);
    }
    
    int* LinkedListStackItems(LinkedListStack stack, int *n) { return LinkedListStackIsEmpty(stack) ? NULL : LinkedListItems(stack->list, n); }
    
    void LinkedListStackPrint(LinkedListStack stack) {
        printf("<\n");
        if (stack != NULL) {
            printf("count: %i\n", LinkedListCount(stack->list));
            LinkedListPrint(stack->list);
        }
        printf(">\n");
    }
    

    FIFO Queue impl:

    #include "linked_list.c"
    #include "linked_list.c"
    typedef struct LinkedListQueueStruct {
        LinkedList list;
    }*LinkedListQueue;
    
    LinkedListQueue LinkedListQueueCreate() {
        LinkedListQueue queue = (LinkedListQueue)malloc(sizeof(*queue));
        queue->list = LinkedListCreate();
        return queue;
    }
    
    void LinkedListQueueRelease(LinkedListQueue queue) {
        if (queue != NULL) {
            LinkedListRelease(queue->list);
            free(queue);
        }
    }
    
    int LinkedListQueueCount(LinkedListQueue queue) { return queue == NULL ? 0 : LinkedListCount(queue->list); }
    
    bool LinkedListQueueIsEmpty(LinkedListQueue queue) { return queue == NULL || LinkedListCount(queue->list) == 0; }
    
    void LinkedListQueueEnqueue(LinkedListQueue queue, int item) { if (queue != NULL) { LinkedListInsertTail(queue->list, item); } }
    
    int LinkedListQueueDequeue(LinkedListQueue queue) {
        if (queue == NULL || LinkedListQueueIsEmpty(queue)) return INT_MIN;
        return LinkedListRemoveHead(queue->list);
    }
    
    void LinkedListQueuePrint(LinkedListQueue queue) {
        if (queue == NULL) return;
        printf("<\n");
        printf("count: %i\n", LinkedListCount(queue->list));
        LinkedListPrint(queue->list);
        printf("\n>\n");
    }
    

    相关文章

      网友评论

          本文标题:Concerning Graph Prologue: The L

          本文链接:https://www.haomeiwen.com/subject/tdbvoktx.html