/*******************************************************************************
/* <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");
}