数据结构C语言版 线性表的动态分配顺序存储结构表示和实现文库

合集下载

清华严蔚敏《数据结构》的的全部代码实现C语言.doc

清华严蔚敏《数据结构》的的全部代码实现C语言.doc

/* c1.h (程序名 ) */#include <string.h>#include <ctype.h>#include <malloc .h> /* malloc() 等 */#include <limits.h> /* INT _MAX 等 */#include <stdio.h> /* EOF(=^Z 或 F6),NULL */#include <stdlib.h> /* atoi() */#include <io.h> /* eof() */#include <math.h> /* floor(),ceil(),abs() */#include <process.h> /* exit() *//* 函数结果状态代码*/#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1/* #define OVERFLOW -2因为在math.h中已定义OVERFLOW的值为3,故去掉此行*/ typedef int Status; /* Status 是函数的类型 ,其值是函数结果状态代码,如OK 等 */typedef int Boolean ; /* Boolean 是布尔类型 ,其值是 TRUE 或 FALSE *//* algo2-1.c 实现算法 2.1 的程序*/#include"c1.h"typedef int ElemType ;#include"c2-1.h"/*c2-1.h线性表的动态分配顺序存储结构*/#define LIST_INIT_SIZE10 /*线性表存储空间的初始分配量*/#define LISTINCREMENT 2/* 线性表存储空间的分配增量*/typedef struct{ElemType *elem ; /* 存储空间基址*/int length; /*当前长度*/int listsize; /* 当前分配的存储容量(以 sizeof(ElemType )为单位 ) */}SqList;#include "bo2-1.c"/* bo2-1.c顺序表示的线性表(存储结构由c2-1.h 定义 )的基本操作 (12 个) */ Status InitList (SqList *L ) /* 算法 2.3 */{ /* 操作结果:构造一个空的顺序线性表*/(*L ).elem=(ElemType*) malloc ( LIST_INIT_SIZE * sizeof(ElemType));if (!( *L ).elem)exit (OVERFLOW); /* 存储分配失败*/(*L ).length=0; /*空表长度为0 */(*L ).listsize =LIST_INIT_SIZE ; /*初始存储容量*/return OK;}Status DestroyList (SqList *L ){ /* 初始条件:顺序线性表L 已存在。

数据结构(c语言版).

数据结构(c语言版).

严蔚敏 清华大学 谭浩强 清华大学 徐孝凯 电子工业 张基温 电子工业 庞丽萍 华中科技大学
数据库基础与应用 王 利 中央电大
ISBN 7-5084-1648-1 / TP. 706 网页制作实例教程 齐建玲 中国水利水电 …


… 返回
【例1-2】磁盘目录结构和文件管理系统
root bin math ds sw lib user zhao jiang shao li etc
四类数据基本结构的示意图:
(a)集合结构
(b)线性结构
(c)树型结构
(d)图形结构
由以上例子可见,描述这类非数值计算问题的数学模型和
方法不再是数学方程,而是诸如线性表、树和图之类的数据
结构。
数据结构示例 【例1-1】图书目录表
由于表中每条记录(表示每一本书)的登录号各不相同,
所以可用登录号来唯一地标识每条记录(一本图书)。在计
5.什么是存储结构?主要有哪些主要的存储结构?
数据的存储结构:数据的存储方式.反映数据在计算 机内部的存储形式,是逻辑结构在计算机中的实现 方法. 数据既可以顺序存储在内存中如数组存储,也可以 离散存储在内存中(动态内存分配,指针管理). 如线性结构举例. 数据的常用存储结构:顺序存储结构和链式存储结 构. 以及散列、索引结构.
数据结构:非数值计算的程序设计问题中数据元素 以及它们之间的关系和操作的总称. 程序设计中数据是必须的,但是否应用数据结构则 并不是必需的.
4.数据结构的抽象和一般对象的抽象其主要不同 点是什么?
对象的抽象:与需求密切相关. 如:身份证管理侧重于人的籍贯,出生年月和 身份证号和住址. 而学籍管理关心的学生 的学号,姓名和成绩单. 数据结构的抽象:与需求一般是无关的.只是与管 理和访问数据的方式有关.任意类型的数据都可 以采用统一的接口来操作.

《数据结构与算法(C++语言版)》第2章 线性表

《数据结构与算法(C++语言版)》第2章 线性表
• 以下是一个使用类LinearList的C++程序,它假定之前的程 序均存储在LinearList.h之中,且异常类定义位于文件 exception.h之中。该示例完成以下操作:创建一个大小为5 的整数线性表L;输出该表的长度(为0);在第0个元素之 后插入2;在第一个元素之后插入6和8(至此,线性表为2, 6,8);寻找并输出第一个元素(为2);输出当前表的长 度(为3);删除并输出第一个元素。
数据结构与算法 (C++语言版)
第2章 线性表
线性表的类型定义
• 基本概念 • 线性表是由n(n≥0)个类型相同的数据元素组成的有限序 列,通常表示为L=(a1, …, ai–1, ai, ai+1, …, an)。其中,L为线 性表名称,ai为组成该线性表的数据元素,ai–1领先于ai,ai 领先于ai+1,称ai–1是ai的直接前驱元素,ai+1是ai的直接后继 元素。当i=1, 2, …, n–1时,ai有且仅有一个直接后继;当 i=2, 3, …, n时,ai有且仅有一个直接前驱。 • 线性表的长度就是线性表中元素的个数n(n≥0)。当n=0时, 称为空表。在非空表中的每个数据元素都有一个确定的位 置,如a1是第一个数据元素,an是最后一个数据元素,ai是 第i个数据元素。称i为数据元素ai在线性表中的位序。
线性表的类型定义
Prev_Elem(L, cur_e, &pre_e) //返回当前元素的前一个元素值 输入:线性表L。 输出:若cur_e是线性表L的数据元素,且不是第一个,则用 pre_e返回它的直接前驱元 素;否则操作失败,pre_e无定义。 Next_Elem(L, cur_e, &next_e) //返回当前元素的后一个元素值 输入:线性表L。 输出:若cur_e是线性表L的数据元素,且不是最后一个,则用 next_e返回它的直接后继元素;否则操作失败,next_e无定 义。

动态分配的顺序线性表的十五种操作—C语言实现

动态分配的顺序线性表的十五种操作—C语言实现

动态分配的顺序线性表的⼗五种操作—C语⾔实现线性表定义:是最常⽤的,也是最简单的数据结构,是长度为n个数据元素的有序的序列。

含有⼤量记录的线性表叫⽂件记录:稍微复杂的线性表⾥,数据元素为若⼲个数据项组成,这时把⼀个数据元素叫记录结构特点:在⾮空有限的条件下,存在唯⼀的⼀个表头结点,唯⼀的⼀个表尾结点,除去第⼀个元素之外,每个数据元素都只有⼀个前驱,除去最后⼀个元素之外,每⼀个数据元素都只有⼀个后继。

注意:线性表中的数据元素可以是各种各样的,但同⼀线性表中的元素必定具有相同特性(属于同⼀数据对象,类似数组)。

线性表的数据元素间有序偶关系。

线性表的顺序表⽰和实现有⼀组地址连续的内存单元,在这些连续的内存单元⾥,顺次地存储线性表⾥的数据元素特点:逻辑地址和物理地址都是连续的,适合随机存取。

假设&a1为线性表的基址,每个数据元素占据L个存储单位。

那么表⾥第i个元素的存储地址:&a(i) = &a(1) + (i - 1)x L线性表的顺序表⽰结构(顺序映象)也叫顺序表,顺序表中元素的逻辑关系和物理位置⼀致,是⼀种随机存取的存储结构。

(类似⾼级语⾔⾥的数组,通常⽤数组描述数据结构的顺序存储结构)。

