带头双向链表的增删打印等操作实现
2020-12-16 21:54
106 查看
带头双向链表的增删打印等操作实现
#include<stdio.h> #include<stdlib.h> typedef int LDataType; //双向带头循环链表的节点 typedef struct ListNode { LDataType _data; //指向下一个节点的起始位置 struct ListNode* _next; //指向上一个节点的起始位置 struct ListNode* _prev; }ListNode; //双向带头循环链表 typedef struct List { struct ListNode* _head; }List; ListNode* createListNode(LDataType val) { ListNode* node = (ListNode*)malloc(sizeof(ListNode)); node->_data = val; node->_next = NULL; node->_prev = NULL; } void listInit(List* lst) { if (!lst)return; //空链表 lst->_head = createListNode(0); lst->_head->_next = lst->_head->_prev = lst->_head; } //尾插 O(1); 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) { //不能删除head节点 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; //prev newNode node node->_prev = newNode; newNode->_next = node; newNode->_prev = prev; prev->_next = newNode; } 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; }
相关文章推荐
- java实现带头结点的单链表、不带头结点单链表、不带头单向循环链表、不带头双向链表的增删改查操作
- !-- 带头结点带环的双向链表的相关操作实现 --!
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- 单双向链表的增删改查等详细操作(Java实现)
- C实现带头节点带环双向链表的操作
- C语言实现双向非循环链表(带头结点尾结点)的基本操作
- 带头带环双向链表的实现及其相关操作。。
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- !-- 不带头结点不带环的单链表相关操作实现 --!
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- 计算带头结点单链表的长度 计算单链表的长度,实现单链表的打印
- 树的基本结构,以及利用链表实现树的各项操作(创建、添加/删除/打印树节点、销毁等等)
- 双向链表的实现与操作(C语言实现)
- 详谈双向链表的实现与简单操作
- 用java实现的双向链表增加删除修改操作
- 双向链表的相关操作C++实现
- c语言实现--双向循环链表操作
- 试编写在无头结点的单链表上实现线性表的插入操作的算法,并和带头结点的单链表上的插入操作的算法进行比较
- c语言实现增删双向链表
- 链表的基本操作的实现---- 增删改查