#ifndef _DOUBLE_LINKLIST_H_
#define _DOUBLE_LINKLIST_H_
/************************************************************************/
/* 线性表链式存储结构实现 --双向循环链表 */
/************************************************************************/
typedef struct DLinkNode
{
ElemType data;
DLinkNode* Prior;
DLinkNode* Next;
}DLinkNode;
//双向循环链表
typedef DLinkNode* DoubleLinkList;
/**初始化操作,建立一个空的线性表L。*/
Status InitList(DoubleLinkList* L);
/**采用头插法初始化链表,建立一个包含n个元素的线性表L。*/
Status CreateListHead(DoubleLinkList* L , int n);
/**采用尾插法初始化链表,建立一个包含n个元素的线性表L。*/
Status CreateListTail(DoubleLinkList* L , int n);
/**若线性表为空,返回true,否则返回false*/
bool ListEmpty(DoubleLinkList L);
/**将线性表清空*/
Status ClearList(DoubleLinkList* L);
/**将线性表中第i个位置元素值返回给e*/
Status GetElem(DoubleLinkList L,int i,ElemType* e);
/**在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在线性表中的序号表示成功;否则返回-1表示失败*/
int LocateElem(DoubleLinkList L ,ElemType e);
/**在线性表中的第i个位置插入元素e*/
Status ListInsert(DoubleLinkList*L,int i,ElemType e);
/**删除线性表中第i个位置的元素,并返回这个位置的元素值e*/
Status ListDelete(DoubleLinkList*L,int i,ElemType* e);
/**返回线性表L的元素个数*/
int ListLength(DoubleLinkList L);
/**遍历链表元素*/
Status TraverseList(DoubleLinkList L);
#endif//_DOUBLE_LINKLIST_H_
#include "stdafx.h"
#include "DoubleLinkList.h"
/**初始化操作,建立一个空的线性表L。*/
Status InitList(DoubleLinkList* L)
{
DoubleLinkList list = (DoubleLinkList)malloc(sizeof(DLinkNode));
list->Next = list;
list->Prior = list;
*L = list;
return OK;
}
/**采用头插法初始化链表,建立一个包含n个元素的线性表L。*/
Status CreateListHead(DoubleLinkList* L , int n)
{
InitList(L);
for (int i = 0 ; i < n ; i++)
{
DoubleLinkList pNewNode = (DoubleLinkList)(malloc(sizeof(DLinkNode)));
pNewNode->data = i;
pNewNode->Next = (*L)->Next;
pNewNode->Prior = (*L);
(*L)->Next = pNewNode;
if(i == 0)
(*L)->Prior = pNewNode;
}
return OK;
}
/**采用尾插法初始化链表,建立一个包含n个元素的线性表L。*/
Status CreateListTail(DoubleLinkList* L , int n)
{
InitList(L);
DoubleLinkList pCurrentNode = (*L)->Next;
for (int i = 0 ; i < n ; i++)
{
DoubleLinkList pNewNode = (DoubleLinkList)(malloc(sizeof(DLinkNode)));
pNewNode->data = i;
pNewNode->Prior = pCurrentNode;
pNewNode->Next = *L;
(*L)->Prior = pNewNode;
pCurrentNode->Next = pNewNode;
pCurrentNode = pNewNode;
}
return OK;
}
/**若线性表为空,返回true,否则返回false*/
bool ListEmpty(DoubleLinkList L)
{
return L == L->Next && L == L->Prior;
}
/**将线性表清空*/
Status ClearList(DoubleLinkList* L)
{
if(ListEmpty(*L))
return OK;
DoubleLinkList pNode = (*L)->Next;
int index = 0 ;
while(pNode != *L)
{
DoubleLinkList pDelNode = pNode;
pNode = pDelNode->Next;
free(pDelNode);
}
return OK;
}
/**将线性表中第i个位置元素值返回给e*/
Status GetElem(DoubleLinkList L,int i,ElemType* e)
{
if(ListEmpty(L))
return ERROR;
DoubleLinkList pNode = L->Next;
int index = 0 ;
while(pNode != L)
{
if(index == i)
{
*e = pNode->data;
break;
}
index++;
pNode = pNode->Next;
}
return i == index ? OK:ERROR;
}
/**在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在线性表中的序号表示成功;否则返回-1表示失败*/
int LocateElem(DoubleLinkList L ,ElemType e)
{
if(ListEmpty(L))
return ERROR;
DoubleLinkList pNode = L->Next;
int index = 0 ;
while(pNode != L)
{
if(pNode->data == e)
break;
index++;
pNode = pNode->Next;
}
return pNode == L ? -1:index;
}
/**在线性表中的第i个位置插入元素e*/
Status ListInsert(DoubleLinkList*L,int i,ElemType e)
{
DoubleLinkList pNode = (*L)->Next;
int index = 0 ;
while(pNode != (*L))
{
if(i == 0 || index == i-1)
break;
index++;
pNode = pNode->Next;
}
if (i !=0 && index != i-1)
return ERROR;
DoubleLinkList pNewNode = (DoubleLinkList)malloc(sizeof(DLinkNode));
pNewNode->data = e;
pNewNode->Next = pNode->Next;
pNewNode->Prior = pNode;
pNode->Next->Prior = pNewNode;
pNode->Next = pNewNode;
return OK;
}
/**删除线性表中第i个位置的元素,并返回这个位置的元素值e*/
Status ListDelete(DoubleLinkList*L,int i,ElemType* e)
{
if (ListEmpty(*L))
return ERROR;
DoubleLinkList pNode = (*L)->Next;
int index = 0 ;
while(pNode != (*L))
{
if(i == 0 || index == i)
break;
index++;
pNode = pNode->Next;
}
if (i !=0 && index != i)
return ERROR;
pNode->Prior->Next = pNode->Next;
pNode->Next->Prior = pNode->Prior;
free(pNode);
return OK;
}
/**返回线性表L的元素个数*/
int ListLength(DoubleLinkList L)
{
DoubleLinkList pNode = L->Next;
int index = 0 ;
while(pNode != L)
{
index++;
pNode = pNode->Next;
}
return index;
}
/**遍历链表元素*/
Status TraverseList(DoubleLinkList L)
{
DoubleLinkList pNode = L->Next;
int i = 0;
while(pNode != L)
{
std::cout<<"第"<<i++<<"个元素为:"<<pNode->data<<std::endl;
pNode = pNode->Next;
}
return OK;
}