《数据结构》双链循环线性表

 

 

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值