设为首页 加入收藏

TOP

动态分配的顺序线性表的十五种操作―C语言实现(一)
2014-11-23 19:22:20 来源: 作者: 【 】 浏览:39
Tags:动态 分配 顺序 线性 十五 操作 语言 实现
线性表
定义:是最常用的,也是最简单的数据结构,是长度为n个数据元素的有序的序列。
含有大量记录的线性表叫文件
记录:稍微复杂的线性表里,数据元素为若干个数据项组成,这时把一个数据元素叫记录
结构特点:在非空有限的条件下,存在唯一的一个表头结点,唯一的一个表尾结点,除去第一个元素之外,每个数据元素都只有一个前驱,除去最后一个元素之外,每一个数据元素都只有一个后继。
注意:线性表中的数据元素可以是各种各样的,但同一线性表中的元素必定具有相同特性(属于同一数据对象,类似数组)。线性表的数据元素间有序偶关系。
线性表的顺序表示和实现
有一组地址连续的内存单元,在这些连续的内存单元里,顺次地存储线性表里的数据元素
特点:逻辑地址和物理地址都是连续的,适合随机存取。假设&a1为线性表的基址,每个数据元素占据L个存储单位。那么表里第i个元素的存储地址:
&a(i) = &a(1) + (i - 1)x L
线性表的顺序表示结构(顺序映象)也叫顺序表,顺序表中元素的逻辑关系和物理位置一致,是一种随机存取的存储结构。
(类似高级语言里的数组,通常用数组描述数据结构的顺序存储结构)。
如果用数组表示顺序表,那很简单,也不实用,不能改变存储容量,下面是动态分配的顺序表的表示和操作
ADT.h头文件
头文件
ADTList.c文件
复制代码
1 /************************************************************************/
2 /*函数定义在此文件 */
3 /************************************************************************/
4 #include "ADT.h"
5 /************************************************************************/
6 /*第一类:初始化操作,记住各种数据结构开始使用都要初始化 */
7 /************************************************************************/
8
9 //注意c数组下标从0开始,但是用户并不知道,一般都是选择从1到length的位置,以用户的角度看问题
10
11 //1、线性表的初始化,构造一个空的线性表,因为要改变线性表,必须用指针做参数
12 int InitList(SqList *L)
13 {
14 //在堆中为线性表分配内存,初始化elem为该内存空间的首地址(基址)
15 L->elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));//结构里只是存储了表的地址值,而表本身存储在其他地方
16 //判断是否分配成功
17 if (!L->elem)//如果 !L->elem 为真(为空),执行下面代码
18 {
19 printf("线性表内存分配失败!退出程序。\n");
20 exit(1);//函数异常退出,返回给操作 系统1
21 }
22 //表内存空间分配成功
23 L->length = 0;//开始是空表,没有存储任何元素,故表长置为0
24 //当前为线性表分配的存储容量
25 L->listsize = LIST_INIT_SIZE;//初始化表的存储容量,这是当前表最大的存储量
26 return 0;//分配成功返回0
27 }
复制代码
虽然在堆开辟了一块内存空间给线性表,但是需要设置一个变量listsize,来显式的表明表的最大存储容量的数值,方便程序使用(分配的空间内存大小和表长是两回事,表长是表内当前的元素个数,也就是此时线性表当前的存储容量)
复制代码
1 /************************************************************************/
2 /*第二类:销毁操作,记住各种数据结构使用了都要有销毁的步骤 */
3 /************************************************************************/
4
5 //2、释放内存,销毁表操作,直接把内存释放的操作!类似free()和c++的delete操作符
6 //注意:用malloc函数分配的空间在释放时是连续释放的,即将物理地址相邻的若干空间全部释放
7 //所以顺序表销毁可以只释放基址,就自动释放所有空间,而链表要一个一个的把节点删除
8 void Destory(SqList *L)
9 {
10 if (L->elem)//如果当前表还存在
11 {
12 free(L->elem);//销毁之
13 //内存都没了,整个表也就不存在了,别的不用管。
14 printf("本线性表已销毁!\n");
15 }
16 }
复制代码
注意:用malloc函数分配的空间在释放时是连续释放的,即将物理地址相邻的若干空间全部释放,所以顺序表销毁可以只释放基址自动释放所有空间,而链表要一个一个的把节点删除
复制代码
1 /************************************************************************/
2 /* 第三类:引用型操作,操作不改变线性表里的数据元素,也不改变他们之间的关系
3 /************************************************************************/
4
5 //3、判空操作
6 void ListEmpty(SqList L)
7 {
8 //判断表是否存在
9 if (L.elem)
10 {
11 //判断是否存储了内容
12 if (0 == L.length)
13 {
14 puts("本表为空!");//自动换行
15 }
16 else
17 {
18 puts("表不为空!");
19 }
20 }
21 else
22 {
23 puts("表不存在!");
24 }
25 }
复制代码
0 == L.length,个人喜欢这种写法,避免出错,如果一时疏忽,写=,则编
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C开发者眼中的SICP学习 下一篇Objective-C KVC 自动转换类型研究

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: