Skip to content

Instantly share code, notes, and snippets.

@frankie-yanfeng
Last active January 10, 2020 05:56
Show Gist options
  • Select an option

  • Save frankie-yanfeng/a5733236fea33ab8f2e3be63f3de7681 to your computer and use it in GitHub Desktop.

Select an option

Save frankie-yanfeng/a5733236fea33ab8f2e3be63f3de7681 to your computer and use it in GitHub Desktop.

Revisions

  1. frankie-yanfeng revised this gist Jan 10, 2020. 2 changed files with 0 additions and 0 deletions.
    File renamed without changes.
    File renamed without changes.
  2. frankie-yanfeng created this gist Jan 10, 2020.
    93 changes: 93 additions & 0 deletions linkedlist.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,93 @@
    /* linkedlist.c */
    #include <stdlib.h>
    #include "linkedlist.h"

    //static link head = NULL;
    static List ListHead;

    link make_node(unsigned char item)
    {
    link p = malloc(sizeof *p);
    p->item = item;
    p->next = NULL;
    return p;
    }
    void free_node(link p)
    {
    free(p);
    }
    link search(unsigned char key)
    {
    link p;
    //for (p = head; p; p = p->next)
    for (p = ListHead.head; p; p = p->next)
    if (p->item == key)
    return p;
    return NULL;
    }

    void insert(link p)
    {
    //p->next = head;
    p->next = ListHead.head;
    ListHead.head = p;
    }

    link delete(link p)
    {
    link prev;
    if (p == ListHead.head) {
    ListHead.head = p->next;
    return p;
    }
    for (prev = ListHead.head; prev; prev = prev->next)
    if (prev->next == p) {
    prev->next = p->next;
    return p;
    }
    return NULL;
    }

    link deleteUniformed(link p)
    {
    link prev;
    if (p == ListHead.head) {
    ListHead.head = p->next;
    return p;
    }
    for (prev = ListHead.head; prev; prev = prev->next)
    if (prev->next == p) {
    prev->next = p->next;
    return p;
    }
    return NULL;
    }

    void traverse(void (*visit)(link))
    {
    link p;
    for (p = ListHead.head; p; p = p->next)
    visit(p);
    }
    void destroy(void)
    {
    link q, p = ListHead.head;
    ListHead.head = NULL;
    while (p) {
    q = p;
    p = p->next;
    free(q);
    }
    }
    void push(link p)
    {
    insert(p);
    }

    link pop(void)
    {
    if (ListHead.head == NULL)
    return NULL;
    else
    return delete(ListHead.head);
    }
    29 changes: 29 additions & 0 deletions linkedlist.h
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,29 @@
    #ifndef SINGLE_LIST_LINKEDLIST_H
    #define SINGLE_LIST_LINKEDLIST_H

    /* linkedlist.h */
    typedef struct node *link;
    typedef struct list List;

    struct node {
    unsigned char item;
    link next;
    };

    struct list {
    link head;
    link tail;
    };

    link make_node(unsigned char item);
    void free_node(link p);
    link search(unsigned char key);
    void insert(link p);
    link delete(link p);
    link deleteUniformed(link p);
    void traverse(void (*visit)(link));
    void destroy(void);
    void push(link p);
    link pop(void);

    #endif //SINGLE_LIST_LINKEDLIST_H
    38 changes: 38 additions & 0 deletions main.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,38 @@
    /* main.c */
    #include <stdio.h>
    #include "linkedlist.h"
    void print_item(link p)
    {
    printf("%d\n", p->item);
    }
    int main(void)
    {
    link p = make_node(10);
    insert(p);
    p = make_node(5);
    insert(p);
    p = make_node(90);
    insert(p);

    p = search(5);
    delete(p);
    free_node(p);

    p = search(90);
    deleteUniformed(p);
    free_node(p);

    traverse(print_item);
    destroy();
    p = make_node(100);
    push(p);
    p = make_node(200);
    push(p);
    p = make_node(250);
    push(p);
    while ((p = pop())) {
    print_item(p);
    free_node(p);
    }
    return 0;
    }