数据结构-单向循环链表(初始化、插入结点、删除结点等操作)

  • Post author:
  • Post category:其他




单向循环链表



单向循环链表

:将单向链表的最后一个结点指向头结点形成一个环,即成为单向循环链表,可以通过其中任意一个结点出发访问到其他结点。单向循环链表的操作方法与单向链表相似,只是在于循环条件存在差异。


特点

  • 若链表为空,则头结点的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 版权协议,转载请附上原文出处链接和本声明。