#include <stdio.h>
#include <stdlib.h>
#include "DLinkList.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct value
{
DLinkListNode next;
int v;
};
int main(int argc, char *argv[])
{
DLinkList* list=DLinkList_Create();
struct value v1;
struct value v2;
struct value v3;
struct value v4;
struct value v5;
struct value *pv=NULL;
int i=0;
v1.v=1;
v2.v=2;
v3.v=3;
v4.v=4;
v5.v=5;
DLinkList_Insert(list,(DLinkListNode*)&v1,DLinkList_Length(list));
DLinkList_Insert(list,(DLinkListNode*)&v2,DLinkList_Length(list));
DLinkList_Insert(list,(DLinkListNode*)&v3,DLinkList_Length(list));
DLinkList_Insert(list,(DLinkListNode*)&v4,DLinkList_Length(list));
DLinkList_Insert(list,(DLinkListNode*)&v5,DLinkList_Length(list));
printf("插入5个节点之后\n");
for(i=0; i<DLinkList_Length(list); i++)
{
pv = (struct Value*)DLinkList_Get(list, i);
printf("%d\n", pv->v);
}
printf("删除收尾节点之后\n");
DLinkList_Delete(list, DLinkList_Length(list)-1);
DLinkList_Delete(list, 0);
for(i=0; i<DLinkList_Length(list); i++)
{
pv = (struct Value*)DLinkList_Next(list);
printf("%d\n", pv->v);
}
printf("游标重置之后\n");
DLinkList_Reset(list);
DLinkList_Next(list);
pv = (struct Value*)DLinkList_Current(list);
printf("游标重置下移之后:%d\n", pv->v);
printf("删除下移之后所在的节点\n");
DLinkList_DeleteNode(list, (DLinkListNode*)pv);
pv = (struct Value*)DLinkList_Current(list);
printf("%d\n", pv->v);
printf("删除下移之后所在的节点的前置节点\n");
DLinkList_Pre(list);
pv = (struct Value*)DLinkList_Current(list);
printf("%d\n", pv->v);
printf("当前链表所剩节点\n");
for(i=0; i<DLinkList_Length(list); i++)
{
pv = (struct Value*)DLinkList_Next(list);
printf("%d\n", pv->v);
}
printf("Length: %d\n", DLinkList_Length(list));
DLinkList_Destroy(list);
return 0;
}
#include <stdio.h>
#include "DLinkList.h"
#include <malloc.h>
typedef struct _tag_DLinkList
{
DLinkListNode header;
DLinkListNode* slider;
int length;
}TDLinkList;
DLinkList* DLinkList_Create()
{
TDLinkList* ret=(TDLinkList*)malloc(sizeof(TDLinkList));
if(ret!=NULL)
{
ret->header.next=NULL;
ret->header.pre=NULL;
ret->slider=NULL;
ret->length=0;
}
return ret;
}
void DLinkList_Destroy(DLinkList* list)
{
free(list);
}
void DLinkList_Clear(DLinkList* list)
{
TDLinkList *sList=(TDLinkList*)list;
if(sList!=NULL)
{
sList->header.next=NULL;
sList->header.pre=NULL;
sList->slider=NULL;
sList->length=0;
}
}
int DLinkList_Length(DLinkList* list)
{
TDLinkList* sList=(TDLinkList*)list;
int ret=-1;
if(sList!=0)
{
//其他操作会改变传进来链表的长度,如插入,删除等
//即一开始插入时也可以读到长度length=0
ret=sList->length;
}
return ret;
}
int DLinkList_Insert(DLinkList* list,DLinkListNode* node,int pos)
{
//强制类型转换,传进来的一个void* 地址
TDLinkList* sList=(TDLinkList*)list;
int i=0;
int ret=((sList!=NULL)&&(pos>=0)&&(node!=NULL));
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)
{
node->pre=NULL;
sList->slider=node;
}
sList->length++;
}
return ret;
}
DLinkListNode* DLinkList_Delete(DLinkList* list,int pos)
{
TDLinkList* sList=(DLinkList*)list;
DLinkListNode* ret=NULL;
int i=0;
int flag=((sList!=NULL)&&(pos>=0)&&(pos<sList->length));
if(flag)
{
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_Get(DLinkList* list,int pos)
{
TDLinkList* sList=(TDLinkList*)list;
DLinkListNode* ret=NULL;
int i=0;
if((sList!=NULL)&&(pos>=0)&&(pos<sList->length))
{
DLinkListNode* current=(DLinkListNode*)sList;
for(i=0;i<pos;i++)
{
current=current->next;
}
ret=current->next;
}
return ret;
}
DLinkListNode* DLinkList_DeleteNode(DLinkList* list,DLinkListNode* node)
{
TDLinkList* sList=(TDLinkList*)list;
DLinkListNode* ret=NULL;
int i=0;
if((sList!=NULL)&&(node!=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;
}
#ifndef _DLINKLIST_H
#define _DLINKLIST_H
typedef void DLinkList;
typedef struct _tag_DLinkListNode DLinkListNode;
struct _tag_DLinkListNode
{
DLinkListNode* next;
DLinkListNode* pre;
};
DLinkList* DLinkList_Create();
void DLinkList_Destroy(DLinkList* list);
void DLinkList_Clear(DLinkList* list);
int DLinkList_Length(DLinkList* list);
int DLinkList_Insert(DLinkList* list,DLinkListNode* node,int pos);
DLinkListNode* DLinkList_Delete(DLinkList* list,int pos);
DLinkListNode* DLinkList_Get(DLinkList* list,int pos);
DLinkListNode* DLinkList_DeleteNode(DLinkList* list,DLinkListNode* node);
DLinkListNode* DLinkList_Reset(DLinkList* list);
DLinkListNode* DLinkList_Current(DLinkList* list);
DLinkListNode* DLinkList_Next(DLinkList* list);
DLinkListNode* DLinkList_Pre(DLinkList* list);
#endif