线性链表_C语言程序设计_[共7页]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
203 main()
{
Struct results stu[4]={{"WangTao",20081201,86,84},{"ZangHua",20081202,87,90}, {"LiFang", 20081203, 84, 87},{"ZhaoLin",20081204,75,78}},*p=stu;
int i;
for(i=0;i<4;i++,p++)
{stu[i].score=p->peacetime*0.3+(*p).test*0.7;
printf("%s\t%f\t%f\t%f\n",stu[i].name,stu[i].peacetime,p->test,(*p).score);} }
运行程序,输出结果如下:
WangTao
86.000000 84.000000 84.599998 ZangHua
87.000000 90.000000 89.099998 LiFang
84.000000 87.000000 86.099998 ZhaoLin 75.000000 78.000000 77.099998
9.1.5 线性链表
链表和数组都是线性表,数组是静态分配内存空间的数据结构,在数组类型声明中指定数组的类型和长度如“int x[8]={0,1,2,3,4,5} ; ”,集成开发环境IDE 根据类型确定每个数组元素占据的字节数,按照数组元素的序号,连续、顺序的分配存储单元,x[0]、x[1]、x[2]……x[7],依次存放线性表{0,1,2,3,4,5,…}中的元素x[0]=0、x[1]=1、x[2]=2、x[3]=3、x[4]=4……当增加或删除线性表中的某一元素,如删除x[3]=3元素中的3,存储在数组中的其后所有元素必须随之移动,x[3]=4、x[4]=5、……,当其后元素越多,运算步骤越多,降低程序执行效率。
链表是动态地进行存储分配的一种数据结构,由节点链接而成。
链表节点由数据域和指针域两部分组成,数据域存放数据,指针域存放下一节点的地址。
链表在程序执行阶段才分配所需的内存空间,链式存储结构是一种在存储单元上非连续、非顺序的存储结构,链表的存储节点是不连续的和无序的,靠每一节点的指针查找下一元素。
1.单向链表的节点结构
单向链表的节点由数据域和指针域两部分组成,数据域用于存放数据元素的值,指针域用于存放指针,如图9-1(a )所示。
单向链表有一个头指针Head 、一个头节点和一个尾节点^,头指针指向头节点,头节点的数据域不存储数据,头节点可以缺省,缺省头节点,头指针直接指向数据节点,如图
9-1(b )所示。
尾节点的数据域和存放最后的数据,尾节点的指针域存放的链表结束符“^”,如图9-1(c )所示。
图9-1 单向链表
2.单向链表
单向链表由头指针指向头节点,头节点指针域存放的指针,指向第1个数据节点,第1个数据节点的指针域存放的指针,指向第2个数据节点,各存储节点的指针域依次存放下一节点的地址,形成单向链表。
单向链表中的最后一个元素没有后继,因此,单向链表中最后一个节点的指针域为空“^”(或NULL ),表示单向链表终止。
单向链表的存储结构如图9-2所示。
204
图9-2 带头节点的单向链表
若单向链表中没有数据,称为空单向链表,如图9-3所示。
若不带头节点,指针直接指向第1个数据元素,如图9-4
所示。
图9-3 空单向链表 图9–4 不带头节点的单向链表 3.单向链表的节点结构
定义单向链表的节点结构,采用一种特殊的结构体——引用自身的结构体定义结构体的类型,该结构体包含两类成员,一类是数据域成员,另一类是指针域成员,指针域成员的类型就是结构体的自身类型,例如:
struct node
{
char ch ;
struct node *next ;
};
在单向链表中使用malloc()函数动态分配节点的存储空间,为了简化类型,可以为结构体类型起一个别名linklist ,用typedef 定义如下:
typedef stuct node
{
char ch ;
struct node *next ;
}linklist;
再用结构体类型声明结构体变量和结构体指针,结构体变量包括数据域和指针域,数据域存放节点的数据,指针域存放下一节点的地址。
结构体指针指向结构体变量,用结构体指针和结构体变量依次生成单向链表中的各个节点。
例如:
struct node a,b,c,*h,*p; linklist chA,*head,*rear,*q;
4.动态分配和释放内存 C 语言集成开发环境提供了动态分配内存和释放内存的函数主要有malloc 、calloc 、free 、realloc 等函数,下面只学习malloc 函数和free 函数。
(1)malloc 函数
malloc 函数的功能是向系统申请分配指定size 个字节的内存空间,如果动态分配内存成功则返回指向被分配内存的指针,否则返回空指针NULL ,该函数的头文件是#include <malloc.h>。
函数原型:void *malloc(unsigned int num_bytes);
返回类型:是 void* 类型。
void * 表示未确定类型的指针。
C 语言规定,void* 类型可以强制转换为任何其他类型的指针,因此,在该函数之前由用户指定转换的指针类型。
动态分配内存函数总是与强制类型转换的指针结合在一起,因此动态分配链表节点的一般形式为:(强制类型 *)malloc(sizeof(类型));
例如:(linklist *)malloc(sizeof(linklist));。