2020.3.19凌晨
running spring starts here!C语言实战
C语言学习内容,欢迎一起学习交流,共同进步!!!
本篇讲解循环链表的操作(尽可能规范,极简化)代码尽可能详细明了
主要包含创建链表,以及间隔一定步数按次序取出链表节点的操作。
先贴上主要用到的结构体
struct NODE{
char name[80];
int key;
struct NODE *next;
};
后面我会继续出更多的相关代码完善此项目,(下一次使key代表每个人手中抽中的52张扑克牌中的一个),这一次先搭好框架,key只是一个随机值,通过rand()实现。
1.Appendto函数实现创建链表的操作
void Appendto(struct NODE **h,struct NODE *n) //引用二级指针,做到能够将main函数里的head头指针作以修改
{ struct NODE *p;
if( *h == NULL) {
*h = n;
n -> next = n; //构成循环链表
return;
}
p = *h;
while(p->next != *h) p = p->next;
n->next = p->next;
p->next = n;
return;
}
2.DeleteNext函数实现将链表通过传入的step,进行寻找返回间隔一定步数的节点,并做好释放节点的准备工作
struct NODE *DeleteNext(struct NODE **h, int step)
{ static struct NODE **hp, *bgn;
int i;
struct NODE *p;
if( h != NULL) {
hp = h; //第一次传入,通过静态量hp保存h,因为之后可能会有修改头指针的操作
bgn = *hp;
}
if( hp == NULL || *hp == NULL) return NULL; //检查main调用的时候是否正确传入了链表的地址,以及检查链表是否已经为空
if(bgn->next == bgn) { //(如果bgn是仅剩唯一的节点)执行单循环链表处理操作
*hp = NULL;
return bgn;
}
if(step < 2) { //step单步计数
p = bgn;
while (p->next != bgn)
p = p->next;
}
for(i = 0;i<step-1;i++) { //多步计数 step-1的原因是因为从bgn开始已经走了一步
p = bgn;
bgn = bgn->next;
}
p->next = bgn->next;
p = bgn;
bgn = bgn->next;
if(*hp == p) *hp = bgn;
return p;
}
runningspring,coding快乐每一天,开始奔跑吧,running!!!