DLinkList.h
#ifndef __DLINKLIST_H_
#define __DLINKLIST_H_
typedef void DLinkList;
typedef struct _tag_DLinkListNode
{
struct _tag_DLinkListNode* next;
struct _tag_DLinkListNode* pre;
}DLinkListNode;
/*双向链式表的创建*/
DLinkList* DLinkList_Create();
/*双向链式表的销毁*/
void DLinkList_Destory(DLinkList* list);
/*双向链式表的清空*/
void DLinkList_Cleat(DLinkList* list);
/*求长度*/
int DLinkList_Length(DLinkList* list);
/*节点插入*/
int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos);
/*节点获取*/
DLinkListNode* DLinkList_Get(DLinkList* list, int pos);
/*节点删除*/
DLinkListNode* DLinkList_Delete(DLinkList* list, int pos);
/*new add*/
/*指定节点地址删除*/
DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node);
/*重置游标*/
DLinkListNode* DLinkList_Reset(DLinkList* list);
/*返回游标当前位置*/
DLinkListNode* DLinkList_Current(DLinkList* list);
/*游标下移*/
DLinkListNode* DLinkList_Next(DLinkList* list);
/*游标上移*/
DLinkListNode* DLinkList_Next(DLinkList* list);
#endif
DLinkList.c
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "DLinkList.h"
typedef struct _tag_TDLinkList
{
DLinkListNode header;
DLinkListNode* cursor;
int length;
}TDLinkList;
/*双向链式表的创建*/
DLinkList* DLinkList_Create()
{
TDLinkList *tlist = (TDLinkList*)malloc(sizeof(TDLinkList));
if (tlist == NULL)
{
printf("创建失败%d", -1);
return NULL;
}
/*初始化链表*/
tlist->length = 0;
tlist->cursor = NULL;
tlist->header.next = NULL;
tlist->header.pre = NULL;
return tlist;
}
/*双向链式表的销毁*/
void DLinkList_Destory(DLinkList* list)
{
if (list == NULL)return;
free(list);
list = NULL;
}
/*双向链式表的清空*/
void DLinkList_Cleat(DLinkList* list)
{
if (list == NULL)
{
return;
}
TDLinkList *tlist = (TDLinkList*)list;
/*初始化链表*/
tlist->length = 0;
tlist->cursor = NULL;
tlist->header.next = NULL;
tlist->header.pre = NULL;
}
/*求长度*/
int DLinkList_Length(DLinkList* list)
{
if (list == NULL)
{
return -1;
}
TDLinkList *tlist = (TDLinkList*)list;
return tlist->length;
}
/*节点插入*/
int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos)
{
if (list == NULL || node == NULL || pos < 0)
{
return -1;
}
TDLinkList *tlist = (TDLinkList*)list;
if (pos>(tlist->length))return -1;
if (tlist->length == 0)
{
tlist->header.next = node;
node->next = NULL;
node->pre = NULL;
tlist->length++;
return 0;
}
if (tlist->length != 0)
{
if (pos == 0)
{
DLinkListNode* pCur = tlist->header.next;
pCur->pre = node;
node->next = pCur;
node->pre = NULL;
tlist->header.next = node;
tlist->length++;
return 0;
}
if (pos < (tlist->length))
{
/*申请两个辅助指针变量*/
DLinkListNode* pCur = tlist;
DLinkListNode* pNext = NULL;
while (pCur&&pos--)
{
pCur = pCur->next;
}
if (pCur == NULL)return -2;
pNext = pCur->next;
/*插入处理*/
pCur->next = node;
node->pre = pCur;
pNext->pre = node;
node->next = pNext;
tlist->length++;
return 0;
}
if (pos == (tlist->length))
{
DLinkListNode* pCur = tlist;
while (pCur->next !=NULL)
{
pCur = pCur->next;
}
if (pCur == NULL)return -2;
/*插入处理*/
pCur->next = node;
node->pre = pCur;
node->next = NULL;
tlist->length++;
return 0;
}
}
}
/*节点获取*/
DLinkListNode* DLinkList_Get(DLinkList* list, int pos)
{
if (list == NULL || pos < 0)
{
return NULL;
}
TDLinkList *tlist = (TDLinkList*)list;
if (pos >= (tlist->length))
{
return NULL;
}
DLinkListNode *ret = tlist->header.next;
while (ret&&pos--)
{
ret = ret->next;
}
if (ret == NULL)return -2;
return ret;
}
/*节点删除*/
DLinkListNode* DLinkList_Delete(DLinkList* list, int pos)
{
if (list == NULL || pos < 0)
{
return NULL;
}
TDLinkList *tlist = (TDLinkList*)list;
if (pos>=(tlist->length))return NULL;
if (tlist->length == 0) return NULL;
if (tlist->length == 1)
{
DLinkListNode *ret = tlist->header.next;
tlist->header.next = NULL;
tlist->length--;
/*游标处理*/
tlist->cursor = NULL;
return ret;
}
if (pos == 0)
{
DLinkListNode *ret = tlist->header.next;
/*节点检出*/
tlist->header.next = ret->next;
ret->next->pre = NULL;
tlist->length--;
/*游标处理*/
if (tlist->cursor == ret)
{
tlist->cursor = tlist->cursor->next;
}
return ret;
}
if (pos > 0 && pos < (tlist->length - 1))
{
DLinkListNode *ret = tlist->header.next;
while (ret&&pos--)
{
ret = ret->next;
}
if (ret == NULL)return NULL;
ret->pre->next = ret->next;
ret->next->pre = ret->pre;
tlist->length--;
/*游标处理*/
if (tlist->cursor == ret)
{
tlist->cursor = tlist->cursor->next;
}
return ret;
}
if (pos = (tlist->length - 1))
{
DLinkListNode *ret = tlist;
while (ret->next!=NULL)
{
ret = ret->next;
}
if (ret == NULL)return NULL;
ret->pre->next = NULL;
tlist->length--;
/*游标处理*/
if (tlist->cursor == ret)
{
tlist->cursor = tlist->cursor->next;
}
return ret;
}
}
/*new add*/
/*指定节点地址删除*/
DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node)
{
if (list == NULL || node == NULL)
{
return NULL;
}
TDLinkList *tlist = list;
int pos = 0;
DLinkListNode *tmp = tlist;
while(tmp->next != node)
{
tmp = tmp->next;
pos++;
}
return DLinkList_Delete(list, pos);
}
/*重置游标*/
DLinkListNode* DLinkList_Reset(DLinkList* list)
{
if (list == NULL)
{
return NULL;
}
TDLinkList *tlist = list;
tlist->cursor = tlist;
}
/*返回游标当前位置*/
DLinkListNode* DLinkList_Current(DLinkList* list)
{
if (list == NULL)
{
return NULL;
}
TDLinkList *tlist = list;
return (tlist->cursor);
}
/*游标上移*/
DLinkListNode* DLinkList_Pre(DLinkList* list)
{
if (list == NULL)
{
return NULL;
}
TDLinkList *tlist = list;
DLinkListNode *tmp = tlist->cursor;
if (tmp->pre != NULL)
{
printf("游标已在首位置,无法左移");
return NULL;
}
tlist->cursor = tlist->cursor->pre;
return tmp;
}
/*游标下移*/
DLinkListNode* DLinkList_Next(DLinkList* list)
{
if (list == NULL)
{
return NULL;
}
TDLinkList *tlist = list;
DLinkListNode *tmp = tlist->cursor;
if (tmp->next != NULL)
{
printf("游标已在末尾位置,无法右移");
return NULL;
}
tlist->cursor = tlist->cursor->next;
return tmp;
}
main.c,游标函数未测试
#include <stdio.h>
#include "DLinkList.h"
typedef struct teacher
{
DLinkListNode node;
int age;
}T;
int main()
{
T t1, t2, t3, t4, t5, t6, t7, t8;
t1.age = 1;
t2.age = 2;
t3.age = 3;
t4.age = 4;
t5.age = 5;
t6.age = 6;
t7.age = 7;
t8.age = 8;
DLinkList *list = DLinkList_Create();
DLinkList_Insert(list, &t8, 0);
DLinkList_Insert(list, &t7, 0);
DLinkList_Insert(list, &t6, 0);
DLinkList_Insert(list, &t5, 0);
DLinkList_Insert(list, &t4, 0);
DLinkList_Insert(list, &t3, 0);
DLinkList_Insert(list, &t2, 4);
DLinkList_Insert(list, &t1, DLinkList_Length(list));
DLinkList_Delete(list, 2);
DLinkList_DeleteNode(list, &t3);
T *tmp = NULL;
for (int i = 0; i < DLinkList_Length(list); i++)
{
tmp = DLinkList_Get(list, i);
printf("%d\n", tmp->age);
}
return 0;
}