您的位置:首页 > 其它

线性表链式存储结构实现 --双向循环链表

2015-12-29 02:00 369 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: