数据结构(西北大学)_线性表
第一部分 数据结构的基本概念
第二部分 基本的数据结构,包括 线性结构-线性表、栈和队列、串、数组和广义表。非线性结构-树和图。
第三部分 基本的数据处理技术 包括查找技术与排序技术
第一部分介绍了数据结构的基本概念。接着进入到第二部分介绍线性结构。
第二章 线性表
1介绍线性表的抽象数据类型定义。
2给出顺序存储结构与链式存储结构。
3介绍在相应的存储结构上实现的线性运算。
线性表通过5个问题来介绍:
1线性表的概念及抽象数据类型定义
2线性表的顺序存储
3线性表的链式存储
4一元多项式的表示及相加
5顺序表与链式表的综合比较
线性表的定义:线性表是n个类型相同的数据元素的有限序列。对于n>0,除了第一个元素无直接前驱,最后一个元素无直接后继,其余的每个元素都只有一个直接前驱和直接后继。
线性表的特点:数据元素的非空有限序列中,存在唯一的首元素和唯一的尾元素,首元素无直接前驱,尾元素无直接后继,其他每个数据元素均有直接的前驱和直接的后继。

1介绍线性表的抽象数据类型定义。
ADT LinearList{
数据元素:D={ai| ai∈D0,i=1,2,3...,n n>=0,D0为某一数据对象}
结构关系:S={<ai,ai+1>| ai,ai+1∈DO,i=1,2,...,n-1}
基本操作(运算集合):
(1)InitList(L)
操作前提:L为未初始化线性表。
操作结果:将L初始化为空表。
(2)DestroyList(L)
操作前提:线性表L已经存在。
操作结果:将L销毁。
(3)ClearList(L)
操作前提:线性表L已经存在。
操作结果:将表L置为空表。
(4)EmptyList(L)
操作前提:线性表L已经存在。
操作结果:如果L为空表则返回真,否则为假。
(5)ListLength(L)
操作前提:线性表L已经存在。
操作结果:如果L为空表则返回0,否则返回表中元素个数。
(6)Localte(L,e)
操作前提:线性表L已经存在,e为合法元素值。
操作结果:如果L中存在e,则较“当前指针”指向元素e所在位置并返回真,否则返回假。
(7)GetData(L,i)
操作前提:线性表L已经存在,且i值合法,即1<=i<=Listlength(L)。
操作结果:返回线性表L中第i个元素的值。
(8)insList(L,i,e)
操作前提:线性表L已经存在,e为合法元素且1<=i<=Listlength(L)+1。
操作结果:在L中第i个位置插入新的数据元素e,L的长度加1。
(9)DelList(L,i,&e)
操作前提:线性表L已经存在且非空,1<=i<=Listlength(L)。
操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1。
}ADT LinearList
2线性表的顺序存储
顺序存放,就是地址连续的内存单元。
假设线性表中有n个元素,每个元素占k个单位,第一个元素的地址为loc(a1),则可通过如下公式计算出第i个元素的地址Loc(ai): loc(ai)=loc(a1)+(i-1)✖k,其中loc(a1)称为基地址。
顺序存储结构的C语言定义
#define MAXSIZE 100 typedef struct{ ElemType elem[MAXSIZE]; //ElemType元素类型,MAXSIZE定义数据有多少。 int last //表尾指示器,指向实际存储元素。 } SeqList; 注意区分元素的序号和数组的下标,如a1的序号为1,其对于的数组下标为0.
3线性表顺序存储结构的基本运算
线性表的基本运算
查找操作
插入操作
删除操作
顺序表合并算法
查找操作
/*线性表的两种基本查找运算 1 按序号查找GetData(L,i):要求查找线性表L中第i个数据元素,其结果是L.elem[i-1]或L->elem[i-1] 2 按内容找Locate(L,e):要求查找线性表L中与给定值e相等的数据元素,其结果是:若在表L中找到与e相等的元素,则返回该元素在表中的序号,如找不到,则返回一个“空序号”,如-1. */ #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef int ElemType; typedef struct { ElemType elem[MAXSIZE]; //ElemType元素类型,MAXSIZE定义数据有多少。 int last; //表尾指示器,指向实际存储元素。 } SeqList; //在顺序表L中依次存放着线性表中的元素,在表中查找与e相等的元素。若L[i]=e则找到该元素,并返回i值,若找不到则返回-1 int Locate(SeqList L, ElemType e) { //L是具有类型的结构。 int i = 0; i = 0;//i为扫描计数器,初始值为0.即从第一个元素开始比较。 while ((i <= L.last) && (L.elem[i] != e)) { //(i <= L.last) 表示表还未找完。(L.elem[i] != e)表示还未找到元素。 i++; } //顺序扫描表,直到找到值为key的元素,或扫描到表尾而没有找到。 if (i <= L.last) { return (i + 1); //若找到值为e的元素,则返回其序号。 } else { return -1;//若没有找到,则返回空序号。 } } int main(void) { SeqList l; //l.elem = {5,7,88,99}; l.elem[0] = 1; l.elem[2] = 5; l.elem[3] = 7; l.elem[4] = 88; l.elem[5] = 222; l.elem[6] = 21; l.last = 6; ElemType e = 5; if (Locate(l, e) == -1) { printf("no found data\n"); } else { printf("find\n"); } return 0; }
posted on 2021-01-03 11:06 XiaoXiaoli 阅读(151) 评论(0) 收藏 举报
浙公网安备 33010602011771号