建立 简单静态链表

存储一组具有连续内存关系的数据,我们可以用数组来进行存储
即使用数组名加下标的引用方式 // 随机存取
数组名表示起始地址,下标来表示相对偏移量
1.但是在进行插入与删除操作时
(第一位)需要将所有元素全部移动 效率很低
2.内存空间提前申请 空间浪费

所以 设想一种方法 链表
在不移动其他数据的前提下,实现插入与删除
不用预先开辟空间 用多少开辟多少
链表 在保证数据的逻辑顺序不变的前提下,一种新的存储方式

之前我们得知 数组元素的访问实质是通过地址计算实现的
而指针本身就是地址 我们考虑用数据的地址来构造一种新的存储结构
//只有向后的一个方向的链接关系------单链表
head 存第一个节点的地址
链表中的每个元素都称为结点
每个节点都包括两部分:
1.用户需要的实际数据
2.下一个节点的地址
表头: 存放第一个节点的地址
表尾: 它的地址存放NULL//表示链表的结束
//单链表 还可以 增加一个头结点 //头结点的数据域中并没有实际的数据 头指针用来存放头结点的地址 在后续就会发现头结点的用处

typedef int/ datatype;
typedef //struct node{

datatype data ;
struct node next;//下一个结点的地址信息
}//换名node,*linklist;//用typedef

相关函数
原型说明在"stdlib.h>“头文件和"alloc.h”
1.malloc 函数
void *malloc (unsigned int size);
在内存的动态存储区分配一个长度为size的连续空间
函数的结果指向一个指针,并指向所分配的存储空间的起始地址 如果没有足够的内存可以分配 返回一个空指针NULL
例如 int *pi=(int *)malloc(sizeof(int));
malloc 函数动态开辟了一个 int大小 sizeof 的连续空间,将开辟的存储空间转化为int 类型地址
*pi=100;
2. calloc 函数
void *calloc(unsigned n,unsigned size);// n为元素个数,size为元素长度
在内存的动态区分配n个长度为size的连续空间
函数的结果依然返回一个指针 并指向所风配的存储空间的起始地址
如果没有足够的内存可以分配,还是返回一个空指针NULL
例如 : int *pA=(int *)calloc(10,sizeof(int ));

3 free函数
void free(void *p)
将指针变量p指向的存储空间释放
例如 : int *p,*q=(int *)calloc(10,sizeof(int));
p=q; q++;
free§;
free 函数没有返回值

建立 简单静态链表
来输出a b c 三个节点元素的内容

#include<stdio.h>
struct student{ //相当于结点
int num; //两个数据域
float score;
struct student next; //一个指针域 编辑器指针符号显示不出来
}a,b,c;
int main()
{ struct student a,b,c,head,p;//链表自然要定义头指针,指针自然带
a.num=10086; a.score=32.1f
**;//类型转换***
b.num=12121; b.score=65.3f; //结点数据初始化值
c.num=10011; c.score=49.5;
head=&a; a.next=&b;
b.next=&c; c.next=NULL; //链起来 链起来
p=head;
do{ //
printf("%ld %5.1f\n",p->num,p->score);//由p做过渡,逐个输出结点元素值
p=p->next;}
while(p!=NULL);//套用 do while 循环 全部输出
return 0;
}
运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

约卡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值