C语言---动态链表

本文对比了静态链表与动态链表,重点介绍了动态链表的建立,包括如何插入节点和查询节点。文章以C语言实现,详细解析了相关代码,适合学习C语言链表操作的读者。
摘要由CSDN通过智能技术生成

#动态链表
静态链表和动态链表的区别:
##静态链表和动态链表是线性表链式存储结构的两种不同的表示方式
1、静态链表是用类似于数组方法实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配地址空间大小。所以静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针。
2、动态链表是用内存申请函数(malloc/new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。
##动态链表建立
本文主要讲解插入节点和查询节点,废话不多说直接看代码:

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

//定义链表结构体 
struct StudNode
{
	char             name[16];
	long             num;
	float            score;
	struct StudNode  *next;

};
//节点指针 
struct StudNode *head , *thisN , *newN;

void NewNode(void);   //增加节点 
void ListAll(void);   //输出节点 


int main()
{
	char ch;
	int flag=1;
	head = NULL;
	
	
	//按照用户选择,决定增加节点还是输出数据
	while(flag)
	{
		printf("\n请输入 'E' or 'e' 添加新节点:");
		printf("\n请输入 'L' or 'l' 显示输出所有节点:");
		
		ch = getchar();   getchar();
		switch(ch)
		{
			case 'e':case 'E':NewNode();break;
			case 'l':case 'L':ListAll();break;
			default:flag=0;
		}
	 } 
	 
	 
	 return 0;
}
//增加节点函数 
void NewNode(void)
{
	char numstr[16];
	
	//开辟一个存储新节点的存储空间 
	newN = (struct StudNode *)malloc (sizeof(struct StudNode));	
	//将新节点连接到表尾
	 if(head == NULL)           //head 为表尾 
	 {
	 	head = newN;
	 }
	 else                       //原表不是NULL,新表将从头找到尾 
	 {
	 	thisN =head;               //先指向针头 
	 	while(thisN->next!=NULL)   //判断当前节点next指针是否表尾 
	 		thisN=thisN->next;     //不是表尾以下一个节点作为当前节点 
	 	thisN->next=newN;          // 找到表尾,将next指针指向新节点 
	 }
	 thisN=newN;                   //使用 thisN给新节点各成员赋值
	 
	 printf("\nenter name :");     //输入新节点name数据
	 gets(thisN->name); 
	 printf("\nenter num :");      //输入新节点num数据
	 gets(numstr);
	 thisN->num=atol(numstr);
	 printf("\nenter score :");    //输入新节点score数据
	 gets(numstr);
	 thisN->score=atof(numstr);
	 thisN->next=NULL;            //将新节点设为表尾 
}
//输出所有节点中的数据 
void ListAll(void)
{
	int i=0;
	if(head == NULL)           //输出空表信息 
	 {
	 	printf("\n空表\n"); 
	 	return ;
	 } 
	 thisN = head;             //非空表,先使用 thisN指向表头 
	 do{
	 	printf("\n第%d个节点\n",++i);
	 	printf("name:%s\n",thisN->name);
	 	printf("num:%d\n",thisN->num);
	 	printf("score:%f\n\n",thisN->score);
	 	thisN = thisN->next;    //一个节点输出完毕,thisN指向下一个节点 
	 }
	 while(thisN!=NULL);    //打印完最后一个节点就不在打印 
}

结果显示:
在这里插入图片描述
这篇文章主要针对之前发过的FreeRTOS_链表讲解,特意讲解如何增加节点和如何输出节点,每一句代码都介绍的特别详细,如果要删除节点,那么和增加节点类似,只需要添加一个函数并编写这个函数即可。(可模仿增加节点来写)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值