#动态链表
静态链表和动态链表的区别:
##静态链表和动态链表是线性表链式存储结构的两种不同的表示方式
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_链表讲解,特意讲解如何增加节点和如何输出节点,每一句代码都介绍的特别详细,如果要删除节点,那么和增加节点类似,只需要添加一个函数并编写这个函数即可。(可模仿增加节点来写)