数据结构c语言版学习笔记-线性表

合集下载

天大《数据结构》学习笔记二

天大《数据结构》学习笔记二

ቤተ መጻሕፍቲ ባይዱ据结构—学习笔记二
三、二维数组-矩阵 1、C 语言中的二维数组: 1 . 1 定义:i n tu [ 3 ] [ 2 ] ; i n tv [ 2 ] [ 3 ] ; 1 . 2 使用:u [ 0 ] [ 1 ] = 7 ; v [ 1 ] [ 2 ] = 6 ; C 语言中二维数组的行下标、列下标都从 0 开始。二维数组的元素是按行存放。 1 . 3 本课程的约定:行数为 m + 1 ,列数为 n + 1 ; 第[0]行与第[0]列一般不用。 2、二维数组的输入与输出: 2 . 1 输入: f o r ( i = 1 ; i < = m ; i + + ) f o r ( j = 1 ; j < = n ; j + + ) s c a n f ( “% d ”, & v [ i ] [ j ] ) ; 2 . 2 输出:f o r ( i = 1 ; i < = m ; i + + ) { f o r ( j = 1 ; j < = n ; j + + ) p r i n t f ( “% d ”, v [ i ] [ j ] ) p r i n t f ( “\ n ”) } 3、矩阵相加: 3 . 1 条件:两个矩阵的行数与列数均相同。 3 . 2 程序: { …… f o r ( i = 1 ; i < = m ; i + + ) f o r ( j = 1 ; j < = n ; j + + ) w [ i ] [ j ] = u [ i ] [ j ] + v [ i ] [ j ] } 4、矩阵相乘: 4 . 1 条件:第一个矩阵的列数等于第二个矩阵的行数。 4 . 2 程序: { …… f o r ( i = 1 ; i < = m ; i + + ) f o r ( j = 1 ; j < = k ; j + + ) { s = 0 ; f o r ( t = 1 ; t < = n ; t + + ) s = s + u [ i ] [ t ] * v [ t ] [ j ] ; w [ i ] [ j ] = s ; } } 5、课后练习: 编程:求已知矩阵的最大值、最小值及其相应的位置。

数据结构第1讲---线性表

数据结构第1讲---线性表
type p=^integer; var p1:p; p1
34F2 地址 被释放,变 量P与地址 34F2没有关 系
p1^
200 34F2
34F2
new(p1) ——向计算机申请内存地址 p1^:=200 ——给p1指向的单元赋值 dispose(p1) ——释放存储单元
链式结构——什么是指针
Type p=^integer; arr=array[1..4] of char; arrp = ^arr; Var p1:p; p2:arrp;
线性结构 数据的逻辑结构 数 据 结 构 树形结构 图形结构 数据的存储结构 顺序存储
链式存储
数据结构的基本运算 :查找、插入、删除等
三、线性结构——线性表
1、线性表的概念
线性表是由n(n≥0)个具有相同特性数据元素(结点)
a1,a2,…,an组成的有限序列。
线性表的长度:所含元素的个数,用n表示,n>=0。
在我们生活中有哪些属于线性表的例子,列举几个。 1、英文字母表(A,B,…,Z)是线性表, 表中每个字母是一个数据元素(结点)
2、学生成绩表中,每个学生及其成绩是一
个数据元素,其中数据元素由学号、姓名、
各科成绩及平均成绩等数据项组成。
4、线性表的顺序存储
顺序存储是线性表的一种最 简单的存储结构,存储方式是: 在内存中为线性表开辟一块连 续的存储空间。用数组来存放 每一个节点。
[例4-2] 法雷序列
[问题描述]对任意给定的一个自然数n(n<=100),将 分母小于等于n的不可约的真分数按上升次序排序,并 且在第一个分数前加0/1,而在最后一个分数后加1/1, 这个序列称为n级的法雷序列。 当n=8时序列为:0/1, 1/8, 1/7, 1/6,1/5, 1/4,2/7,1/3,3/8, 2/5,3/7,1/2,4/7,3/5,5/8,2/3,5/7,3/4, 4/5,5/6,6/7,7/8, 1/1 。 编程求出n级的法雷序列,每行输出10个分数。

《数据结构与算法(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语言版)_学习、复习提纲.

期末复习 第一章 绪论 复习1、计算机算法必须具备输入、输出、可行性、确定性、有穷性5个特性。

2、算法分析的两个主要方面是空间复杂度和时间复杂度。

3、数据元素是数据的基本单位。

4、数据项是数据的最小单位。

5、数据结构是带结构的数据元素的集合。

6、数据的存储结构包括顺序、链接、散列和索引四种基本类型。

基础知识数据结构算 法概 念逻辑结构 存储结构数据运算数据:计算机处理的信息总称 数据项:最小单位 数据元素:最基本单位数据对象:元素集合数据结构:相互之间存在一种或多种特定关系的数据元素集合。

概念:数据元素之间的关系 线性结构:一对一非线性结构 树:一对多 图:多对多顺序存储结构 链表存储结构 索引。

散列。

算法描述:指令的有限有序序列算法特性 有穷性 确定性 可行性 输入 输出 算法分析时间复杂度 空间复杂度第二章 线性表 复习1、在双链表中,每个结点有两个指针域,包括一个指向前驱结点的指针 、一个指向后继结点的指针2、线性表采用顺序存储,必须占用一片连续的存储单元3、线性表采用链式存储,便于进行插入和删除操作4、线性表采用顺序存储和链式存储优缺点比较。

5、简单算法第三章 栈和队列 复习线性表顺序存储结构链表存储结构概 念基本特点基本运算定义逻辑关系:前趋 后继节省空间 随机存取 插、删效率低 插入 删除单链表双向 链表 特点一个指针域+一个数据域 多占空间 查找费时 插、删效率高 无法查找前趋结点运算特点:单链表+前趋指针域运算插入删除循环 链表特点:单链表的尾结点指针指向附加头结点。

运算:联接1、 栈和队列的异同点。

2、 栈和队列的基本运算3、 出栈和出队4、 基本运算第四章 串 复习栈存储结构栈的概念:在一端操作的线性表 运算算法栈的特点:先进后出 LIFO初始化 进栈push 出栈pop队列顺序队列 循环队列队列概念:在两端操作的线性表 假溢出链队列队列特点:先进先出 FIFO基本运算顺序:链队:队空:front=rear队满:front=(rear+1)%MAXSIZE队空:frontrear ∧初始化 判空 进队 出队取队首元素第五章 数组和广义表 复习串存储结构运 算概 念顺序串链表串定义:由n(≥1)个字符组成的有限序列 S=”c 1c 2c 3 ……cn ”串长度、空白串、空串。

数据结构 线性表

数据结构 线性表

(9) Status NextElem_Sq(SqList L, ElemType cur_e, ElemaType &next_e)
//若cur_e是线性表L的元素且不是最后一个,返回它的后继 { for (i=0; i<L.length-1; i++) if (cur_e==L.elem[i]) { next_e=L.elem[i+1]; return OK; } return ERROR; }//NextElem_Sq O(n)
抽象数据类型 唯 一 数据的逻辑结构 确 操作的定义 定
集合 *
线性表
特殊线性表 扩展线性表
线性结构
树形结构 图形结构
灵 活 数据的存储结构 操作的实现 设 计
顺序存储 链式存储 散列(哈希)存储
数据的基本操作:针对结构、针对元素、针对状态
数据结构---第二章 线性表 1
第二章 线性表
2.1 2.2 2.3 2.4
数据结构---第二章 线性表
9
2.2 线性表的顺序存储结构(顺序表)
起始地址为b、最多可容纳maxlen个元素的线性表
下标 存储地址
0
1
b b+c
b+(i-1)c
a1 a2
ai
c个存储单元
i-1
LOC(ai)=LOC(a1)+(i-1)c LOC(ai)=LOC(ai-1)+c
n-1
b+(n-1)c
n-1
int LocateElem_Sq(SqList L, ElemType e, (7) Status (*compare)(ElemType,ElemType) ) //在线性表L中查找第1个值与e满足 //compare()的元素的位序 { for (i=0; i<L.length; i++) L.elem[i]==e if ( (*compare)(L.elem[i],e) ) return i+1; return 0 ; //作为未找到的特殊标记 } // LocateElem_Sq O(n) P25-2.6

《数据结构C语言版》----第02章

《数据结构C语言版》----第02章

