单向循环链表
   
    
     单向循环链表
    
    :将单向链表的最后一个结点指向头结点形成一个环,即成为单向循环链表,可以通过其中任意一个结点出发访问到其他结点。单向循环链表的操作方法与单向链表相似,只是在于循环条件存在差异。
    
    
     特点
    
    :
   
- 若链表为空,则头结点的next结点还是指向其本身,即head ->next=head;
- 尾节点的next指针指向head结点,即头尾相连;
- 通过判断当前结点的next结点是否与head结点相等,即可判断是否对单向循环链表遍历完成;
- 循环链表无须增加存储量,仅对单向链表的链接方式稍作改变,即可使得单向链表处理更加方便灵活。
    单向循环链表结构如下图所示:
    
    
    
    
     注
    
    :单向循环链表不一定存在头结点
   
    
    
    单向循环链表宏定义及数据类型
   
//定义处理的数据类型
typedef int ElemType;
#define bool int
//定义状态
typedef enum Status
{
    success, fail, fatal, rang_err
}Status;
//定义数据类型的结构
typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node,*PtrList;
    
    
    单向循环链表初始化
   
/************************************************************
 * 函数名称:InitList(PtrList list,int size)
 * 功能描述:初始化循环链表
 * 传入参数:PtrList lis       待初始化的循环链表
 *           int size          初始化的循环链表长度
 * 返回值:fail    失败
 *         success 成功
 ************************************************************/
Status InitList(PtrList list, int size)
{
    Status _outcome_ = fail;
    int i = 1;
    ElemType elem;
    list = (PtrList)malloc(sizeof(Node));
    PtrList Tail;
    PtrList Temp;
    if(list != NULL)
    {
        list -> data = 0;
        list -> next = list;/*第一个节点不保存数据*/
        Tail = list;
        for(; i< size+1;size++)
        {
            Temp = (PtrList)malloc(sizeof(Node));
            if(Temp == NULL)
            {
                return _outcome_;
            }
            printf("请输入第%d个节点的数据:",i)
            scanf("%d",&elem);
            Temp -> data = elem;
            Temp ->next = list;
            Tail ->next = Temp;
            Tail = Temp;
            _outcome_ = success;
        }
    }
    return _outcome_;
}
    
    
    单向循环链表插入数据
   
/************************************************************
 * 函数名称:InitList(PtrList list,int size)
 * 功能描述:循环链表插入数据
 * 传入参数:PtrList lis       传入的循环链表
 *           int i             插入的位置
 *           ElemType elem     插入的数据
 * 返回值:fail    失败
 *         success 成功
 ************************************************************/
Status InsertList(PtrList list, int i,ElemType elem)
{
    Status _outcome_ = fail;
    PtrList Temp = NULL,Target = NULL;
    if(i == 1)/*循环链表头部插入结点*/
    {
        Temp = (PtrList)malloc(sizeof(Node));
        if(NULL == Temp)
        {
            return _outcome_;
        }
        Temp -> data = elem;
        for( Target = list; Target != list; Target = Target -> next);/*找到最后一个结点*/
        Temp -> next = list;
        Target ->next = Temp;
        list = Temp;/*新插入的结点作为头节点*/
        _outcome_ = success;
    }
    else
    {
        Target = list;
        for(int j = 1; j < (i-1); j++)
        {
            Target = Target -> next;/*找到第i-1个节点*/
        }
        Temp = (PtrList)malloc(sizeof(Node));
        if(Temp == NULL)
        {
            return _outcome_;
        }
        Temp ->next = Target ->next;
        Temp ->data = elem;
        Target -> next = Temp;
        _outcome_ = success;
    }
    return _outcome_;
}
    
    
    单向循环链表删除结点
   
/************************************************************
 * 函数名称:DeleteList(PtrList list, int i)
 * 功能描述:循环链表删除数据
 * 传入参数:PtrList lis       传入的循环链表
 *           int i             删除的位置
 * 返回值:fail    失败
 *         success 成功
 ************************************************************/
Status DeleteList(PtrList list, int i)
{
    Status _outcome_ = fail;
    PtrList Target = NULL,Temp = NULL;
    if(i == 1)
    {
        for(Target = list;Target ->next != list;Target = Target -> next);/*找到尾结点*/
        Target ->next = list ->next;
        Temp = list;
        list = list ->next;
        free(Temp);
        if( NULL != Temp)
        {
            return _outcome_;
        }
        _outcome_ = success;
    }
    else
    {
        Target = list;
        for(int j = 1; j < i-1; j++)
        {
            Target = Target -> next;/*找到第i-1个结点*/
        }
        Temp = Target ->next;
        Target ->next = Temp ->next;
        free(Temp);
        if(NULL != Temp)
        {
            return _outcome_;
        }
        _outcome_ = success;
    }
    return _outcome_;
}
    
    
    返回单向循环链表中结点位置
   
/************************************************************
 * 函数名称:SearchList(PtrList list, ElemType elem)
 * 功能描述:返回节点所在位置
 * 传入参数:PtrList lis       传入的循环链表
 *           ElemType  elem    结点数据        
 * 返回值:结点位置
 *         若返回0表示循环链表中不存在该结点
 ************************************************************/
int SearchList(PtrList list, ElemType elem)
{
    PtrList Target = list;
    PtrList listHead = list;
    int num = 0;
    
    while((Target -> data != elem) && (Target -> next != listHead))
    {
        ++num;
        Target = Target -> next;
    }
    
    if(Target -> next == listHead && Target -> data != elem)
    {
        return fail;
    }
    
    return num;
}
 
版权声明:本文为qq_41596356原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
