一、无头结点单链表

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

typedef int NodeData;

typedef struct ListNode {
    NodeData data;
    struct ListNode* next;
}ListNode;

typedef struct List {
    ListNode* begin;
    size_t size;
}List;

void Init(List* list){
    assert(list);
    list->begin = NULL;
    list->size = 0;
}

bool Empty(List* list) {
    assert(list);
    return list->size == 0;
}

size_t Size(List* list) {
    assert(list);
    printf("the list size is %d\n", list->size);
    return list->size;
}

void Push(List* list, NodeData x) {
    assert(list);
    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
    if (newNode == NULL) {
        perror("malloc");
        exit(1);
    }
    newNode->data = x;
    ++list->size;
    if (list->size == 0) {
        list->begin = newNode;
        newNode->next = NULL;
        return;
    }
    newNode->next = list->begin;
    list->begin = newNode;
}

void Pop(List* list) {
    assert(list);
    if (Empty(list)) {
        printf("the list is empty\n");
        return;
    }
    --list->size;
    ListNode* cur = list->begin;
    list->begin = list->begin->next;
    free(cur);
    cur = NULL;
}

void PrintList(List* list) {
    assert(list);
    if (Empty(list)) {
        return;
    }
    ListNode* cur = list->begin;
    printf("%d ", cur->data);
    while (cur->next) {
        printf("-> %d ", cur->next->data);
        cur = cur->next;
    }
    printf("\n");
}

int main() {
    List list;
    Init(&list);
    Push(&list, 1);
    Push(&list, 3);
    Push(&list, 5);
    Push(&list, 7);
    Size(&list);        //the list size is 4
    PrintList(&list);    //7 -> 5 -> 3 -> 1
    Pop(&list);
    Pop(&list);
    Pop(&list);
    Pop(&list);
    Pop(&list);            //the list is empty
    Size(&list);        //he list size is 0
    PrintList(&list);
    return 0;
}

 

 

二、带头结点单链表

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

typedef int NodeData;

typedef struct List {
    NodeData data;
    struct List* next;
}List;

void Init(List* list) {
    assert(list);
    list->next = (List*)malloc(sizeof(List));
    list->next->next = NULL;
}

bool Empty(List* list) {
    assert(list);
    return list->next->next == NULL;
}

void Push(List* list, NodeData x) {
    assert(list);
    List* node = (List*)malloc(sizeof(List));
    if (node == NULL) {
        perror("malloc");
        return;
    }
    node->data = x;
    node->next = list->next->next;
    list->next->next = node;
}

void Pop(List* list) {
    assert(list);
    if (!Empty(list)) {
        List* cur = list->next->next;
        list->next = cur->next;
        free(cur);
        cur = NULL;
    }
}

size_t Size(List* list) {
    assert(list);
    size_t size = 0;
    List* cur = list->next->next;
    while (cur) {
        ++size;
        cur = cur->next;
    }
    printf("the list size = %d\n", size);
    return size;
}

void PrintList(List* list) {
    assert(list);
    if (!Empty(list)) {
        List* cur = list->next->next;
        printf("%d ", cur->data);
        while (cur->next) {
            printf("-> %d ", cur->next->data);
            cur = cur->next;
        }
        printf("\n");
    }
}

int main() {
    List list;
    Init(&list);
    Push(&list, 1);
    Push(&list, 3);
    Push(&list, 5);
    Push(&list, 7);
    Size(&list);
    PrintList(&list);
    Pop(&list);
    Pop(&list);
    Pop(&list);
    Pop(&list);
    Pop(&list);
    Size(&list);
    PrintList(&list);
    return 0;
}

 

 

三、双向循环链表

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

typedef int NodeData;

typedef struct List {
    NodeData data;
    struct List* prev;
    struct List* next;
}List;

void Init(List* list) {
    assert(list);
    list->prev = list;
    list->next = list;
}

bool Empty(List* list) {
    assert(list);
    return list->next == list;
}

void Push(List* list, NodeData x) {
    assert(list);
    List* node = (List*)malloc(sizeof(node));
    if (node == NULL) {
        perror("malloc");
        exit(1);
    }
    node->data = x;
    node->next = list;
    node->prev = list->prev;
    list->prev->next = node;
    list->prev = node;
}

void Pop(List* list) {
    assert(list);
    if (!Empty(list)) {
        List* cur = list->prev;
        cur->prev->next = cur->next;
        list->prev = cur->prev;
        free(cur);
        cur = NULL;
    }
}

size_t Size(List* list) {
    assert(list);
    size_t size = 0;
    List* cur = list->next;
    while (cur != list) {
        ++size;
        cur = cur->next;
    }
    printf("the list size is %d\n", size);
    return size;
}

void PrintList(List* list) {
    assert(list);
    if (!Empty(list)) {
        List* cur = list->next;
        printf("%d ", cur->data);
        while (cur->next != list) {
            printf("-> %d ", cur->next->data);
            cur = cur->next;
        }
        printf("\n");
    }
}

int main() {
    List list;
    Init(&list);
    Push(&list, 1);
    Push(&list, 3);
    Push(&list, 5);
    Push(&list, 7);
    Size(&list);
    PrintList(&list);
    Pop(&list);
    Pop(&list);
    Pop(&list);
    Pop(&list);
    Pop(&list);
    Size(&list);
    PrintList(&list);
    return 0;
}

 

posted on 2023-03-08 15:27  运气姐姐  阅读(36)  评论(0)    收藏  举报