如果⽤数组表⽰顺序表,那很简单,也不实⽤,不能改变存储容量,下⾯是动态分配的顺序表的表⽰和操作ADT.h头⽂件1/************************************************************************/2/* 功能:声明常量和函数原型的头⽂件,线性表的动态分配顺序存储结构3/* 作者:dashuai4/************************************************************************/5 #include <stdio.h>6 #include <stdlib.h>7#define LIST_INIT_SIZE 100//线性表初始化存储空间分配8#define LISTINCREMENT 10//线性表存储空间的分配增量910 typedef struct{//此时可以省去结构标记11int *elem;//线性表基址12int length;//当前表长13int listsize;//当前为线性表分配的存储容量14 } SqList;//为结构起的别名SqList1516//线性表常⽤的有13个操作,归为4类1718/************************************************************************/19/*第⼀类:初始化操作,记住各种数据结构开始使⽤都要初始化 */20/************************************************************************/2122//1、线性表的初始化,构造⼀个空的线性表23int InitList(SqList *L);//因为要改变线性表,必须⽤指针做参数2425/************************************************************************/26/*第⼆类:销毁操作,记住各种数据结构使⽤了都要有销毁的步骤 */27/************************************************************************/2829//2、销毁,释放内存操作30void Destory(SqList *L);//直接把内存释放的操作!类似与free()3132/************************************************************************/33/* 第三类:引⽤型操作,操作不改变线性表⾥的数据元素,也不改变他们之间的关系*/34/************************************************************************/3536//3、判空操作,若线性表已经存在,为空⽩则返回true,否则返回false37void ListEmpty(SqList L);3839//4、求长度操作,若线性表已经存在,则返回表L中元素个数40int ListLength(SqList L);4142//5、定位操作:线性表 L 已存在,返回 L 中第 1 个与 e 满⾜相等关系的元素的位序。

C语言数据结构线性表教程示例详解

C语言数据结构线性表教程示例详解

C语⾔数据结构线性表教程⽰例详解⽬录线性表顺序表线性表数据结构⾥我们时常看到什么什么表,线性表是最基本、最简单、也是最常⽤的⼀种数据结构,其他各种表的万恶之源就是这个线性表,他是个啥其实顾名思义:⼀个线性表是n个具有相同特性的数据元素的有限序列。