同理可证:顺序表删除一元素的时间效率为: 同理可证:顺序表删除一元素的时间效率为: T(n)=(n-1)/2 ≈O(n) O(n) (
插入效 E = ∑ is 率: i=0
n
1 n n pi ( n − i ) = ∑ (n − i) = 2 n + 1 i=0
n −1 删除效 1 n −1 n −1 Edl = ∑ qi (n − i ) = ∑ (n − i ) = 率: n i =0 2 i =0
2.2 线性表的顺序表示和实现
顺序存储结构的线性表称作顺序表 1.顺序表的存储结构 顺序表的存储结构
实现顺序存储结构的方法是使用数组。数组把线性表 实现顺序存储结构的方法是使用数组。 使用数组 的数据元素存储在一块连续地址空间的内存单元中, 连续地址空间的内存单元中 的数据元素存储在一块连续地址空间的内存单元中,这样 线性表中逻辑上相邻的数据元素在物理存储地址上也相邻。 线性表中逻辑上相邻的数据元素在物理存储地址上也相邻。 数据元素间的逻辑上的前驱、 数据元素间的逻辑上的前驱、后继逻辑关系就表现在数据 元素的存储单元的物理前后位置上。 元素的存储单元的物理前后位置上。 顺序表的存储结构如图所示
2.线性表抽象数据类型 2.线性表抽象数据类型
数据集合:{ 的数据类型为DataType 数据集合 { a0, a1, … , an-1 }, ai的数据类型为 (1) ListInitiate(L) 初始化线性表 (2) ListLength(L) 求当前数据元素个数 操作集合: 操作集合 (3) ListInsert(L,i,x) 插入数据元素 (4) ListDelete(L,i,x) 删除数据元素 (5) ListGet(L,i,x) 取数据元素
printf("参数 不合法 \n"); 参数i不合法 参数 不合法! return 0;

数据结构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语言版)》,有部分改动线性表的定义定义•线性表是具有相同的数据类型的n(n >= 0)个数据元素的有限序列,当n=0时线性表为一个空表•用L表示线性表则L = (a1,a2,a3,…,ano a1为表头元素,an为表尾元素o a1无直接前驱,an无直接后继特点•表中元素个数有限•表中元素具有逻辑上的顺序,表中元素有先后次序•表中元素都是数据元素•表中元素的数据类型都相同,每个元素占的空间大小一致要点数据项、数据元素、线性表的关系线性表由若干个数据元素组成,而数据元素又由若干个数据项组成,数据项是数据的不可分割的最小单位。

其中姓名,学号等就是数据项线性表的顺序表示顺序表的定义顺序表是指用一组地址连续的存储单元依次存储信息表中的数据元素,从而使得逻辑相邻的两个元素在物理位置上也相邻预先定义(为了代码可以运行)#define True 1#define False 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;第n个元素的内存地址表示为LOC(A) + (n-1)*sizeof(ElemType)假定线性表的元素类型为ElemType,则线性表的顺序存储类型描述为typedef int ElemType ;#define MaxSize 50typedef struct{ElemType data[MaxSize];int length;}SqList;一维数组可以是静态分配的,也可以是动态分配的。

静态分配后大小和空间都固定了,下面使用动态分配的形式typedef int ElemType ;#define InitSize 100 //表长度的初始大小定义#define ListIncreasement 10 //线性表存储空间的分配增量typedef struct{ElemType *data;int MaxSize,length;}SeqList;顺序表的初始化顺序表的初始化,&是C++的引用,可以使用指针代替Status InitList(SeqList &L){L.data = (ElemType *) malloc(InitSize * sizeof(ElemType));if(! L.data) exit(OVERFLOW);//存储分配失败L.length = 0;L.MaxSize = InitSize;return OK;}顺序表的插入在顺序表L的第i(1<= i <= L.length +1)个位置插入新元素e,需要将第n 个至第i (共n-i+1)个元素向后移动一个位置【最后一个到倒数第n-i+i个元素向后移动一位】。

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

线性表
线性结构
最常用最简单的数据结构,而线性表是一种典型的线性结构,基本特点是,线性表中的数据元素是有序且有限的。

在这种结构中:
1.存在一个唯一的被称为“第一个”的数据元素
2.存在一个唯一的被称为“最后一个”的数据元素
3.除第一个元素外,每个元素均有唯一一个直接前驱
4.除最后一个元素外,每个元素均有唯一一个直接后继
线性表定义:是由n(n>=0)个数据元素(节点),a1,a2…an组成的有限序列。

该序列中所有的数据节点具有相同的数据类型,其中数据元素的个数n称之为线性表的长度。

线性表的抽象数据类型定义
ADT List{
数据对象:D={ | ∈ ElemSet, i=1,2,...,n, n≥0 }
数据关系:R1={ <ai-1 ,ai >| ,∈D, i=2,...,n }
数据操作:
InitList(*L):初始化操作,建立一个空的线性表
ListEmpty(L):若线性表为空,返回True,否则返回False
ClearList(*L):将线性表清空。

GetElem(L,i,e):将线性表L中的第i个位置元素赋值给e LocateElem(L,e):在线性表L中查找与给定值e相等的元
素,如果查找成功返回该元素在表中序号表示

功,否则,返回0表示失败
ListInsert(*L,i,e):在线性表L中的i个位置插入新元素e ListDelete(*L,i,*e):删除线性表L中地i个位置元素,并
用e返回其值
ListLength(L):返回线性表L的元素个数
}
线性表的顺序存储结构
顺序存储:把线性表的节点按逻辑顺序依次存放在一组地址连续的存储单元里。

用这种方法存储的线性表简称顺序表。

特点:线性表的物理顺序与逻辑顺序一致;数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现的。

注:在高级语言环境下,数组具有随机存取的特性,因此借助数组来表示顺序表
typedef struct SeqList
{
ElemType array[MAXSIZE];
int count;//保存线性表中的元素个数
}SeqList
线性表的链式存储结构
链式存储:用一组任意的存储单元存储线性表中的数据元素,用这种方式存储的线性表简称为线性链表。

特点:存储单元可连续可不连续,可零散分布任意位置,因此链表中的元素的逻辑顺序与物理顺序不一定相同。

结构:为了正确表示元素间的逻辑关系,在存储每个元素值的同时,还必须存储其后继节点的位置,称为指针或链,这两部分组成了链表的节点结构。

基本操作:
1.节点赋值
LNode *p;p=(LNode*)malloc(sizeof(LNode)); p->data=20;p->next=NULL
2.指针的操作
单链表的基本操作
单链表:每一个结点只包含一个指针域的链表称为单链表。

1.建立单链表
头插入法:每次插入的节点都作为链表的第一个节点,生成的链表中元素的次序和输入的次序相反
尾插入法:新结点插入到当前链表的表尾,使其成为当前链表的尾结点
2.单链表的查找
按序号查找:对于单链表,不能像顺序表一样直接按序号i访问节点,而只能从链表的头节点出发,沿着链域next逐个节点搜索,直到搜索到第i个节点为止。

链表不是随机存取结构,是顺序存取结构
按值查找:在链表中查找是否有节点值等于给定值的节点,如有,则返回节点的地址,如没有,则返回null。

3.单链表插入
插入运算是将值为e的新节点插入到表的第i个节点上,即插入到第i-1与i之间的位置,因此要先找到i-1所在节点p,将新节点作为p的直接后继节点
4.单链表删除
基本思路:(1)查找所要删除的节点定位;(2)建立其前节点和后节点的链接;(3)删除该位置free();
注意:需要加几个判断条件,因为无法预知链表的长度,所以在定位的时候直接需要防止操作出链表,设单链表长度为n,则删除第i个结点仅当1≤i≤n时是合法的。

则当i=n+1 时,虽然被删结点不存在,但其前趋结点却存在(即终端结点)。

故判断条件之一是p–>next!=NULL
按序号删除:删除单链表第i个节点,首先找到第i-1的节点p,然后将p的next直接指向i节点的后继节点。

最后释放ai的存储空间。

按值删除:删除单链表中值为key的节点。

变形练习1:删除值为key的所有节点变形练习2:删除所有值重复的节点。

5.单链表合并:
设两个有序单链表,头指针分别指向La,Lb,将他们合并为Lc为头指针的有序链表.
循环链表
定义:一种头尾相接的链表,其特点是最后一个节点的指针域指向链表的头节点,整个链表的指针域连城一个环。

从循环链表的任何一个节点出发都可以找到链表的任意节点,使链表操作更加灵活。

操作:对于单循环链表,其操作除合并外与单链表一致,仅需修改一些判断条件:
(1)非空链表判断:head->next = head
(2)尾节点的判断:p->next = head;
双向链表
定义:构成链表的每个节点设置两个指针域,一个指向其直接前驱的指针域prior,一个指向其直接后继的指针域next,这样形成的链表有两个方向不同的链,故称双向链表。

和单链表类似,双向链表一般增加头节点使得双向链表某些运算更方便.
双向链表是为了克服单链表的单向性的缺陷引入的。

将头节点和尾节点连接起来也能构成循环链表,成为双向循环链表.
双向链表对称性描述:节点p的存储位置存放在其直接前驱节点
p->prior的后继指针域中,也存放在其直接后继节点p->next的前驱域指针中。

操作:
(1)插入操作:将值为e的节点插入双向链表中。

(2)删除操作,设要删除的节点为p,删除时可以不引入新的辅助变量指针,可以先断链,再释放节点。

注意:与单链表删除插入操作不同的是,在双向链表中插入和删除必须要同时修改两个方向的指针域指向。

一元多项式的表示和相加
一元多项式表示:P(x)=p0x0+p1x1+p2x2+p3x3+…+p n x n
可改写为:P(x)=p0x e0+p1x e1+p2x e2+p3x e3+…+p n x en
其中p i是指数为e i的项的非零系数,且满足:0<=e1<e2<e3…<e m=n 若用一个长度为m,且每个元素有两个数据项(系数项和指数项)的线性表,则可唯一确定一个一元多项式。

P n(x)=((p1,e1),(p2,e2),(p3,e3),…(p n,e n));
由n+1个系数唯一确定,在计算机中可用线性表表示。

一元多项式的相加:指数不同,链表合并;指数相同,系数相加;算法一:在原两个多项式链表基础上想加,相加后两个多项式链表就不再存在,生成新的链表。

算法二:两个多项式相加,生成一个新的多项式链表,原先多项式仍然存在。

相关文档
最新文档