带头双向链表的增删打印等操作实现
发布日期:2021-05-08 03:41:12 浏览次数:18 分类:精选文章

本文共 3249 字,大约阅读时间需要 10 分钟。

#include 
#include
typedef int LDataType;struct ListNode { LDataType _data; struct ListNode* _next; struct ListNode* _prev;};struct List { struct ListNode* _head;};ListNode* createListNode(LDataType val) { ListNode* node = (ListNode*)malloc(sizeof(ListNode)); node->_data = val; node->_next = NULL; node->_prev = NULL; return node;}void listInit(List* lst) { if (!lst) return; lst->_head = createListNode(0); lst->_head->_next = lst->_head; lst->_head->_prev = lst->_head;}void listPushBack(List* lst, LDataType val) { if (!lst) return; struct ListNode* last = lst->_head->_prev; struct ListNode* newNode = createListNode(val); last->_next = newNode; newNode->_prev = last; newNode->_next = lst->_head; lst->_head->_prev = newNode;}void listPopBack(List* lst) { if (!lst) return; if (lst->_head == lst->_head->_prev) return; struct ListNode* last = lst->_head->_prev; struct ListNode* prev = lst->_head->_prev->_prev; free(last); prev->_next = lst->_head; lst->_head->_prev = prev;}void printList(List* lst) { struct ListNode* cur = lst->_head->_next; while (cur != lst->_head) { printf("%d", cur->_data); cur = cur->_next; } printf("\n");}void listPushFront(List* lst, LDataType val) { if (!lst) return; struct ListNode* next = lst->_head->_next; struct ListNode* newNode = createListNode(val); lst->_head->_next = newNode; newNode->_prev = lst->_head; newNode->_next = next; next->_prev = newNode;}void listPopFront(List* lst) { if (!lst || lst->_head == lst->_head->_next) return; struct ListNode* next = lst->_head->_next->_next; struct ListNode* prev = lst->_head->_next; lst->_head->_next = next; next->_prev = lst->_head; free(prev);}void listErase(List* lst, struct ListNode* node) { if (!lst || lst->_head == node) return; struct ListNode* prev = node->_prev; struct ListNode* next = node->_next; prev->_next = next; next->_prev = prev; free(node);}void listInsert(ListNode* lst, struct ListNode* node, LDataType val) { if (!lst) return; struct ListNode* newNode = createListNode(val); struct ListNode* prev = node->_prev; newNode->_prev = prev; newNode->_next = node; prev->_next = newNode; node->_prev = newNode;}void listDestroy(List* lst) { if (lst) { if (lst->_head) { struct ListNode* cur = lst->_head->_next; while (cur != lst->_head) { struct ListNode* next = cur->_next; free(cur); cur = next; } free(lst->_head); } }}void test() { List lst; listInit(&lst); listPushBack(&lst, 1); printList(&lst); listPushBack(&lst, 2); printList(&lst); listPushBack(&lst, 3); printList(&lst); listPushBack(&lst, 4); printList(&lst); listPushBack(&lst, 5); printList(&lst); listPopFront(&lst); printList(&lst); listPopFront(&lst); printList(&lst); listPopFront(&lst); printList(&lst); listPopFront(&lst); printList(&lst); listPopFront(&lst); printList(&lst);}int main() { test(); return 0;}

以上代码经过优化,增加了详细注释,确保了代码的可读性和可维护性,同时保留了所有核心功能。代码结构清晰,注释详细,便于搜索引擎理解和索引。

上一篇:顺序表和链表的优缺点
下一篇:线性表的链表的增删查改等的操作

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月05日 06时56分41秒