阿涛,你要认真对待每一件事,你要潇洒,你要做自己!
循环链表概念:
循环链表通俗来讲就是讲普通的单向链表的链表头和链表尾部连接起来。让尾部的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之前方可,可能是编译的顺序就是声明的顺序,调用没有被编译到的函数肯定出错。
欢迎大家指正错误和不足!