数据元素之间的关系是⼀对⼀的关系,即除了第⼀个和最后⼀个数据元素之外,其它数据元素都是⾸尾相接的(注意,这句话只适⽤⼤部分线性表,⽽不是全部。

⽐如,循环链表逻辑层次上也是⼀种线性表(存储层次上属于链式存储,但是把最后⼀个数据元素的尾指针指向了⾸位结点)。

说的这么复杂其实就是下⾯这个模型,线性表的逻辑结构简单,便于实现和操作。

因此,线性表这种数据结构在实际应⽤中是⼴泛采⽤的⼀种数据结构。

⽽我们说的线性是指他的连续性,并⾮是内存上连续,⽽是逻辑上连续,什么⼜是逻辑上连续?我们说数据结构有两种结构,⼀是物理结构即在内存中怎么存,⼆是逻辑结构是我们假想的。

物理结构其实⾮数组即链表,基本都逃不开这俩,但数组有个致命的缺陷就是不知道咱要存多少,我开辟10个空间,若想存第11个就是放屁,那直接给他1000个空间呢?那剩下989个空间直接浪费掉,⼀句话就是他不能按需所取。

这时链表就应运⽽⽣,我们有⼏个数据就开辟⼏个空间,众所周知数组我们得到⾸元素地址,直接遍历就能得到全部成员,那它怎么去串联这些独⽴零散的空间来建⽴联系?我们按需所取⾸先就会选择去堆区申请空间,去堆区不是⼀定是最好,因为malloc 函数嘛,满⾜要就拿不要就释放。

我们对数据寻踪觅迹是通过其对应的地址对吧,不难想到应⽤指针吧,这样那我们就可以“有备⽽来”,在开辟数据空间时多开辟4到8个字节来存放指针,最后⼀个数据我们不需要指针了,直接放⼀个空指针就⾏。

顺序表线性表主要由顺序表⽰或链式表⽰。

在实际应⽤中,常以栈、队列、字符串等特殊形式使⽤。

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指⽤⼀组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采⽤顺序存储结构的线性表通常称为顺序表。

数据结构(C语言版)

数据结构(C语言版)

比较
Prim算法适用于稠密图, Kruskal算法适用于稀疏图;
两者时间复杂度相近,但 Kruskal算法需额外处理并查
集数据结构。
最短路径算法设计思想及实现方法比较
1 2
Dijkstra算法
从源点出发,每次找到距离源点最近的顶点并更 新距离值,直至所有顶点距离确定。适用于不含 负权边的图。
Floyd算法
特殊二叉树
满二叉树、完全二叉树等。
二叉树的遍历与线索化
二叉树的遍历
前序遍历、中序遍历、后序遍历和层 次遍历是二叉树的四种基本遍历方法 。
线索化二叉树
为了方便查找二叉树节点的前驱和后 继,可以对二叉树进行线索化处理, 即在节点的空指针域中存放指向前驱 或后继的指针。
树和森林的遍历与转换
树的遍历
01
串的顺序存储结构
01
02
03
串的顺序存储结构是用 一组地址连续的存储单 元来存储串中的字符序
列的。
按照预定义的大小,为 每个定义的串变量分配 一个固定长度的存储区 ,一般是用定长数组来
定义。
串值的存储:将实际串 长度值保存在数组的0下 标位置,串的字符序列 依次存放在从1开始的数
组元素中。
串的链式存储结构
03
比较
DFS空间复杂度较低,适用于递 归实现;BFS可找到最短路径, 适用于非递归实现。
最小生成树算法设计思想及实现方法比较
Prim算法
从某一顶点开始,每次选择当 前生成树与外界最近的边加入 生成树中,直至所有顶点加入

Kruskal算法
按边权值从小到大排序,依次 选择边加入生成树中,保证不
形成环路。
数据结构(C语言版)

数据结构C语言版 线性表的单链表存储结构表示和实现

数据结构C语言版 线性表的单链表存储结构表示和实现

#include 〈stdio.h>#include <malloc。

h>#include 〈stdlib.h>/*数据结构C语言版线性表的单链表存储结构表示和实现P28—31编译环境:Dev-C++ 4。

9。

9。

2日期:2011年2月10日*/typedef int ElemType;// 线性表的单链表存储结构typedef struct LNode{ElemType data; //数据域struct LNode *next;//指针域}LNode, *LinkList;// typedef struct LNode *LinkList;// 另一种定义LinkList的方法// 构造一个空的线性表Lint InitList(LinkList *L){/*产生头结点L,并使L指向此头结点,头节点的数据域为空,不放数据的。

void *malloc(size_t)这里对返回值进行强制类型转换了,返回值是指向空类型的指针类型.*/(*L)= (LinkList)malloc(sizeof(struct LNode) );if( !(*L))exit(0);// 存储分配失败(*L)-〉next = NULL;// 指针域为空return 1;}// 销毁线性表L,将包括头结点在内的所有元素释放其存储空间。

int DestroyList(LinkList *L){LinkList q;// 由于单链表的每一个元素是单独分配的,所以要一个一个的进行释放while(*L ){q = (*L)—〉next;free(*L );//释放*L = q;}return 1;}/*将L重置为空表,即将链表中除头结点外的所有元素释放其存储空间,但是将头结点指针域置空,这和销毁有区别哦。

不改变L,所以不需要用指针。

*/int ClearList( LinkList L ){LinkList p,q;p = L—〉next;// p指向第一个结点while( p ) // 没到表尾则继续循环{q = p—>next;free( p );//释放空间p = q;}L—>next = NULL; // 头结点指针域为空,链表成了一个空表return 1;}// 若L为空表(根据头结点L—〉next来判断,为空则是空表),则返回1,// 否则返回0.int ListEmpty(LinkList L){if(L—>next ) // 非空return 0;elsereturn 1;}// 返回L中数据元素个数。

C语言实现顺序表的基本操作(从键盘输入生成线性表,读txt文件生成线性表和数组生成线性表-。。。

C语言实现顺序表的基本操作(从键盘输入生成线性表,读txt文件生成线性表和数组生成线性表-。。。

C语⾔实现顺序表的基本操作(从键盘输⼊⽣成线性表,读txt⽂件⽣成线性表和数组⽣成线性表-。

经过三天的时间终于把顺序表的操作实现搞定了。

(主要是在测试部分停留了太长时间)1. 线性表顺序存储的概念:指的是在内存中⽤⼀段地址连续的存储单元依次存储线性表中的元素。

2. 采⽤的实现⽅式:⼀段地址连续的存储单元可以⽤固定数组或者动态存储结构来实现,这⾥采⽤动态分配存储结构。

3. 顺序表结构体⽰意图三种写法完整代码:第⼀种写法. 从键盘输⼊⽣成线性表--完整代码如下,取值操作实际上就是删除操作的部分实现,这⾥就不写了#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define TRUE 1#define FALSE 0typedef int Status;typedef int ElemType;typedef struct SqList{ElemType *elem;int length;int listsize;}SqList;Status InitList(SqList &L){L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));if (!L.elem){printf("ERROR\n");return ERROR;}L.length = 0;L.listsize = LIST_INIT_SIZE;return OK;}Status ListEmpty(SqList L) //判空{if (L.length = 0) return TRUE;else return FALSE;}Status ListInsert(SqList &L, int i, ElemType e) //插⼊{ElemType *p, *q;ElemType *newbase;int j;if (i < 1 || i > L.length + 1) return ERROR;if (L.length >= L.listsize){newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));if (newbase == NULL){printf("realloc failed!\n");return ERROR;//exit(-1);}L.elem = newbase;L.listsize += LISTINCREMENT;}p = L.elem+i-1;for( q = L.elem + L.length - 1; q>= p; --q ){*(q+1) = *q;}*p = e;++L.length;return OK;}Status CrtList(SqList &L) // 从键盘输⼊数据⽣成线性表{printf("输⼊整数,以0结束:\n");ElemType e;int i = 1;scanf("%d", &e);while (e != 0){if (!ListInsert(L, i, e)) return ERROR;i++;scanf("%d", &e);}return OK;}Status CrtList2(SqList &L, ElemType d[], int n) // 从数组⽣成线性表{int i;for (i = 0; i < n; ++i){if (!ListInsert(L, i + 1, d[i])) return ERROR;}return OK;}Status ListDelet(SqList &L, int i, ElemType &e) //删除{if ((i<1) || (i>L.length)) return ERROR;ElemType *p, *q;p = &(L.elem[i - 1]);e = *p;q = L.elem + L.length - 1;for (++p; p <= q; ++p) *(p - 1) = *(p);--L.length;return OK;}Status GetElem(SqList &L, int i, ElemType &e) //取值{if ((i <= 0) || (i>L.length)) return ERROR;else{e = L.elem[i - 1];return OK;}}Status compare(ElemType a, ElemType b) //⽐较{if (a == b) return TRUE;else return FALSE;}int LocateElem(SqList L, ElemType e) //定位{Status compare(ElemType a, ElemType b);int i;for (i = 0; i<L.length; i++){if (compare(L.elem[i], e))return ++i;}if (i == L.length) return0;}Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e) //求直接前驱{int LocateElem(SqList L, ElemType e);int i = LocateElem(L, cur_e);if ((i == 0) || (i == 1)) return ERROR;pre_e = L.elem[i - 2];return OK;}int ListLength(SqList L) //求长度{int length = L.length;return length;}void MergeList(SqList La, SqList Lb, SqList &Lc) //归并{Lc.length = La.length + Lb.length;Lc.listsize = Lc.length;Lc.elem = (ElemType*)malloc(Lc.length*sizeof(ElemType));if (Lc.elem == NULL) exit(OVERFLOW);int i, j, k;for (i = 0, j = 0, k = 0; (i<La.length) && (j<Lb.length); k++){if (La.elem[i]<Lb.elem[j]){Lc.elem[k] = La.elem[i];i++;}else{Lc.elem[k] = La.elem[j];j++;}}while (i<La.length){Lc.elem[k] = La.elem[i];i++;k++;}while (j<Lb.length){Lc.elem[k] = Lb.elem[j];j++;k++;}}void vist(ElemType e){printf("%d ", e);}Status ListTraverse(SqList L) //遍历{int i;if (L.length == 0) printf("⽆元素");for (i = 0; i<L.length; i++){vist(L.elem[i]);}if (i == L.length){printf("\n");return OK;}else return ERROR;}Status ListClear(SqList L) //清空{if (L.elem == NULL) return ERROR;int i;for (i = 0; i<L.length; i++) L.elem[i] = 0;L.length = 0;return OK;}Status DestroyList(SqList &L) //销毁{if (L.elem == NULL) return ERROR;free(L.elem);L.length = 0;L.listsize = 0;return OK;}void PrnList(SqList L) //打印{int i;for (i = 0; i < L.length; ++i){printf("%5d", L.elem[i]);}printf("\n");}int main(){int j, l;ElemType e, e1;SqList La;if (InitList(La)) printf("OK\n");else exit(INFEASIBLE);CrtList(La);PrnList(La);int k;printf("1:判空\n2:插⼊\n3:删除\n4:定位\n5:求长度\n6:直接前驱\n");printf("7:归并\n8:遍历\n9:清空\n10:销毁\n\n0:退出\n");scanf("%d", &k);while (k != 0){switch (k){case1:if (ListEmpty(La)) printf("empty\n");else printf("non-empty\n");break;case2:printf("在第⼏个位置插⼊何数:");scanf("%d%d", &j, &e);if (ListInsert(La, j, e)) printf("OK\n");else printf("ERROR\n");break;case3:printf("删除第⼏个数:");scanf("%d", &j);if (ListDelet(La, j, e))PrnList(La);printf("删除数为:%d\n", e);break;case4:printf("定位数字:");scanf("%d", &e);if (LocateElem(La, e) != 0) printf("OK,位序为:%d\n", LocateElem(La, e));else printf("ERROR\n");break;case5:l = ListLength(La);printf("ListLength=%d\n", l);break;case6:printf("寻找何数直接前驱:");scanf("%d", &e);if (PriorElem(La, e, e1)) printf("前驱为:%d\n", e1);else printf("ERROR\n");break;case7:SqList Lb, Lc;if (InitList(Lb)) printf("OK\n");else printf("ERROR\n");CrtList(Lb);MergeList(La, Lb, Lc);printf("有序归并后:\n");PrnList(Lc);break;case8:if (ListTraverse(La)) printf("遍历成功\n");else printf("遍历失败\n");break;case9:if (ListClear(La)) printf("清空成功\n");else printf("清空失败\n");break;case10:if (DestroyList(La)) printf("销毁完成\n");else printf("销毁失败\n");return0;default:printf("ERROR\n");}scanf("%d", &k);}return0;}View Code第⼆种写法. 从txt⽂件读⼊⽣成线性表--完整代码如下:#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -1#define TRUE 1#define FALSE 0#define INIT_LIST_SIZE 100#define LISTINCREMENT 10typedef int Status;typedef int ElemType;typedef struct{ElemType *elem;int length;int listsize;}SqList;Status InitList(SqList *L){L->elem = (ElemType*)malloc(INIT_LIST_SIZE*sizeof(ElemType));if (!L->elem) exit(OVERFLOW);L->length = 0;L->listsize = INIT_LIST_SIZE;return OK;}Status ListEmpty(SqList L) //判空{if (L.length = 0) return TRUE;else return FALSE;}Status ListInsert(SqList *L, int i, ElemType e) //插⼊{ElemType *newbase, *q, *p;if (i<1 || i>L->length + 1) return ERROR;if (L->length>L->listsize){newbase = (ElemType*)realloc(L->elem, (L->listsize + LISTINCREMENT)*sizeof(ElemType));if (!newbase) exit(OVERFLOW);L->elem = newbase;L->listsize += LISTINCREMENT;}q = L->elem + i - 1; //q为插⼊位置for (p = L->elem + L->length - 1; p >= q; p--){*(p + 1) = *p;}*q = e;++L->length;return OK;}Status ListDelete(SqList *L, int i, ElemType * e) //删除{ElemType * p, *q;if (i<1 || i>L->length) return ERROR;p = L->elem + i - 1; //p为被删除元素位置*e = *p; //被删除元素的值赋值给eq = L->elem + L->length - 1; //表尾元素位置for (++p; p <= q; ++p){*(p - 1) = *p;}L->length--;return OK;}Status GetElem(SqList *L, int i, ElemType * e) //取值{if (i<1 || i>L->length) return ERROR;*e = *(L->elem + i - 1); //获取第i个元素的地址return OK;}int LocateElem(SqList L, ElemType e) //定位{int i;for (i = 0; i<L.length; i++){if (L.elem[i]==e)return ++i;}if (i == L.length) return0;}Status PriorElem(SqList L, ElemType e, ElemType &pre_e) //求直接前驱{int LocateElem(SqList L, ElemType e);int i = LocateElem(L, e);if ((i == 0) || (i == 1)) return ERROR;pre_e = L.elem[i - 2];return OK;}Status GetLength(SqList *L) //求长度{return L->length;}void PrnList(SqList *L) //遍历{int i;for (i = 0; i<(*L).length; i++){if (i == 0)printf("(");printf(" %d ", L->elem[i]);if (i == (*L).length - 1)printf(")\n");}}Status ClearList(SqList *L) //清空{L->length = 0;return OK;}Status Destroy(SqList *L) //销毁{free(L->elem);L->elem = NULL;L->length = 0;L->listsize = 0;return OK;}int main(){int n = 0, rc;int a, i;int e, e1;SqList L;if (InitList(&L)) printf("OK\n");FILE *fp = fopen("D:/1.txt", "r");if (fp == NULL){printf("打开⽂件失败");}printf("从1.txt⽂件读⼊⼏个数:");scanf("%d", &n);for (i = 0; i< n; i++){fscanf(fp, "%d", &a);ListInsert(&L, i+1, a);}fclose(fp);PrnList(&L);char k;printf("\n1.插⼊\n2.删除\n3.取值\n4.定位\n5.直接前驱\n6.求长度\n7.遍历\n8.清空\n9.销毁\n"); while (1){k = getchar();switch (k){case'1':printf("在第⼏个位置插⼊何数:");scanf("%d%d", &i, &e);if (ListInsert(&L, i, e))printf("i=%d,e=%d 已经插⼊\n", i, e);else printf("插⼊失败\n");break;case'2':printf("删除第⼏个数:\n");scanf("%d", &i);if (ListDelete(&L, i, &e))printf("i=%d,e=%d 已经删除\n", i, e);else printf("删除失败\n");break;case'3':printf("取第⼏个数:\n");scanf("%d", &i);if (GetElem(&L, i, &e))printf("第i=%d号,e=%d 被取出!\n", i, e);else printf("取值失败\n");break;case'4':printf("定位数字:");scanf("%d", &e);if (LocateElem(L, e) != 0) printf("OK,位序为:%d\n", LocateElem(L, e));else printf("ERROR\n");break;case'5':printf("寻找何数直接前驱:");scanf("%d", &e);if (PriorElem(L, e, e1)) printf("前驱为:%d\n", e1);else printf("ERROR\n");break;case'6':printf("表长为%d\n", GetLength(&L));break;case'7':printf("遍历:\n");PrnList(&L);break;case'8':if (ClearList(&L)) printf("清空成功\n");else printf("清空失败\n");break;case'9':printf("销毁\n");Destroy(&L);printf("销毁成功\n");exit(0);return0;}}return0;}View Code第三种写法:读数组⽣成线性表--完整代码如下:#include<stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -1#define TRUE 1#define FALSE 0#define INIT_LIST_SIZE 100#define LISTINCREMENT 10typedef int Status;typedef int ElemType;typedef struct{ElemType *elem;int length;int listsize;}Sqlist;Status InitList(Sqlist *L){L->elem = (ElemType *)malloc(INIT_LIST_SIZE *sizeof(ElemType));if (!L->elem)exit(OVERFLOW);L->length = 0;L->listsize = INIT_LIST_SIZE;return OK;}Status ListEmpty(Sqlist L){if (L.length = 0)return ERROR;else return FALSE;}Status ListInsert(Sqlist *L, int i, ElemType e){ElemType *newbase, *p, *q;if (i<1 || i>L->length + 1)return ERROR;if (L->length > L->listsize){newbase = (ElemType *)realloc(L, (L->listsize + LISTINCREMENT)*sizeof(ElemType));if (!newbase)exit(OVERFLOW);L->elem = newbase;L->listsize += LISTINCREMENT;}p = L->elem + i - 1;for (q = L->elem + L->length - 1; q >= p; q--){*(q + 1) = *q;}*p = e;L->length++;return OK;}Status CreateList(Sqlist *L, ElemType element[], int n) // 从数组⽣成线性表{int i;for (i = 0; i < n; ++i){if (!ListInsert(L, i + 1, element[i])) return ERROR;}return OK;}Status ListDelete(Sqlist *L, int i, ElemType *e){ElemType *p, *q;if (i<1 || i>L->length)return ERROR;p = L->elem + i - 1;q = L->elem + L->length - 1;*e = *p;for (p++; q >= p; p++){*(p - 1) = *p;}L->length--;return OK;}Status GetElem(Sqlist *L, int i, ElemType *e){if (i<1 || i>L->length)return ERROR;return OK;}int LocateElem(Sqlist L, ElemType e){int i;for (i = 0; i < L.length; i++)if (L.elem[i] == e)return i + 1;}Status PriorElem(Sqlist L, ElemType e, ElemType &pr_e){int LocateElem(Sqlist L, ElemType e);int i = LocateElem(L, e);if (i<1 || i>L.length)return ERROR;pr_e = L.elem[i - 2];return OK;}Status GetLength(Sqlist *L){return L->length;}void PrnList(Sqlist *L){int i;for (i = 0; i < L->length; i++)printf("%d ", L->elem[i]);printf("\n");}Status ClearList(Sqlist *L){L->length = 0;return OK;}Status Destroy(Sqlist *L){free(L->elem);L->elem = NULL;L->length = 0;L->listsize = 0;return OK;}int main(){int i;int a, n = 0;int e, e1;Sqlist L;ElemType element[] = { 15, 3, 59, 27, 8, 11, 32 };if (InitList(&L))printf("OK\n");CreateList(&L, element, 7);PrnList(&L);char k;printf("\n1.插⼊\n2.删除\n3.取值\n4.定位\n5.直接前驱\n6.求长度\n7.遍历\n8.清空\n9.销毁\n"); while (1){k = getchar();switch (k){case'1':printf("在第⼏个位置插⼊何数:");scanf("%d%d", &i, &e);if (ListInsert(&L, i, e))printf("i=%d e=%d已经插⼊\n", i, e);break;case'2':printf("删除第⼏个数:");scanf("%d", &i);if (ListDelete(&L, i, &e))printf("i=%d e=%d已经删除\n", i, e);break;case'3':printf("取第⼏个数:");scanf("%d", &i);if (GetElem(&L, i, &e))printf("第i=%d e=%d已经取出\n", i, e);break;case'4':printf("定位何数:");scanf("%d", &e);if (LocateElem(L, e))printf("位序为:%d\n", LocateElem(L, e));break;case'5':printf("寻找何数的直接前驱:");scanf("%d", &e);if (PriorElem(L, e, e1))printf("前驱为:%d\n", e1);break;case'6':printf("表长为:%d\n", GetLength(&L));break;case'7':printf("遍历:\n");PrnList(&L);break;case'8':if (ClearList(&L))printf("清空成功!\n");break;case'9':if (Destroy(&L))printf("销毁成功!\n");exit(0);return0;}}return0;}View Code看懂了左⼿给你个栗⼦,给我关注点赞;看不懂右⼿给你个锤⼦,砸开脑壳看看有没有带脑⼦。

C语言:2.2 线性表及其顺序存储结构

C语言:2.2 线性表及其顺序存储结构
(a1, a2,...,ai ,...,an )
线性表中数据元素的个数n称为线性表的长度
2.线性表的顺序存储结构
2.2.1 线性表及其运算
… a1 a2 … ai-1 ai … an …
第1个元素的存储地址,即线性表的起始地 址,称作线性表的基地址
每个数据元素所占的
线性表的顺序存储结构具有的特点: 存储空间(子节数) (1)所有元素所占的存储空间是连续的 (2)各元素在存储空间中是按逻辑顺序
v[i-1]=b;
//插入新元素
n=n+1;
//线性表长度增加1
return;
}
4.线性表在顺序存储结构下的删除运算 2.2.1 线性表及其运算
例2 删除线性表(21,18,30,75,66,42,56,87) 的第5个元素。
V(1:10) 21 18 30 75 4626 4526 5867 87
2. 线性表:允许在任意位置进行插入、删除运算 栈:只允许在一端进行插入、删除运算的线性表, 具有先进后出、后进先出的特点 队列:只允许在队尾插入,在排头进行删除 运算的线性表,具有先进先出的特点
3.由线性表在顺序存储结构下的插入与删除运算效 率比较低,这种存储方式对于大线性表或元素经常 需要变动的线性表不太合适.
S(1:10)
1.什么是队列
2.2.3 队列栈及其应用
队列(Queue)是指允许在一端进行插入,而在 另一端进行删除的线性表。
出队
ABCDE F
入队
排头指针 front
队尾指针 rear
2.队列的应用
输入输出缓冲区的结构








线性表的顺序表示和实现实验报告

线性表的顺序表示和实现实验报告

数学与计算科学学院实验报告实验项目名称线性表的顺序表示和实现所属课程名称数据结构A实验类型验证型实验日期2014年10月8日班级学号姓名成绩undeclared identifier is reported only once for each function it appears in.)| C:\Documents and Settings\Administrator\桌面\zxp\数据结构1.cpp||In function `Status ListInsert_Sq(SqList&, int, ElemType)':|C:\Documents and Settings\Administrator\桌面\zxp\数据结构1.cpp|39|error: `newbase' undeclared (first use this function)|C:\Documents and Settings\Administrator\桌面\zxp\数据结构 1.cpp||In function `int main()':|C:\Documents and Settings\Administrator\桌面\zxp\数据结构 1.cpp|67|error: `Initlist_Sq' undeclared (first use this function)|||=== Build finished: 4 errors, 0 warnings (0 minutes, 0 seconds) ===|(4).调试程序。

第一个和第二个错误都是由于粗心,将LIST_INIT_SIZE写成了LIST_INTI_SIZE;第三个错误newbase这个变量没有定义,应定义为ElemType *newbase;第四个错误是Initlist_Sq中L错将大写写成了小写字母。

将这些错误都改正过来后,编译通过了(5).验证程序。

用C语言定义线性表的顺序存储结构

用C语言定义线性表的顺序存储结构

用C语言定义线性表的顺序存储结构线性表顺序存储的表示:线性表的顺序存储结构可以借助于高级程序设计语言中的一维数组来表示,一维数组的下标与元素在线性表中的序号相对应。

线性表的顺序存储结构可用C语言定义如下:#define MAXSIZE /*线性表可能达到的最大长度;*/ typedef struct{ElemType elem[MAXSIZE];/* 线性表占用的数组空间。

*/ int last;/*记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为-1*/} SeqList;说明:(1)结点类型定义中ElemType数据类型是为了描述的统一而自定的,在实际应用中,用户可以根据自己实际需要来具体定义顺序表中元素的数据类型,如int、char、float或是一种struct结构类型。

(2)从数组中起始下标为0处开始存放线性表中第一个元素。

因此需要注意区分元素的序号和该元素在数组中的下标之间的对应关系,即数据元素a1在线性表中的序号为1,其对应的elem数组的下标为0;ai在线性表中的序号为i,其对应的elem数组的下标为i-1。

利用定义的顺序表的数据类型SeqList就可以定义变量了。

变量L的定义与使用方法有两种:(1)通过变量定义语句:SeqList L将L定义为SeqList类型的变量,可通过L.elem[i-1]来访问顺序表中序号为i的元素a i;通过st 可得到顺序表中最后一个元素的下标,而st+1就是顺序表的长度。

(2)通过指针变量定义语句:SeqList *L将L定义为指向SeqList类型的指针变量,使用时,可通过L->elem[i-1]来访问顺序表中序号为i的元素a i,通过L->last+1可得到顺序表的长度。

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。

这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

数据结构(C语言版) 线性表 详细举例介绍

数据结构(C语言版) 线性表 详细举例介绍
// La中不存在和 e 相同的数据元素,则插入之
}
} // union
O(ListLength2(Lb))
算法2.1’’
试改变结构, 选用有序表表示集合。
有序表: 其数据元素依值从小 到大(非递减)有序排列的 线性表。
例如: (2,3,3,5,6,6,6,8,12)
void purge(List &La, List Lb) {
(求数据元素的后继)
初始条件: 线性表L已存在。
若cur_e是L的元素,但不是 操作结果:
最后一个,则用next_e返回它 的后继,否则操作失败, next_e无定义。
GetElem( L, i, &e ) (求线性表中某个数据元素)
线性表L已存在, 初始条件: 且 1≤i≤LengthList(L)
算法2.1’’
InitList(LA); La_len = ListLength(La); Lb_len =ListLength(Lb); // 求线性表的长度
for (i = 1; i <= Lb_len; i++) { GetElem(Lb, i, e);
// 取Lb中第i个数据元素赋给e
if (ListEmpty(La) || !equal (en, e)) { ListInsert(La, ++La_len, e); 算法2.1’ en = e;
} // La中不存在和 e 相同的数据元素,则插入之
}
}
O(ListLength(Lb))
例2-2 (教材P.20)
归并两个“其数据元素按值非递减有 序排列”的线性表 LA 和 LB,求得线性 表 LC 也具有同样特性。

数据结构c语言版(题目)

数据结构c语言版(题目)

分类:编程思想和算法2012-09-15 22:24 1759 人阅读评论(0)收藏举报如果TCPhashlistJuli 采用线性表的顺序存储结构,则可以随机存取表中任一终端,但插入和删除终端时,需要移动大量元素,巧妙地终端离线不进行删除操作。

数组,存储的元素应该是线性表顺序存储结构的数据结构。

线性表题目类型:线性表在顺序结构上各种操作的实现;线性链表的各种操作;两个或多个线性表的各种操作;循环链表和双向链表;稀疏多项式及其运算在线性表的两种存储结构上的实现。

线性表在顺序结构上各种操作的实现题目1:(线性表顺序存储结构上的操作—Delete )从顺序存储结构的线性表a 中删除第i个元素起的k个元素。

(《数据结构题集C语言版》P16)题目2:(线性表顺序存储结构上的操作_lnsert )设顺序表va中的数据元素递增有序。

试写一算法,将x插入到循序表的适当位置上,以保持该表的有序性。

(《数据结构题集C语言版》P17)题目3:(线性表顺序存储结构上的操作_逆置)试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表逆置。

(《数据结构题集C语言版》2.21)线性表线性链表的各种操作题目1:( Insert )试写一算法,在无头结点的动态单链表上实现线性表的Insert(L,i,b), 并和在带头结点的动态单链表上实现同样操作的算法进行比较。

(《数据结构题集C语音版》P17)题目2:(Delete )同上题要求,实现线性表操作Delete(L,i).题目3:已知线性表中的元素以值递增有序排序,并以单链表作为存储结构。

试写一高效算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)同时释放被删除结点空间,并分析你的算法的事件复杂度(注意:mink和maxk是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)。

(《数据结构题集C语言版》P17)题目4:同上题条件,试写一高效算法,删除表中所有值相同的多余元素(使得操作后的线性表所有元素的值均不相同),同是释放被删结点空间,并分析你算法的时间复杂度。

【数据结构】线性表顺序表详解和代码实例

【数据结构】线性表顺序表详解和代码实例

【数据结构】线性表顺序表详解和代码实例线性表(List)是零个或者多个数据元素的有限序列.⾸先它是⼀个序列.⾥⾯的元素是有顺序的,如果有多个元素,除开头和结尾以外的元素都有⼀个前驱和⼀个后继.⽽开头元素只有后继,结尾元素只有前驱.其次线性表是有限的,也就是⾥⾯的元素个数是有限的。

1ADT 线性表(List)2Data3线性表的数据对象集合为{a1, a2, a3, ......, an},每个元素类型为DataType。

4Operation5InitList(L); //初始化线性表6 IsEmptyList(L); //判断线性表是否为空7 ClearList(L); //清空线性表8 GetElemList(L, i, *e); //获取第i个位置的数据9 SearchList(L, e); //查找与数据e相等的元素10 InsertNodeList(L, i, e);//在第i个位置插⼊元素11 DeleteNodeList(L, i, *e);//删除第i个位置的元素,e获取删除元素12 GetLengthList(L); //获取线性表的长度13endADT关于线性表的基本操作就上⾯⼏种,还有⼏个例如线性表的排序,合并,逆序等等操作。

为了⽂章篇幅,就下次再介绍了。

线性表的顺序存储结构,就是指 ⽤⼀段地址连续的存储单元⼀次存储线性表的数据元素。

学过⾼级语⾔的朋友,相信对数组这玩意⼉都不会陌⽣吧。

数组就是⼀种顺序存储结构。

链式存储结构就是可以⽤⼀组任意的内存单元存储线性表中的元素。

与顺序存储不同的是,这组内存单元可以是连续的,也可以是不连续的。

这就意味着,元素可以存储在内存的任意位置。

正因为如此,在链式结构中,每个元素不仅要存它的信息,还需要存储它后继元素的存储地址。

我们把存储元素信息的域称为数据域,⽽把存储后继元素地址的域称为指针域。

由这两部分共同组成的数据元素ai,则可以称之为节点(Node)。

线性表的顺序存储表示_数据结构(C语言版)(第2版)_[共2页]

线性表的顺序存储表示_数据结构(C语言版)(第2版)_[共2页]

23 于一元多项式的运算可以看作是线性表的合并,合并过程需要不断地进行元素的插入操作。

其他如求线性表的拆分、复制等操作也都可以利用上述基本操作的组合来实现。

(3)对于不同的应用,基本操作的接口可能不同。

例如,案例2.2的删除操作,如果要求删除图书表中ISBN 为x 的图书,首先需要根据x 确定该图书在线性表中的位置,然后再利用ListDelete(&L,i)基本操作将该种图书记录从表中删除。

(4)由抽象数据类型定义的线性表,可以根据实际所采用的存储结构形式,进行具体的表示和实现。

2.4 线性表的顺序表示和实现2.4.1 线性表的顺序存储表示线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。

通常,称这种存储结构的线性表为顺序表(Sequential List )。

其特点是,逻辑上相邻的数据元素,其物理次序也是相邻的。

假设线性表的每个元素需占用l 个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储起始位置。

则线性表中第i + 1个数据元素的存储位置LOC(a i + 1)和第i 个数据元素的存储位置LOC(a i )之间满足下列关系:LOC(a i + 1) = LOC(a i ) + l一般来说,线性表的第i 个数据元素a i 的存储位置为:LOC(a i ) = LOC(a 1) + (i − 1) × l式中,LOC(a 1)是线性表的第一个数据元素a 1的存储位置,通常称作线性表的起始位置或基地址,表中相邻的元素a i 和a i + 1的存储位置LOC(a i )和LOC(a i + 1)是相邻的。

每一个数据元素的存储位置都和线性表的起始位置相差一个常数,这个常数和数据元素在线性表中的位序成正比(见图2.2)。

由此,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。

线性表的顺序存储结构(C语言实现)

线性表的顺序存储结构(C语言实现)

线性表的顺序存储结构(C语⾔实现)1 #include <stdio.h>2 #include <stdlib.h>34#define OK 15#define ERR 26#define TRUE 17#define FALSE 08#define MAXSIZE 20 //定义线性表的最⼤长度910 typedef int status; //定义函数返回的状态,OK & ERR11 typedef char datatype; //定义线性表中每个结点的数据类型,这⾥暂定为字符型1213 typedef struct {14 datatype data[MAXSIZE]; //存储着线性表中的每个结点15int length; //线性表当前的长度16 } SequenceList;1718/* 函数原型,线性表的基本操作 */19 SequenceList *createSequenceList(void);20 status isEmpty(SequenceList *L);21void clear(SequenceList *L);22int getLength(SequenceList *L);23int locateNode(SequenceList *L,datatype node_to_locate);24 datatype getNode(SequenceList *L, int index);25 status insert(SequenceList *L, int index, datatype node_to_insert);26 status delete(SequenceList *L, int index);27void showList(SequenceList *L);2829int main(){30/* 测试 */31 SequenceList *root; //指向线性表32 root=createSequenceList(); //创建⼀个线性表33 printf("Length = %d\n",getLength(root)); //打印线性表的当前长度34 printf("isEmpty = %d\n",isEmpty(root)); //打印线性表是否为空35 insert(root,0,'A'); //分别插⼊4个结点36 insert(root,0,'B');37 insert(root,1,'C');38 insert(root,1,'D');39 printf("Length = %d\n",getLength(root));40 printf("isEmpty = %d\n",isEmpty(root));41 showList(root); //打印线性表42 putchar('\n');43 delete(root,1); //删除index=1(数组下标为1)的结点44 showList(root);45 putchar('\n');46 printf("Locate = %d\n",locateNode(root,'A')); //打印查找到的结点的位置47 printf("getNode = %c\n",getNode(root,1)); //打印下标是1的结点的值48 clear(root); //清空线性表49 printf("isEmpty = %d",isEmpty(root));5051return0;52 }5354 SequenceList *createSequenceList(void){55 SequenceList *tmp;56 tmp=malloc(sizeof(SequenceList));//void*类型指针能⾃动转为其他类型的指针57 tmp->length=0; //初始化线性表长度58return tmp;59 }60 status isEmpty(SequenceList *L){61if (L->length==0)62return TRUE;63else64return FALSE;65 }66void clear(SequenceList *L){67 L->length=0;68 }69int getLength(SequenceList *L){70return L->length;71 }72int locateNode(SequenceList *L, datatype node_to_locate){73//返回找到的结点的index74//node_to_locate应当是能唯⼀标识⼀个结点的数据,否则只返回匹配的第⼀个结点75int i;76for (i=0; i<L->length; i++){77if (L->data[i]==node_to_locate)78return i;79 }80return -1; //未找到任何匹配81 }82 datatype getNode(SequenceList *L, int index){83//index表⽰线性表中第N个结点,头结点的index是084if (L->length==0 || index<0 || index>L->length-1) return (datatype)ERR; 85return L->data[index];86 }87 status insert(SequenceList *L, int index, datatype node_to_insert){88//node_to_insert表⽰想要插⼊的结点89//当列表为空时,只有index=0才能插⼊90int k;91if (L->length == MAXSIZE) return ERR; //线性表已满92if (index<0 || index>L->length) return ERR; //index不在有效范围93if (index<L->length){94//插⼊的位置不是最后⼀个结点的下⼀个结点95for (k=L->length-1; k>=index; k--){96 L->data[k+1]=L->data[k]; //将要插⼊结点后⾯的所有结点都往后移97 }98 }99 L->data[index]=node_to_insert; //将新结点插⼊100 L->length++;101return OK;102 }103 status delete(SequenceList *L, int index){104int k;105if (L->length == 0) return ERR; //线性表为空106if (index<0 || index>L->length-1) return ERR; //index不在有效范围107if (index<L->length-1){108//删除的位置不是最后⼀个结点109for (k=index; k<L->length-1; k++){110 L->data[k]=L->data[k+1]; //将删除位置后⾯的结点都往前移111 }112 }113 L->length--;114return OK;115 }116void showList(SequenceList *L){117int i;118for (i=0; i<L->length; i++){119 printf("%c\t",L->data[i]);120 }121 }122123/*124顺序存储结构的线性表的优缺点:125优点:126 1.不必为每个结点之间的逻辑关系增加额外的存储空间127 2.可以快速地读和写表中任意⼀个结点128缺点:129 1.插⼊和删除需要移动⼤量结点130 2.线性表动态变化较⼤,难以确定所需的存储空间131 3.数组预设过长会造成空间浪费(存储碎⽚)132*/133/* 环境: Code::Blocks with GCC 5.1 */运⾏截图:。

数据结构C语言版.线性表的动态分配顺序存储结构表示和实现文库

数据结构C语言版.线性表的动态分配顺序存储结构表示和实现文库

/*数据结构C语言版线性表的动态分配顺序存储结构表示和实现编译环境:Dev-C++*/#include <stdio.h>#include <malloc.h>#include <stdlib.h>typedef int ElemType; // 定义数据结构元素的数据类型#define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量#define LISTINCREMENT 5 // 线性表存储空间的分配增量// 线性表的动态分配顺序存储结构typedef struct{ElemType *elem; // 存储空间基址int length; // 当前长度int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位) }SqList;// 算法2.3,P23// 构造一个空的顺序线性表即对顺序表结构体中的所有元素// 进行初始化。

int InitList(SqList *L){// 分配指定大小的存储空间给顺序表(*L).elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));if( !(*L).elem ) // 存储分配失败exit(0);(*L).length = 0; // 当前长度初始化为0// 指定分配的存储容量(*L).listsize = LIST_INIT_SIZE;return 1;}// 销毁顺序线性表L即将顺序表结构体中的所有成员销毁(空间释放,// 数值置0)。

int DestroyList(SqList *L){// 先释放空间,然后置空free( (*L).elem );(*L).elem = NULL;(*L).length = 0;(*L).listsize = 0;return 1;}// 将L重置为空表(当前长度为0即是空表)。

数据结构实验 C语言版 线性表__C版

数据结构实验 C语言版 线性表__C版
17
2. 求表长
L.length
3. 取第i个元素
L.elem[i-1]
(0<i<L.length+1)
18
4. 元素定位操作
分析:依次取出每个元素和给定值进行比较 int LocateElem_Sq (SqList L, ElemType e, Status (*compare)(ElemType, ElemType))
6. 删除操作
线性表的删除运算是指将表的第i(1≦i≦n)个元 素删除,使长度为n的线性表: (a1,…a i-1,ai,a i+1…,an) 变成长度为n-1的线性表 (a1,…a i-1,a i+1,…,an)
操作步骤: ① 判断线性表是否为空 ② 判断i值是否合法:1≦i≦n ③ 元素前移 ④ 表长减1
2
线性结构:数据元素之间存在1对1的关系。 四个特征: ① 存在惟一的一个“第一元素” ② 存在惟一的一个“最后元素” ③ 除最后元素外,其它元素均有惟一的“后继” ④ 除第一元素外,其它元素均有惟一的“前驱”
3
2.1 线性表的类型定义
一.定义
线性表(Linear List) :由n(n≧0)个数据元素组成的 有限序列。记作: (a1,a2,…an) 其中数据元素的个数n定义为表的长度。当n=0时称 为空表 这里的数据元素ai(1≦i≦n)只是一个抽象的符号, 其具体含义在不同的情况下可以不同。 例1、26个英文字母组成的字母表 (A,B,C、…、Z) 例2、某校从1978年到1983年各种型号的计算机拥 有量的变化情况。 4 (6,17,28,50,92,188)
思考:若要直接查相等的呢?
19
5. 插入操作
线性表的插入运算是指在表的第i(1≦i≦n+1)个位置上,插 入一个新元素e,使长度为n的线性表(a1,…a i-1,ai,…,an) 变成长度为n+1的线性表 (a1,…a i-1,e,ai,…,an) 操作步骤: ① 判断i是否符合要求:1≦i≦n+1 ② 判断表长是否溢出 ③ 元素右移 ④ 插入 ⑤ 表长增1

(C语言详细版)第二章 线性表ppt课件

(C语言详细版)第二章 线性表ppt课件

这种方法可以解决方案一中的“上溢”问题和“空间利用 率不高”问题。但是这一方案是有时间和空间代价的:当 因插入元素而空间不足时,需要重新分配比原先的顺序表 多存储LISTINCREMENT个数据元素的连续空间,并且需 要将原空间的数据元素复制到新分配的空间中。
2018/11/13
卓月明
12
2.2线性表的顺序表示和实现 --类型定义与基本操作实现
卓月明 4
2018/11/13
2.1 线性表的类型定义

在稍复杂的线性表中,一个数据元素可以由若干个数据项 (Item)组成。 在这种情况下,常把数据元素称为记录(Record),含有大量记录的线性 表又称文件(File)。 例如,一个学校的学生健康情况登记表如图所示,表中每个学生的情况 为一个记录,它由姓名、学号、性别、年龄、班级和健康状况等六个数 据项组成。
(C语言详细版)第二章 线性表
第二章 线性表

从第2章至第4章将讨论线性结构。 线性结构的特点是:

在数据元素的非空有限集中,


(1)存在唯一的一个被称做“第一个”的数据元素; (2)存在唯一的一个被称做“最后一个”的数据元素; (3)除第一个之外,集合中的每个数据元素均只有一 个前驱; (4)除最后一个之外,集合中每个数据元素均只有一 个后继。
2.2 线性表的顺序表示和实现

若要在实际的程序设计中真正引用线性表的基本操作, 首先必须实现线性表类型。即在计算机中确定它的存 储结构并在此存储结构上实现类型中定义的所有基本 操作。本节将讨论它的顺序存储结构以及在顺序存储 结构中基本操作的实现。
何谓顺序存储表示?


顺序存储表示指的是,以数据元素在存储器中的"相对位置"来 表示数据元素之间的逻辑关系。你还记得吗?

数据结构——线性表(顺序实现)

数据结构——线性表(顺序实现)

数据结构——线性表(顺序实现) 好好学习基础知识,出⼈头地就靠它了,内外兼修。

(好吧,我现在内外都不⾏)写这篇⽂章的⽬的就是为了,巩固刚学完的线性表,个⼈能⼒有限,若有不当之处,望指出。

线性表 好了,扯完了,说正事: 1、定义 线性表是⼀种及其常⽤的并且最简单的⼀种数据结构。

简单来说,线性表就是集合⾥的元素的有限排列。

(在这⾥我把集合定义为具有相同属性的元素,会有些狭义) 在线性表中数据元素之间的关系是⼀对⼀的关系,即除了第⼀个和最后⼀个数据元素之外,其它数据元素都是⾸尾相接的(注意,这句话只适⽤⼤部分线性表,⽽不是全部。

⽐如,循环链表逻辑层次上也是⼀种线性表(存储层次上属于链式存储),但是把最后⼀个数据元素的尾指针指向了⾸位结点)[] 怎么说呢,毕竟数据结构毕竟是逻辑结构,逻辑上符合线性结构的特征即可,存储结构能实现就⾏。

线性表的很重要!很重要!很重要!后⾯的栈,队列,串等都是基于线性表的基础上实现的,所以说⼀定要学好线性表 2、线性表的特点: 对于任意的的⾮空线性表或者线性结构有: 1、存在唯⼀⼀个被称为 ”第⼀个“的元素 2、存在唯⼀⼀个被称为 ”最后⼀个“的元素 3、出第⼀个元素之外,每⼀个元素都存在⼀个后继 4、除最后⼀个元素之外,每⼀个元素都存在⼀个前驱 3、基本操作 1、Create(*L)创建空表 2、InitEmpty(*L)初始化 3、getLength(*L)获取长度 4、Insert(*L)插⼊元素 5、Remove(*L)移除元素 6、IsEmpty(*L)空表检测 7、IsFulled(*L)表满检测(顺序表常⽤,链式表基本不⽤) 8、Delete(*L)删除表 9、getElemt(*L)获取元素 10、Traverse(*L)遍历输出所有元素 11、Clear(*L)清除所有元素 4 、实现 好了最⿇烦的事情开始了,数据结构在计算机上的的映射。

众所周知,线性表有两种实现⽅法,⼀种是顺序表,另⼀种是链式表,这两种结构实现最⼤的不同在于前者逻辑关系⽆需存储空间,⽽后者则需要⽤额外的空间(顺便记录⼀下,指针⼤⼩只由环境有关(严格意义上说和CPU的位数有关)本篇只实现顺序结构)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构C语言版线性表的动态分配顺序存储结构表示和实现文库.txt爱空空情空空,自己流浪在街中;人空空钱空空,单身苦命在打工;事空空业空空,想来想去就发疯;碗空空盆空空,生活所迫不轻松。

总之,四大皆空!/*数据结构C语言版线性表的动态分配顺序存储结构表示和实现P22-26编译环境:Dev-C++ 4.9.9.2日期:2011年2月9日*/#include <stdio.h>#include <malloc.h>#include <stdlib.h>typedef int ElemType; // 定义数据结构元素的数据类型#define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量#define LISTINCREMENT 5 // 线性表存储空间的分配增量// 线性表的动态分配顺序存储结构typedef struct{ElemType *elem; // 存储空间基址int length; // 当前长度int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)}SqList;// 算法2.3,P23// 构造一个空的顺序线性表即对顺序表结构体中的所有元素// 进行初始化。

int InitList(SqList *L){// 分配指定大小的存储空间给顺序表(*L).elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));if( !(*L).elem ) // 存储分配失败exit(0);(*L).length = 0; // 当前长度初始化为0// 指定分配的存储容量(*L).listsize = LIST_INIT_SIZE;return 1;}// 销毁顺序线性表L即将顺序表结构体中的所有成员销毁(空间释放,// 数值置0)。

int DestroyList(SqList *L){// 先释放空间,然后置空free( (*L).elem );(*L).elem = NULL;(*L).length = 0;(*L).listsize = 0;return 1;}// 将L重置为空表(当前长度为0即是空表)。

int ClearList(SqList *L){(*L).length = 0;return 1;}/*若L为空表,则返回1,否则返回0。

如何判断是否为空表呢?结构体中已经包含一个可以说明的元素,那就是length,表示当前顺序表的长度,根据当前的长度就可以判断了,为0就是空表,不为0就不是空表了。

*/int ListEmpty(SqList L){if(0 == L.length)return 1;elsereturn 0;}// 返回L中数据元素个数。

int ListLength(SqList L){// L.length刚好记录了当前顺序表的长度,直接返回return L.length;}// 用e返回L中第i个数据元素的值,第i个数据元素就是L.elem[i-1]。

int GetElem(SqList L,int i,ElemType *e){// 首先进行异常处理if(i < 1 || i > L.length)exit(0);/*注意顺序表基址L.elem[0] 表示第一个数,而第i个数则是用基址L.elem + i - 1来表示,也可以用L.elem[i-1]表示。

为什么可以那样表示呢?因为l.elem是基地址,相当于数组头一样,指示了一个首地址,然后对地址进行加减,形成不同元素的地址。

*是取地址所指的内容,所以*(L.elem+i-1)就是第i个数据的值了。

*/*e = *(L.elem + i - 1);// *e = L.elem[i-1];return 1;}/* 算法2.6,P26返回L中第1个与e满足关系compare()的数据元素的位序。

若这样的数据元素不存在,则返回值为0。

*/int LocateElem(SqList L,ElemType e,int(* compare)( ElemType, ElemType)){ElemType *p;int i = 1; // i的初值为第1个元素的位序p = L.elem; // p的初值为第1个元素的存储位置即地址// 循环比较,直到找到符合关系的元素while(i <= L.length && !compare(*p++, e) )++i;if(i <= L.length)return i;elsereturn 0;}#if 0/* 算法2.7 与算法2.2区别已知顺序线性表La和Lb的元素按值非递减排列。

归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列。

算法的时间复杂度为O(La.length + Lb.length).*/void MergeList(SqList La, SqList Lb, SqList *Lc){ElemType *pa, *pa_last, *pb, *pb_last, *pc;pa = La.elem; //pa指向线性表La的头结点pb = Lb.elem; //pb指向线性表Lb的头结点/* 不用InitList()创建空表Lc */(*Lc).listsize = (*Lc).length = La.length + Lb.length;// pc指向线性表Lc的头结点pc = (*Lc).elem =(ElemType *)malloc((*Lc).listsize*sizeof(ElemType));if( !(*Lc).elem ) /* 存储分配失败 */exit(0);pa_last = La.elem + La.length - 1; //pa_last指向线性表La的尾结点pb_last = Lb.elem + Lb.length - 1; //pb_last指向线性表Lb的尾结点while(pa <= pa_last && pb <= pb_last) /* 表La和表Lb均非空 */{ /* 归并 */if(*pa <= *pb) //*pa更小接到pc后*pc++ = *pa++;else //*pb更小接到pc后*pc++ = *pb++;}while(pa <= pa_last) /* 表La非空且表Lb空 */*pc++ = *pa++; /* 插入La的剩余元素 */while(pb <= pb_last) /* 表Lb非空且表La空 */*pc++ = *pb++; /* 插入Lb的剩余元素 */}#endif// 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否// 则返回0。

int PriorElem(SqList L, ElemType cur_e, ElemType *pre_e){int i = 2;// 因为第一个数据元素无前继,从第二个数据元素开始ElemType *p = L.elem + 1;// 找到该cur_e对应的元素并赋给pwhile(i <= L.length && *p != cur_e){p++;i++;}if(i > L.length)return 0;else{/*将该cur_e的前驱赋给*pre_e.对等式说明下:* 和 --是同优先级的,且它们的结合性是自右向左的,所以先p自减1,p指向其前驱,然后将p所指向的地址的内容赋给*pre_e。

从这里要明白为什么用指针进行传值,我给你一个地址,你把内容放进去,然后我就知道其中的值了。

这就是使用指针的用处。

*/*pre_e = *--p;return 1;}}/*若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则返回0*/int NextElem(SqList L,ElemType cur_e,ElemType *next_e){int i = 1;ElemType *p = L.elem;while(i < L.length && *p != cur_e){i++;p++;}if(i == L.length)return 0;else{/*对这个等式说明下:* 和 --是同优先级的,且它们的结合性是自右向左的,所以先p自加1,然后将p所指向的地址的内容赋给*next_e*/*next_e = *++p;return 1;}}// 算法2.4 P24// 在L中第i个位置之前插入新的数据元素e,L的长度加1.int ListInsert(SqList *L,int i,ElemType e){ElemType *newbase, *q, *p;// 输入的i不合法if(i < 1 || i > (*L).length + 1)return 0;// 当前存储空间已满,增加分配if( (*L).length >= (*L).listsize){// realloc改变(*L).elem所指内存的大小,原始所指内存中的// 数据不变。

newbase = (ElemType *)realloc((*L).elem,((*L).listsize + LISTINCREMENT) * sizeof(ElemType));if( !newbase )exit(0);(*L).elem = newbase; // 新基址(*L).listsize += LISTINCREMENT; // 增加存储容量}// 指定插入的位置q = (*L).elem + i - 1;// q之后的元素右移一步,以腾出位置for(p = (*L).elem + (*L).length - 1; p >= q; --p)*(p+1) = *p;*q = e; // 插入e++(*L).length; // 表长增1return 1;}/* 算法2.5 P25删除L的第i个数据元素,并用e返回其值,L的长度减1.*/int ListDelete(SqList *L,int i,ElemType *e){ElemType *p,*q;// i值不合法if( i < 1 || i > (*L).length)return 0;p = (*L).elem + i - 1; // p为被删除元素的位置*e = *p; // 被删除元素的值赋给eq = (*L).elem + (*L).length-1; // 表尾元素的位置for(++p; p <= q; ++p) // 被删除元素之后的元素左移*(p-1) = *p;(*L).length--; // 表长减1return 1;}// 依次对L的每个数据元素调用函数vi()。

相关文档
最新文档