/*
******************************************************************************
/* <PRE>
/* 版权所有 : -
/* 模块名 : 线性表
/* 文件名 : dlinklist.cpp
/* 功能描述 : 双链循环线性表的表示与实现
/* 作者 : <xxx>
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : -
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 <xxx> 创建
/* </PRE>
****************************************************************************** */
#include < stdio.h >
#include < stdlib.h >
/* *****************************************************************************
/* 数据类型和常量定义
/***************************************************************************** */
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
/* *****************************************************************************
/* 数据结构声明
/***************************************************************************** */
/* 线性表的双向链表存储结构 */
typedef struct DuLNode {
ElemType data;
struct DuLNode * prior;
struct DuLNode * next;
} DuLNode, * DuLinkList;
/* ******************************************************************************
/* <FUNC>
/* 函数名 : InitList_DuL
/* 功能 : 初始化双链循环线性表
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
Status InitList_DuL(DuLinkList & L) {
L = (DuLinkList)malloc( sizeof (DuLNode));
L -> next = L -> prior = L;
return OK;
}
/* ******************************************************************************
/* <FUNC>
/* 函数名 : GetElemP_Dul
/* 功能 : 获取双链循环线性表中的元素
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
DuLNode * GetElemP_Dul(DuLinkList L, int i) {
int j; struct DuLNode * p = L;
if (i < 1 ) // 非法i值
return NULL;
if (p -> next == L) // 空双向循环链表
return L;
p = L -> next; j = 1 ; // 初始化, p指向第一个结点, j为计数器
while (p != L && j < i) { // 顺指针向后查找, 直到p指向第i个元素或p指向头结点
p = p -> next; ++ j;
}
return p;
}
/* ******************************************************************************
/* <FUNC>
/* 函数名 : ListInsert_DuL
/* 功能 : 插入元素
/* 参数 : -
/* 返回值 : -
/* 备注 : 在带头结点的双链循环线性表L中第i个位置之前插入元素e
/* i的合法值为1 <= i <= 表长 + 1
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
Status ListInsert_DuL(DuLinkList & L, int i, ElemType e) {
struct DuLNode * p = NULL;
struct DuLNode * s = NULL;
if ( ! (p = GetElemP_Dul(L, i)))
return ERROR;
if ( ! (s = (DuLinkList)malloc( sizeof (DuLNode)))) return ERROR;
s -> data = e;
s -> prior = p -> prior; p -> prior -> next = s;
s -> next = p; p -> prior = s;
return OK;
}
/* ******************************************************************************
/* <FUNC>
/* 函数名 : ListDelete_DuL
/* 功能 : 删除元素
/* 参数 : -
/* 返回值 : -
/* 备注 : 在带头结点的双链线性表L中, 删除第i个元素, 并由e返回其值
/* i的合法值为1 <= i <= 表长
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
Status ListDelete_DuL(DuLinkList & L, int i, ElemType & e) {
struct DuLNode * p = NULL;
if ( ! (p = GetElemP_Dul(L, i)) || L == GetElemP_Dul(L, i))
return ERROR;
e = p -> data;
p -> prior -> next = p -> next;
p -> next -> prior = p -> prior;
free(p); return OK;
}
/* ******************************************************************************
/* <FUNC>
/* 函数名 : ListTraverse_DuL
/* 功能 : 遍历线性表
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
Status ListTraverse_DuL(DuLinkList & L, Status ( * Visit)(ElemType)) {
printf( " traverse list: " );
struct DuLNode * p = L -> next; // 略过头结点
while (p != L) {
Visit(p -> data);
p = p -> next;
}
return OK;
}
/* ******************************************************************************
/* <FUNC>
/* 函数名 : Visit
/* 功能 : 访问线性表中的元素
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
Status Visit(ElemType e)
{
printf( " %d " , e);
return OK;
}
/* ******************************************************************************
/* <FUNC>
/* 函数名 : main
/* 功能 : 测试函数
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
void main()
{
DuLinkList L; ElemType e;
InitList_DuL(L);
// 插入元素
if (OK == ListInsert_DuL(L, 0 , 55 )) printf( " insert 55 succeed!\n " );
if (OK == ListInsert_DuL(L, 1 , 56 )) printf( " insert 56 succeed!\n " );
ListTraverse_DuL(L, Visit); printf( " \n " );
if (OK == ListInsert_DuL(L, 2 , 57 )) printf( " insert 57 succeed!\n " );
if (OK == ListInsert_DuL(L, 1 , 58 )) printf( " insert 58 succeed!\n " );
ListTraverse_DuL(L, Visit); printf( " \n " );
// 删除元素
if (OK == ListDelete_DuL(L, 1 , e)) printf( " the %dst elem deleted!\n " , 1 );
if (OK == ListDelete_DuL(L, 3 , e)) printf( " the %drd elem deleted!\n " , 3 );
if (OK == ListDelete_DuL(L, 4 , e))
printf( " the %dth elem deleted!\n " , 4 );
else
printf( " delete the %dth elem failed!\n " , 4 );
if (OK == ListDelete_DuL(L, 1 , e)) printf( " the %dst elem deleted!\n " , 1 );
ListTraverse_DuL(L, Visit); printf( " \n " );
if (OK == ListDelete_DuL(L, 1 , e)) printf( " the %dst elem deleted!\n " , 1 );
ListTraverse_DuL(L, Visit); printf( " \n " );
}
/* <PRE>
/* 版权所有 : -
/* 模块名 : 线性表
/* 文件名 : dlinklist.cpp
/* 功能描述 : 双链循环线性表的表示与实现
/* 作者 : <xxx>
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : -
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 <xxx> 创建
/* </PRE>
****************************************************************************** */
#include < stdio.h >
#include < stdlib.h >
/* *****************************************************************************
/* 数据类型和常量定义
/***************************************************************************** */
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
/* *****************************************************************************
/* 数据结构声明
/***************************************************************************** */
/* 线性表的双向链表存储结构 */
typedef struct DuLNode {
ElemType data;
struct DuLNode * prior;
struct DuLNode * next;
} DuLNode, * DuLinkList;
/* ******************************************************************************
/* <FUNC>
/* 函数名 : InitList_DuL
/* 功能 : 初始化双链循环线性表
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
Status InitList_DuL(DuLinkList & L) {
L = (DuLinkList)malloc( sizeof (DuLNode));
L -> next = L -> prior = L;
return OK;
}
/* ******************************************************************************
/* <FUNC>
/* 函数名 : GetElemP_Dul
/* 功能 : 获取双链循环线性表中的元素
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
DuLNode * GetElemP_Dul(DuLinkList L, int i) {
int j; struct DuLNode * p = L;
if (i < 1 ) // 非法i值
return NULL;
if (p -> next == L) // 空双向循环链表
return L;
p = L -> next; j = 1 ; // 初始化, p指向第一个结点, j为计数器
while (p != L && j < i) { // 顺指针向后查找, 直到p指向第i个元素或p指向头结点
p = p -> next; ++ j;
}
return p;
}
/* ******************************************************************************
/* <FUNC>
/* 函数名 : ListInsert_DuL
/* 功能 : 插入元素
/* 参数 : -
/* 返回值 : -
/* 备注 : 在带头结点的双链循环线性表L中第i个位置之前插入元素e
/* i的合法值为1 <= i <= 表长 + 1
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
Status ListInsert_DuL(DuLinkList & L, int i, ElemType e) {
struct DuLNode * p = NULL;
struct DuLNode * s = NULL;
if ( ! (p = GetElemP_Dul(L, i)))
return ERROR;
if ( ! (s = (DuLinkList)malloc( sizeof (DuLNode)))) return ERROR;
s -> data = e;
s -> prior = p -> prior; p -> prior -> next = s;
s -> next = p; p -> prior = s;
return OK;
}
/* ******************************************************************************
/* <FUNC>
/* 函数名 : ListDelete_DuL
/* 功能 : 删除元素
/* 参数 : -
/* 返回值 : -
/* 备注 : 在带头结点的双链线性表L中, 删除第i个元素, 并由e返回其值
/* i的合法值为1 <= i <= 表长
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
Status ListDelete_DuL(DuLinkList & L, int i, ElemType & e) {
struct DuLNode * p = NULL;
if ( ! (p = GetElemP_Dul(L, i)) || L == GetElemP_Dul(L, i))
return ERROR;
e = p -> data;
p -> prior -> next = p -> next;
p -> next -> prior = p -> prior;
free(p); return OK;
}
/* ******************************************************************************
/* <FUNC>
/* 函数名 : ListTraverse_DuL
/* 功能 : 遍历线性表
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
Status ListTraverse_DuL(DuLinkList & L, Status ( * Visit)(ElemType)) {
printf( " traverse list: " );
struct DuLNode * p = L -> next; // 略过头结点
while (p != L) {
Visit(p -> data);
p = p -> next;
}
return OK;
}
/* ******************************************************************************
/* <FUNC>
/* 函数名 : Visit
/* 功能 : 访问线性表中的元素
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
Status Visit(ElemType e)
{
printf( " %d " , e);
return OK;
}
/* ******************************************************************************
/* <FUNC>
/* 函数名 : main
/* 功能 : 测试函数
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
****************************************************************************** */
void main()
{
DuLinkList L; ElemType e;
InitList_DuL(L);
// 插入元素
if (OK == ListInsert_DuL(L, 0 , 55 )) printf( " insert 55 succeed!\n " );
if (OK == ListInsert_DuL(L, 1 , 56 )) printf( " insert 56 succeed!\n " );
ListTraverse_DuL(L, Visit); printf( " \n " );
if (OK == ListInsert_DuL(L, 2 , 57 )) printf( " insert 57 succeed!\n " );
if (OK == ListInsert_DuL(L, 1 , 58 )) printf( " insert 58 succeed!\n " );
ListTraverse_DuL(L, Visit); printf( " \n " );
// 删除元素
if (OK == ListDelete_DuL(L, 1 , e)) printf( " the %dst elem deleted!\n " , 1 );
if (OK == ListDelete_DuL(L, 3 , e)) printf( " the %drd elem deleted!\n " , 3 );
if (OK == ListDelete_DuL(L, 4 , e))
printf( " the %dth elem deleted!\n " , 4 );
else
printf( " delete the %dth elem failed!\n " , 4 );
if (OK == ListDelete_DuL(L, 1 , e)) printf( " the %dst elem deleted!\n " , 1 );
ListTraverse_DuL(L, Visit); printf( " \n " );
if (OK == ListDelete_DuL(L, 1 , e)) printf( " the %dst elem deleted!\n " , 1 );
ListTraverse_DuL(L, Visit); printf( " \n " );
}