C语言链表

头指针

头指针可用于方便访问链表中的结点,创建链表分为带头结点的链表和不带头结点的链表,带头结点链表先开辟一个空间用于存放头结点,访问第一个结点使用head->next。不带头结点的链表访问第一个结点直接使用head访问第一个结点,两者各有各好处。

目前大多数都使用带头结点的链表,因为其在增、删、查、改时相比不带头结点的链表更具优势。

  • 带头结点的链表创建

    先开辟头结点空间(node)

    	List *createListHead(int n){
    	List *node,*parentNode,*p;
    	int i;
    	p=(List *) malloc(sizeof(List));
    	//保存头指针
    	parentNode=p;
    	for(i=0;i<n;i++){
    		node=(List *)malloc(sizeof(List));
    		printf("请输入第 %d 个值:",i+1);
    		scanf("%d",&(node->data));
    		node->next=NULL;
    		p->next=node;
    		p=p->next;
    	}
    	return parentNode;
    
    }
    
  • 不带头结点的链表创建

    先对头结点赋值结点(node),然后对node->next->next依次赋值操作

    List *createList(int n){
    
    	List *node,*parentNode,*p;
    	int i;
    	p=(List *)malloc(sizeof(List));
    	printf("请输入第 %d 个值:",1);
    	scanf("%d",&(p->data));
    	p->next=NULL;
    	parentNode=p;
    
    
    
    	
    	for(i=1;i<=n-1;i++){
    		node=(List *)malloc(sizeof(List));
    		printf("请输入第 %d 个值:",i+1);
    		scanf("%d",&(node->data));
    		node->next=NULL;
    		p->next=node;
    		p=p->next;
    		
    	}
    	return parentNode;
    
    }
    

注意需要区分头结点和真正的链表元结点的区别.

简单链表的操作

简单链表的一般操作主要包含插入删除(修改),以下操作均使用带头结点的链表讲解

1、链表的插入

链表的插入分为三种:

  1. 在开始处插入结点
  2. 在中间某处插入结点
  3. 在结尾处插入结点

其中在结尾处插入就类似于链表的创建,就不做示例

在开始处插入:

// 1、第一个位置前插入 传入HEAD->next
void insertHead(List *head){
	 List *NEW;
	 //为新结点分配一个地址空间
	 NEW=(List *)malloc(sizeof(List));
	 //假设新结点的值为0
	 NEW->data=0;
	 //新结点的next 为原来头结点后的链表,头结点后变为新结点即实现了第一个位置处的插入
	 NEW->next=head->next;
	 head->next=NEW;

}

在中间某处插入:

// 3、在中间某处插入链表 
// 传入头结点,插入第n个结点处
void insertMiddle(List *head,int n){
	List *NEW,*node,*currentNode;
	int i;
	NEW = (List *)malloc(sizeof(List));
	NEW->data=0;
	
	node=head;

	for(i=0;i<n;i++){
		//保存上一个结点
		currentNode=node;
		node=node->next;
		
	}
	//node 位置为需要插入的地方
	//currentNode 为上一个结点位置
	NEW->next=node;
	currentNode->next=NEW;
}
2、链表的删除

链表的删除也主要为三种:

  1. 删除开始结点
  2. 删除中间结点
  3. 删除结尾结点

删除开始结点:

删除开始结点比较简单,就一句就可解决:head->next=head->next->next;

删除中间某结点:

void deleteMiddleList(List *head,int n){
	List *node,*currentNode;
	int i;
	node = head;
	for(i=0;i<n;i++){
		currentNode=node;
		node=node->next;
	}
	currentNode->next=node->next;
}

一个人为创建链表并将链表反向的简单例子:

#include<stdio.h>
#include<stdlib.h>

typedef struct Lnode{

	int data;
	struct Lnode *next;
} List;//typedef定义一个结构体,以后使用可以直接用List *p的方式调用
void print(List *h);
List *reverseprint(List *h);
List *createList(n);

int main(){
	int num;
	List *HEAD,*reverse=NULL;
	printf("输入你要创建链表的数量:");
	scanf("%d",&num);
	HEAD=createList(num);
	printf("你刚才创建的链表为:\n");
	print(HEAD->next);//创建链表的时候没有对第一个链表操作,所以打印的时候传递HEAD->next
	printf("反向输出链表位:\n");
	reverse=reverseprint(HEAD);

	print(reverse);
	system("pause");
	return 0;
	
}

//创建链表,返回一个链表指针
List *createList(n){
	int i;//存储链表数据
	
	List *parentnode,*node,*p;//定义一个父指针
	p=(List *)malloc(sizeof(List));//动态分配大小并返回指向改内存的指针
	//p=NULL;

	parentnode=p;
	for(i=1;i<=n;i++){

		node=(List *)malloc(sizeof(List));//动态分配大小并返回指向改内存的指针
		printf("输入第%d个链表数据:",i);
		scanf("%d",&(node->data));
		node->next=NULL;


		p->next=node;//*p的下一节点为当前节点
		p=p->next;//指向下一节点
	
	}

	return parentnode;
		
	
}
//输出链表
void print(List *h){

	List *p=h;

    while(p!=NULL){
	
        printf("%d ",p->data);
			p=p->next;
		
     
    }
		
	printf("\n\n");

}

//将链表反向
List *reverseprint(List *h){
	
	List *currentNode, *preNode, *nextNode;

//当前节点为HEAD->next(因为HEAD链表第一个结构体没有做操作)
	currentNode =h->next;
	preNode = NULL;
	nextNode = NULL;
	if (currentNode == NULL)//如果为空则返回空
	return NULL;
while (currentNode!=NULL)
	{

		nextNode = currentNode->next;//下一节点为当前节点的下一节点
		currentNode->next = preNode;//当前节点的下一节点为上一个节点,如下行,从而实现了逆序
		preNode = currentNode;//下一节点为当前节点,在下次循环赋值给下一节点,如上行
		currentNode = nextNode;//当前节点为下一节点,做循环判断
	}

	return preNode;//返回逆序后的链表

}
  • 在链表操作时使用一个中间变量结点(node)当做结点每次改变的临时地址存储,在使用p->next重新指向
  • 链表指针传递过程p=node–>next–>p=node–>next

箭头和点的区别:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值