running spring starts here!

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!!!

Where there is a will, there is a way!

发布了1 篇原创文章 · 获赞 1 · 访问量 21

猜你喜欢

转载自blog.csdn.net/weixin_45543245/article/details/104958039