双向链表
来源:互联网 发布:软件wbs 编辑:程序博客网 时间:2024/09/21 14:44
#include <stdio.h>#include <malloc.h>#include "DLinkList.h"typedef struct _tag_DLinkList{ DLinkListNode header; DLinkListNode* slider; int length;} TDLinkList;DLinkList* DLinkList_Create() // O(1){ TDLinkList* ret = (TDLinkList*)malloc(sizeof(TDLinkList)); if( ret != NULL ) { ret->length = 0; ret->header.next = NULL; ret->header.pre = NULL; ret->slider = NULL; } return ret;}void DLinkList_Destroy(DLinkList* list) // O(1){ free(list);}void DLinkList_Clear(DLinkList* list) // O(1){ TDLinkList* sList = (TDLinkList*)list; if( sList != NULL ) { sList->length = 0; sList->header.next = NULL; sList->header.pre = NULL; sList->slider = NULL; }}int DLinkList_Length(DLinkList* list) // O(1){ TDLinkList* sList = (TDLinkList*)list; int ret = -1; if( sList != NULL ) { ret = sList->length; } return ret;}int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos) // O(n){ TDLinkList* sList = (TDLinkList*)list; int ret = (sList != NULL) && (pos >= 0) && (node != NULL); int i = 0; if( ret ) { DLinkListNode* current = (DLinkListNode*)sList; DLinkListNode* next = NULL; for(i=0; (i<pos) && (current->next != NULL); i++) { current = current->next; } next = current->next; current->next = node; node->next = next; if( next != NULL ) { next->pre = node; } node->pre = current; if( sList->length == 0 ) { sList->slider = node; } if( current == (DLinkListNode*)sList ) { node->pre = NULL; } sList->length++; } return ret;}DLinkListNode* DLinkList_Get(DLinkList* list, int pos) // O(n){ TDLinkList* sList = (TDLinkList*)list; DLinkListNode* ret = NULL; int i = 0; if( (sList != NULL) && (0 <= pos) && (pos < sList->length) ) { DLinkListNode* current = (DLinkListNode*)sList; for(i=0; i<pos; i++) { current = current->next; } ret = current->next; } return ret;}DLinkListNode* DLinkList_Delete(DLinkList* list, int pos) // O(n){ TDLinkList* sList = (TDLinkList*)list; DLinkListNode* ret = NULL; int i = 0; if( (sList != NULL) && (0 <= pos) && (pos < sList->length) ) { DLinkListNode* current = (DLinkListNode*)sList; DLinkListNode* next = NULL; for(i=0; i<pos; i++) { current = current->next; } ret = current->next; next = ret->next; current->next = next; if( next != NULL ) { next->pre = current; if( current == (DLinkListNode*)sList ) { next->pre = NULL; } } if( sList->slider == ret ) { sList->slider = next; } sList->length--; } return ret;}DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node){ TDLinkList* sList = (TDLinkList*)list; DLinkListNode* ret = NULL; int i = 0; if( sList != NULL ) { DLinkListNode* current = (DLinkListNode*)sList; for(i=0; i<sList->length; i++) { if( current->next == node ) { ret = current->next; break; } current = current->next; } if( ret != NULL ) { DLinkList_Delete(sList, i); } } return ret;}DLinkListNode* DLinkList_Reset(DLinkList* list){ TDLinkList* sList = (TDLinkList*)list; DLinkListNode* ret = NULL; if( sList != NULL ) { sList->slider = sList->header.next; ret = sList->slider; } return ret;}DLinkListNode* DLinkList_Current(DLinkList* list){ TDLinkList* sList = (TDLinkList*)list; DLinkListNode* ret = NULL; if( sList != NULL ) { ret = sList->slider; } return ret;}DLinkListNode* DLinkList_Next(DLinkList* list){ TDLinkList* sList = (TDLinkList*)list; DLinkListNode* ret = NULL; if( (sList != NULL) && (sList->slider != NULL) ) { ret = sList->slider; sList->slider = ret->next; } return ret;}DLinkListNode* DLinkList_Pre(DLinkList* list){ TDLinkList* sList = (TDLinkList*)list; DLinkListNode* ret = NULL; if( (sList != NULL) && (sList->slider != NULL) ) { ret = sList->slider; sList->slider = ret->pre; } return ret;}
0 0
- SzNOI 双向约瑟夫(双向链表)
- 双向链表&&堆栈
- 双向链表
- 使用双向链表
- 双向链表
- 双向循环链表
- 双向循环链表
- 双向链表
- 实现双向链表
- 双向循环链表
- 建立双向链表
- 双向链表
- 双向链表
- 双向循环链表
- 双向链表
- 链表-双向链表
- 双向链表
- 双向动态链表
- 开源软件架构-ZeroMQ
- CustomDialog
- golang中打印方法
- SSH中所需要的jar以及jar的简介
- 利用NodeJS的子进程(child_process)调用系统命令
- 双向链表
- HDFS fsimage和edits合并实现原理
- 使用List<Object>封装的JsonObject等类的读取方法
- 保护模式--基础
- DES和AES加密:指定键的大小对于此算法无效
- viPlugin是一个eclipse 针对vi的插件
- 插入排序证明引发的对于循环不变式的定义
- Qt应用程序添加图标
- SSM 配置