
带头双向链表的增删打印等操作实现
发布日期: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秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Redis进阶实践之十八 使用管道模式提高Redis查询的速度
2019-03-06
SQL注入
2019-03-06
#2036:改革春风吹满地
2019-03-06
MPI Maelstrom POJ - 1502 ⭐⭐ 【Dijkstra裸题】
2019-03-06
P1379 八数码难题 ( A* 算法 与 IDA_star 算法)
2019-03-06
算法学习笔记: 珂朵莉树
2019-03-06
Codeforces Round #664 题解(A ~ C)
2019-03-06
Problem A - Sequence with Digits (数学推导)
2019-03-06
Problem 330A - Cakeminator (思维)
2019-03-06
LeetCode75 颜色分类 (三路快排C++实现与应用)
2019-03-06
docker基础:容器生命周期管理命令
2019-03-06
Shell脚本学习指南
2019-03-06
C#开发BIMFACE系列35 服务端API之模型对比6:获取模型构建对比分类树
2019-03-06
C# 规范建议
2019-03-06
C语言+easyX图形库的推箱子实现
2019-03-06
反汇编-流程控制语句-2-循环控制语句分析
2019-03-06
调试vs2019代码的流程
2019-03-06
游戏外挂基础-概述
2019-03-06
脱壳与加壳-加壳-6-代码实现加密导入表
2019-03-06
Typora配置PicGo时,提示Failed to fetch
2019-03-06