一、无头结点单链表
#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; }
浙公网安备 33010602011771号