#include<stdio.h> #include<stdlib.h> #include<string.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; return node; } void listInit(List* lst){ if (lst == NULL) return; //空链表 lst->_head = createListNode(0); lst->_head->_next = lst->_head->_prev = lst->_head; } //删除某一个节点 void listErase(List* lst, ListNode* node){ //不能删除head节点 if (lst == NULL || lst->_head == node) return; ListNode* prev = node->_prev; ListNode* next = node->_next; prev->_next = next; next->_prev = prev; free(node); } //尾删:删除头的前一个节点 void listPopBack(List* lst){ listErase(lst, lst->_head->_prev); } //头删 void listPopFront(List* lst){ listErase(lst, lst->_head->_next); } //在某一节点前插入一个数据 void listInsert(List* lst, ListNode* node, LDataType val){ if (lst == NULL) return; ListNode* prev = node->_prev; ListNode* newNode =createListNode(val); prev->_next = newNode; newNode->_prev = prev; newNode->_next = node; node->_prev = newNode; } //尾插 void listPushBack(List* lst, LDataType val){ listInsert(lst, lst->_head,val); } //头插 void listPushFront(List* lst, LDataType val){ listInsert(lst,lst->_head->_next,val); } //打印链表 void printfList(List* lst){ ListNode* cur = lst->_head->_next; while (cur != lst->_head){ printf("%d ", cur->_data); cur = cur->_next; } printf("\n"); } //销毁链表 listDestroy(List* lst){ if (lst){ if (lst->_head){ ListNode* cur = lst->_head->_next; while (cur != lst->_head){ ListNode* next = cur->_next; free(cur); cur = next; } free(lst->_head); } } } void test(){ List lst; listInit(&lst); listPushFront(&lst, 1); printfList(&lst); listPushFront(&lst, 2); printfList(&lst); printfList(&lst); listPushFront(&lst, 3); printfList(&lst); listPushFront(&lst, 4); printfList(&lst); } int main(){ test(); system("pause"); return 0; }
顺序表
优:
1.空间连续
2.支持随机访问
3.空间利用率高,不容易造成内存碎片
4.尾插尾删效率高
劣:
1.头插头删,中间插入删除时间复杂度为O(n),效率较低;
2.增容代价大:申请,拷贝,释放
链表(双向带头循环)
优:
1.任意位置插入或删除时间复杂度为O(1)
2.没有增容问题
劣:
1.空间不连续
2.不支持随机访问
3.空间利用率低,容易造成内存碎片

浙公网安备 33010602011771号