I come, I see, I conquer

                    —Gaius Julius Caesar

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

 

 

/*******************************************************************************
/* <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 *= 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 *= NULL;
    
struct DuLNode *= 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 *= 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 *= 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, 055)) printf("insert 55 succeed!\n");
    
if (OK == ListInsert_DuL(L, 156)) printf("insert 56 succeed!\n");
    ListTraverse_DuL(L, Visit); printf(
"\n");
    
if (OK == ListInsert_DuL(L, 257)) printf("insert 57 succeed!\n");
    
if (OK == ListInsert_DuL(L, 158)) 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");
}

 

posted on 2008-09-24 20:51  jcsu  阅读(1321)  评论(0编辑  收藏  举报