循环链表的创建

阿涛,你要认真对待每一件事,你要潇洒,你要做自己!

 

循环链表概念:

循环链表通俗来讲就是讲普通的单向链表的链表头和链表尾部连接起来。让尾部的next指向头部。

下面以一个寻找幸运小狗的例子来了解下循环链表的简单实用。

步骤:

首先,创建一个实现循环链表的函数,函数带个int参数,用来指明需要创建多少个节点。

然后,创建一本寻找幸运小狗的函数,函数也带一个int参数,用于指明每隔几个小狗删除一个,最后剩下的那个小狗就是幸运的小狗啦。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#define DogLEN sizeof(struct luckDog)

struct luckDog
{
  int dogNum;
  struct luckDog* next;
};
struct luckDog*cycleHead,*cycleTail;

int main(int argc, char *argv[])
{
   creatCycleList(8);
   selectTheLuckDog(3);
   return 0;

}

 

创建循环链表的函数:

void creatCycleList(int dotNum)
{
    struct luckDog*p,*q;
    p=(struct luckDog*)malloc(DogLEN);
    if(dotNum<=0)
    {
        return;
    }
    p->dogNum=1;
    q=p;
    cycleHead=p;
    int num=2;
    for(num;num<=dotNum;num++)
    {
        p=(struct luckDog*)malloc(DogLEN);
        p->dogNum=num;
        q->next=p;
        q=p;
        p->next=NULL;
    }
    cycleTail=p;
    cycleTail->next=cycleHead;//将链表头尾相连,实现链表循环。

}

 

选择函数:

void  selectTheLuckDog(int spaceNum)
{
    int i=0;
    struct luckDog* p,*q;
    p=cycleHead;
    while(p->next!=p)
    {
        for(i;i<spaceNum-1;i++)//因为下面删除的是p指向的节点,而每次循环后p指向的是p的next,所以少循环一次。
        {
            q=p;
            p=p->next;

        }
        q->next=p->next;
        free(p);
        p=q->next;
        i=0;
    }
    printf("%d\n",p->dogNum);
}

代码无误,可以运行,对于初学C的同学兴许有点帮助,哪里不理解,请留言,呵呵。。。。。。

这种数据结构初级的东西最好在CodeBlocks中实验,然后一步一步调试,哪里出了问题很清晰明了。

前几天了解的一个注意点:在C中,函数A想调用函数B,必须将B声明在A之前方可,可能是编译的顺序就是声明的顺序,调用没有被编译到的函数肯定出错。

欢迎大家指正错误和不足!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值