判断单链线性表是否为循环链表

 普通链表的尾指针为空,循环单链表的尾指针为头结点。故可以写出如下算法:

节点数据结构:

/*
*定义链式存储线性表的结构
*/
typedef struct LNode
{
    int data;     //数据域
    struct LNode * next; //指向下一个节点的指针
} LNode,*LinkList;
判定是否为循环链表:

/*
*fun:JudgeCircularList_L()
*desc:判断单链线性表L是否为循环链表,若是则返回OK,否则返回ERROR
*@param: L LinkList 头指针的引用
*@ret:OK/ERROR int
*/
Status JudgeCircularList_L(LinkList &L)
{
    if(!L||!L->next) return ERROR; //空指针或者单链表为空表
    LinkList tail,first;
    first=L->next;
    tail=first->next;
    while(tail&&tail!=first)
    {
        tail=tail->next;
    }
    if(!tail) return ERROR;
    else return OK;
}
创建循环链表:

/*
*fun:CreateCircularList_L()
*desc:顺序输入n个元素的值,建立带表头结点的循环单链线性表L
*@param: L LinkList类型(结构体指针类型)变量的引用
*@param:n int n n个元素
*@ret void
*/
void CreateCircularList_L(LinkList &L,int n)
{
    int m=n,value;
    L=(LinkList) malloc(sizeof(LNode));  //先建立一个带头结点的单链表
    L->next=L;     //为空表时,头结点指向本身
    LinkList tail=L,current,first;  //指针tail指向当前链表的最后一个节点,current指向当前插入的节点
    for(int i=0; i<m; i++)
    {
        current=(LinkList)malloc(sizeof(LNode));
        if(!i)first=current; //first记录第一个节点的地址
        scanf("%d",&value); //输入节点的值
        current->data=value;
        tail->next=current; //将新节点添加到链表尾部
        current->next=first;
        tail=current;
    }///注意:我这里的写法中最后一个节点并不指向头节点,头节点的数据域也并没有存放值
    ///只是为了方便找到链表才设置的头节点,也可把第一个节点当做头节点处理
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值