数据结构---线性表(单循环链表)

CircleList.h

#ifndef __CIRCLELIST_H__
#define __CIRCLELIST_H__


//一些库函数的头文件包含
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <math.h>
 
//自定义bool
typedef int Boolean;
 
//定义函数返回状态
typedef int Status;
 
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0


typedef struct Node
{
	ElemType data;
	struct Node *next;
}LNode,*PNode;

/* 初始化 */
Status init(PNode *list);

/* 销毁 */
Status destroy(PNode *list);

/* 重置 */
Status clear(PNode *list);

/* 判空 */
Boolean isEmpty(PNode list);

/* 获取已存元素的数量 */
int listLen(PNode list);

/* 获取指定索引的元素 */
Status getElem(PNode list, int index, int *elem);

/* 获取给定元素值,并满足关系的第一个元素的索引 */
int LocateElem(PNode list, int elem, int (*comp)(int, int));

/* 获取元素的前驱 */
Status getPriorElem(PNode list, int elem, int *pre_);

/* 获取元素的后继 */
Status getNextElem(PNode list, int elem, int *next_);

/* 插入一个元素 */
Status insertElem(PNode *list, int index, int elem);

/* 删除一个元素 */
Status deleteElem(PNode *list, int index, int *del_elem);

/* 根据给定关系改变元素的值 */
Status traverse(PNode list, void (*update)(int *) );

#endif

CircleList.c

#include "CircleList.h"

/* 初始化 */
Status init(PNode *list)
{
	*list = (PNode)malloc(sizeof(LNode));
	if(!*list)
	{
		printf("动态内存分配失败");
		exit(-1);
	}

	(*list)->next = *list;
	return OK;
}

/* 销毁 */
Status destroy(PNode *list)
{
	//获取头结点
	PNode q,p = (*list)->next;
	while(p != (*list) ) //只要首结点的下个结点不是尾结点
	{
		q = p->next;
		free(p);
		p = q;
	}
	free(*list);
	*list = NULL;
	return OK;
}

/* 重置 */
Status clear(PNode *list)
{
	//获取头结点,并将头结点的next设为自身(初始循环状态),其实就是讲尾指针指向head结点上
	*list = (*list)->next;
	PNode q,p = (*list)->next;//获取首结点
	while(p!=(*list))
	{
		q = p->next;
		free(p);
		p = q;
	}
	(*list)->next = (*list); //再将头结点的n指针域设为自身
	return OK;
}

/* 判空 */
Boolean isEmpty(PNode list)
{
	if(list->next == list)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

/* 获取已存元素的数量 */
int listLen(PNode list)
{
	int i=0;
	//获取头结点,如果获取的是首结点,则循环完了还要加上尾结点这个元素
	PNode p = list->next;
	while(p != list)
	{
		i++;
		p = p->next;
	}

	return i;
}

/* 获取指定索引的元素 */
Status getElem(PNode list, int index, int *elem)
{
	int i = 0;
	PNode p = list->next;
	while(i < index &&  p!=list)
	{
		i++;
		p = p->next;
	}

	if(i > index || p == list)
	{
		return ERROR;	
	}

	*elem = p->next->data;
    return OK;
}

/* 获取给定元素值,并满足关系的第一个元素的索引 */
int LocateElem(PNode list, int elem, int (*comp)(int, int))
{
	int i = 0;
	PNode p = list->next->next;
	while(p != list->next)
	{
		if(comp(p->data, elem))
		{
			return i;
		}
		i++;
		p = p->next;
	}

	return -1;
}

/* 获取元素的前驱 */
Status getPriorElem(PNode list, int elem, int *pre_)
{
	PNode q,p = list->next->next;
	q = p->next;
	while(q != list->next) //只要结点不等于头结点
	{
		if(q->data == elem)
		{
			*pre_ = p->data;
			return OK;
		}
		p = q;
		q = q->next;
	}
	return ERROR;
}

/* 获取元素的后继 */
Status getNextElem(PNode list, int elem, int *next_)
{
	PNode p = list->next->next;
	
	while(p != list)
	{
		if(p->data == elem)
		{
			*next_ = p->next->data;
			return OK;
		}
		p = p->next;
	}
	return ERROR;
}

/* 插入一个元素 */
Status insertElem(PNode list, int index, int elem)
{
	int i =0;
	PNode s,p = list->next;
	while(i < index && p != list->next)
	{
		i++;
		p = p->next;
	}
	if( i > index || p == list->next)
	{
		return ERROR;
	}

	s = (PNode)malloc(sizeof(LNode));
	s->data = elem;

	s->next = p->next;
	p->next = s;
	if(p == list) //如果p是尾结点,则说明是在尾结点后插入结点,则尾指针应该指向新结点
	{
		list = s;
	}

	return OK;
}

/* 删除一个元素 */
Status deleteElem(PNode *list, int index, int *del_elem)
{
	int i = 0;
	PNode q,p = (*list)->next;
	while(i < index && p != (*list))
	{
		i++;
		p = p->next;
	}

	if( i > index || p == (*list))
	{
		return ERROR;
	}

	q = p->next;
	p->next = q->next;
	if(q == (*list))
	{
		*list = p;
	}
	*del_elem = q->data;
	free(q);
	q= NULL;

	return OK;
}

/* 根据给定关系改变元素的值 */
Status traverse(PNode list, void (*update)(int *) )
{
	PNode p = list->next;
	while( p!= list)
	{
		update( &(p->next->data) );
		p = p->next;
	}
	printf("\n");
	return OK;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值