2线性表1
数据结构线性表习题1

数据结构练习题1 指导老师:***姓名:***学校:滨州学院院系:信息工程学院软件技术填空题1.对于一个n个结点的单链表,在表头插入元素的时间复杂度为_____O(1)_____,在表尾插入元素的时间复杂度为_____O(n)_____。
2.删除非空线性链表中由q所指的链结点(其直接前驱结点由r指出)的动作时执行语句___r->link=q->link_______和______free(q)____。
结点结构为typedef struct Node{int value;node * link;}node;3.非空线性链表中,若要在由p所指的链结点后面插入新结点q,则应执行语句____ q->link=p->link;______和_____ p->link=q;_____。
结点结构为typedef struct Node{int value;node* link;}node;4.线性表L=(a1,a2,…,an)用数组表示,假定删除表中任一元素的概率相同,则删除一个元素平均需要移动元素的个数是_____(n-1)/2_____。
5.在一个长度为n的顺序表中第i个元素(1≤i≤n)之前插入一个元素时,需向后移动_____ n-i+1_____ 个元素。
6.在具有n个链结点的链表中查找一个链结点的时间复杂度为O(_______n___)。
7.线性表中的插入、删除操作,在顺序存储方式下平均移动近一半的元素,时间复杂度为_____O(n)_____;而在链式存储方式下,插入和删除操作的时间复杂度都是____O(1)______ 。
8.若某线性表采用顺序存储结构,每个元素占4个存储单元,首地址为100,则第10个元素的存储地址为____136______。
选择题1.对于一个带头结点的单链表,头指针为head,判定该表为空的条件是________B__。
A. head==NULLB. head->next==NULLC. head->next==headD. head!=NULL2.将长度为m的线性链表链接在长度为n的线性链表之后的过程的时间复杂度若采用大O形式表示,则应该是______B____。
数据结构习题1-3及其答案

1.设n为正整数,利用大"O"记号,将下列程序段的执行时间表示为n的函数。
(1) i=1; k=0;while(i<n){ k=k+10*i;i++;}(2) i=1; j=0;while(i+j<=n){if (i>j) j++;else i++;}(3)x=n; // n>1while (x>=(y+1)*(y+1))y++;第二章线性表2.1下述算法的功能是什么?LinkList Demo(LinkList L){ // L是无头结点单链表ListNode *Q,*P;if(L&&L->next){Q=L;L=L->next;P=L;while (P->next) P=P->next;P->next=Q; Q->next=NULL;}return L;}// Demo答:该算法的功能是:将开始结点摘下链接到终端结点之后成为新的终端结点,而原来的第二个结点成为新的开始结点,返回新链表的头指针。
2.9设顺序表L是一个递增有序表,试写一算法,将x插入L中,并使L仍是一个有序表。
答:因已知顺序表L是递增有序表,所以只要从顺序表终端结点(设为i位置元素)开始向前寻找到第一个小于或等于x的元素位置i后插入该位置即可。
在寻找过程中,由于大于x的元素都应放在x之后,所以可边寻找,边后移元素,当找到第一个小于或等于x的元素位置i时,该位置也空出来了。
算法如下://顺序表存储结构如题2.7void InsertIncreaseList( Seqlist *L , Datatype x ){int i;if ( L->length>=ListSize)Error(“overflow");for ( i=L -> length ; i>0 && L->data[ i-1 ] > x ; i--)L->data[ i ]=L->data[ i ] ; //比较并移动元素L->data[ i ] =x;L -> length++;}2.14已知单链表L是一个递增有序表,试写一高效算法,删除表中值大于min且小于max的结点(若表中有这样的结点),同时释放被删结点的空间,这里min和max是两个给定的参数。
03、1数据结构第一部分--线性表-树与二叉树

数据结构(一)目录第1章序论 (1)1.1 什么是数据? (1)1.2 什么是数据元素? (1)1.3 什么是数据结构及种类? (1)1.4 数据的逻辑结构 (1)1.5 数据的物理结构 (1)1.6 算法和算法分析 (1)1.7 算法的五个特性 (1)1.8 算法设计的要求 (2)1.9 算法效率的度量 (2)第2章线性表 (3)2.1 线性表举例 (3)2.2 线性表的存储 (4)2.3 线性表-栈 (4)2.4 队列 (4)2.5 双端队列 (6)第3章树和二叉树 (6)3.1 树 (6)3.1.1 树的基本概念 (6)3.1.2 树的常用存储结构 (6)3.1.3 树的遍历 (7)3.2 二叉树 (7)3.2.1 二叉树的基本概念 (7)3.2.2 二叉树与树的区别 (7)3.2.3 树及森林转到二叉树 (7)3.2.4 二叉树的性质 (8)3.2.5 满二叉树 (8)3.2.6 完全二叉树 (8)3.2.7 完全二叉树的性质 (9)3.2.8 二叉树的四种遍历 (9)3.2.9 二叉排序树 (10)3.2.10 平衡二叉树 (11)3.2.11 m阶B-树 (11)3.2.12 最优二叉树 (11)3.2.13 二叉树的存储结构 (12)3.3 广义表 (13)3.4 矩阵的压缩存储 (14)3.4.1 特殊矩阵 (14)3.4.2 压缩存储 (14)第4章历年真题讲解 (15)4.1 2009年上半年 (15)4.2 2009年下半年 (15)4.3 2010年上半年 (15)4.4 2011年上半年 (16)4.5 2011年下半年 (16)4.6 2012年上半年 (17)4.7 2012年下半年 (17)4.8 2013年上半年 (18)4.9 2013年下半年 (18)4.10 2014年上半年 (18)4.11 2014年下半年 (19)4.12 2015年上半年 (19)4.13 2015年下半年 (19)4.14 2016年上半年 (20)第1章序论什么是数据?所有能输入到计算机中并能够被计算机程序处理的符号的总称,它是计算机程序加工的原料。
实验一 线性表的插入和删除

实验一线性表的插入和删除一、实验目的1、掌握用Turbo C上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找,以及线性表合并等运算在顺序存储结构和链接存储结构上的运算。
二、实验内容线性表基本操作的实现当我们要在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表的第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。
若要删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。
程序实现:typedef Null 0;typedef int datatype;#define maxsize 1024;typedef struct{ datatype data[maxsize];int last;}sequenlist;int insert(L, x, i)sequenlist *L;int i;{ int j;if ((*L).last= =maxsize-1){ printf(“overflow”);return Null;}elseif ((i<1)‖(i>(*L).last+1){ printf(“error”);return Null;}else{ for(j=(*L).last; j>=i-1; j--) (*L).data[j+1]=(*L).data[j]; (*L).data[i-1]=x;(*L).last=(*L).last+1;}return(1);}int delete(L,i)sequenlist *L;int i;{ int j;if ((i<1)‖(i>(*L).last+1)){printf (“error”);return Null;}else{ for(j=i, j<=(*L).last; j++)(*L).data[j-1]=(*L).data[j];(*L).data - -;}return(1);}void creatlist( ){ sequenlist *L;int n, i, j;printf(“请输入n个数据\n”); scanf(“%d”,&n);for(i=0; i<n; i++){ printf(“data[%d]=”, i);scanf (“%d”, (*L).data[i]);}(*L).last=n-1;print f(“\n”);}printout (L)sequenlist *L;{ int i;for(i=0; i<(*L).last; i++){ printf(“data[%d]=”, i);printf(“%d”, (*L).data[i]);}}main( ){ sequenlist *L;char cmd;int i, t;clscr( );printf(“i, I…..插入\n”);printf(“d,D…..删除\n”);printf(“q,Q……退出\n”);do{ do{cmd =getchar( );}while((cmd!=‘d’)‖(cmd!=‘D’)‖(cmd!=‘q’)‖(cmd!=‘Q’)‖(cmd!=‘i’)‖(cmd!=‘I’));switch (cmd){ case ‘i’,‘I’; scanf(&x);scanf(&i);insert(L, x, i);printout(L);break;case ‘d’,‘D’; scanf(&i);delete(L, i);printout(L);break;}}while ((cmd!=‘q’)&&( cmd!=‘Q’));}。
数据结构实验报告-实验:1线性表的顺序存储和操作实现

}
for(inti=pos-1;i<length;i++)
if(listArray[i].equals(obj))returni+1;
return-1;
}
publicbooleanmodify(Object obj,intpos){
if(pos<1||pos>length){
List sort();
}
publicclasssequenceListimplementsList {
finalintmaxSize=10;
privateintlength;
privateObject[]listArray;
publicsequenceList(){//无参数的构造函数的定义
length=0;//线性表初始为空,即长度为0
System.out.println();
list2.preOrder();
System.out.println("线性表list2长度:"+list2.size());
}
}
publicinterfaceList {
Object value(intpos);
booபைடு நூலகம்eanadd(Object obj,intpos);
int[] a={20,16,38,42,29};
for(inti=0;i<a.length;i++) list1.add(a[i], i+1);
intn1=(Integer)list1.remove(2);
list1.add(80, 3);
intn2=(Integer)list1.value(4);
数据结构线性表答案 (1)

第一章线性表2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。
解:头指针是指向链表中第一个结点的指针。
首元结点是指链表中存储第一个数据元素的结点。
头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。
它可以对空表、非空表以及首元结点的操作进行统一处理。
2.2 填空题。
解:(1) 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与元素在表中的位置有关。
(2) 顺序表中逻辑上相邻的元素的物理位置必定紧邻。
单链表中逻辑上相邻的元素的物理位置不一定紧邻。
(3) 在单链表中,除了首元结点外,任一结点的存储位置由其前驱结点的链域的值指示。
(4) 在单链表中设置头结点的作用是插入和删除首元结点时不用进行特殊处理。
2.3 在什么情况下用顺序表比链表好?解:当线性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取。
2.4 对以下单链表分别执行下列各程序段,并画出结果示意图。
解:2.5 画出执行下列各行语句后各指针及链表的示意图。
L=(LinkList)malloc(sizeof(LNode)); P=L; for(i=1;i<=4;i++){P->next=(LinkList)malloc(sizeof(LNode)); P=P->next; P->data=i*2-1;}P->next=NULL;for(i=4;i>=1;i--) Ins_LinkList(L,i+1,i*2); for(i=1;i<=3;i++) Del_LinkList(L,i);解:2.6 已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。
a. 在P结点后插入S结点的语句序列是__________________。
02272《数据结构》国开形考任务(1-4)试题答案集

02272《数据结构》国开形考任务(1-4)试题答案集任务1:数据结构基础1. 数据结构是指数据元素之间的关系和操作的组织方式。
它包括数据的逻辑结构、数据的存储结构以及对数据的操作等内容。
2. 数据结构的逻辑结构包括线性结构、树形结构、图形结构等。
3. 数据结构的存储结构包括顺序存储结构和链式存储结构。
4. 数据结构的操作包括插入、删除、查找、修改等。
5. 数据结构的选择应根据具体应用需求来确定,需要考虑数据的规模、操作的效率、存储空间的利用等因素。
任务2:线性表1. 线性表是一种最基本的数据结构,它包括顺序表和链表两种存储结构。
2. 顺序表是用一段连续的存储空间存储线性表的元素,可以通过下标直接访问元素。
顺序表的插入和删除操作需要移动其他元素,效率较低。
3. 链表是通过节点之间的指针来连接元素的,可以实现灵活的插入和删除操作。
链表的缺点是访问元素需要从头节点开始遍历,效率较低。
4. 单链表是最简单的链表结构,每个节点包含数据和指向下一个节点的指针。
5. 双链表在单链表的基础上增加了一个指向前一个节点的指针,可以实现双向遍历。
任务3:树和二叉树1. 树是一种非线性的数据结构,它包括节点和边组成。
节点之间存在一对多的关系。
2. 二叉树是一种特殊的树结构,每个节点最多有两个子节点。
3. 二叉树的遍历方式包括前序遍历、中序遍历和后序遍历。
4. 前序遍历先访问根节点,然后依次访问左子树和右子树。
5. 中序遍历先访问左子树,然后访问根节点,最后访问右子树。
6. 后序遍历先访问左子树,然后访问右子树,最后访问根节点。
任务4:图的表示和遍历1. 图是一种由节点和边组成的数据结构,节点之间存在多对多的关系。
2. 图的表示方式有邻接矩阵和邻接表两种。
3. 邻接矩阵是一个二维数组,用于表示节点之间的连接关系。
4. 邻接表是由链表构成的数组,每个节点的链表存储与其相邻的节点。
5. 图的遍历方式包括深度优先搜索和广度优先搜索。
201560140140--袁若飞--实验1:线性表地基本操作及其应用

实用标准 文档大全 数据结构 实验1:线性表的基本操作及其应用
班级:RB软工移151 学号:201560140140 姓名:袁若飞实用标准
文档大全 实验一 线性表 一、实验目的 1、帮助读者复习C++语言程序设计中的知识。 2、熟悉线性表的逻辑结构。 3、熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉链表的操作为侧重点。
二、实验内容 本次实验提供4个题目,每个题目都标有难度系数,*越多难度越大,题目一、二是必做题。题目三、题目四选作。
三、实验准备知识 1、请简述线性表的基本特性和线性表的几种基本操作的机制 ①答:线性表的基本特性是:对线性表中某个元素ai来说,称其前面的元素ai-1为ai的直接前驱,称其后前面的元素ai+1为ai的直接后继。显然,线性表中每个元素最多有一个直接前驱和一个直接后继。 ②答:线性表的几种基本操作的机制有六个: (1)初始化线性表 initial_List(L)——建立线性表的初始结构,即建空表。这也是各种结构都可能要用的运算。 (2)求表长度 List_length(L)——即求表中的元素个数。 (3)按序号取元素 get_element(L,i)——取出表中序号为i的元素 。 (4)按值查询 List_locate(L,x)——取出指定值为x的元素,若存在该元素,则返回其地址;否则,返回一个能指示其不存在的地址值或标记。 (5)插入元素 List_insert(L,i,x)——在表L的第i个位置上插入值为x的元素。显然,若表中的元素个数为n,则插入序号i应满足1<=i<=n+1。 (6)删除元素 List_delete(L,i)——删除表L中序号为i的元素,显然,待删除元素的序号应满足1<=i<=n。 2、掌握线性表的逻辑结构。
3、掌握线性表的链式存储结构。 4、熟练掌握线性表的插入、删除等操作。 实用标准 文档大全 四、实验内容 题目一:顺序表的基本操作 [问题描述] 实现顺序表的建立、求长度,取元素、修改元素、插入、删除等基本操作。 [基本要求] (1)依次从键盘读入数据,建立顺序表; (2)输出顺序表中的数据元素; (3)求顺序表的长度; (4)根据指定条件能够取元素和修改元素; (5)实现在指定位置插入和删除元素的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
开始结点
姓名 张益搏 李建峰 刘沁峰 刘俊林 性别 男 男 男 男 成绩
003的直接前驱
…
02042062
…
王娣
… 女
003的直接后继
…
终端结点
11
线性表的运算1
置空表SETNULL(L) 求长度LENGTH(L) 取结点GET(L,i) 定位LOCATE(L,x)
12
线性表的运算2
插入INSERT(L,x,i) 删除DELETE(L,i) 取直接前趋PRIOR(L,ai) 取直接后继NEXT(L,ai)
8
线性表的举例
ai的直接后继
(a1,a2,…, ai-1,ai, ai+1,…, an)
开始结点
ai的直接前驱
终端结点
9
线性表的举例
[实例 实例1] 实例
C的直接后继
(A, B, , D,…, Z)
开始结点
C的直接前驱
终端结点
10
线性表的举例
[实例 实例2] 实例
学号 02042001 02042002 02042003 02042004
ai+1的直接前驱
24
删除运算 删除运算
存储结构
0 … i-2 i-1 i i+1 L->last n-1 maxsize-1
a1
…
ai-1
ai
ai+1 ai+2 … an … …
L->last
a1
0
…
…
ai-1 ai+1 ai+2 …
i-2 i-1 i
an … …
n-1 n maxsize-1
25
算法分析
• 从上面算法可看出,顺序表的插入运算,其时间主要耗费在移动元素上, 而移动元素的个数不仅依赖于表长n,而且还与插入的位置i有关。 在第i个位置上插入一个元素的移动元素的次数为 假设
• • •
n − i +1
pi 是在第i个位置上插入一个元素的概率,
则在长度为n的线性表中插入一个元素时所需移动元素次数的期望值(平均 次数)为 n +1
32
数据打印
线性表应用实例
int locate(sequenlist *L,char string) { int i,j; for(i=0;i<=L->last;i++) if (strcmp(L->stu[i].name,string)==0) { printf(”\n Number: %6d”, L->stu[i].number ); printf(” n Name: %S”, L->stu[i].name ); printf( ”\n Sex: %c”, L->stu[i].sex ); printf( ”\n Address: %s\n”, L->stu[i].address ); return(1); }; if (i> L->last ) { printf(”Not find! \n”); return(0); } }
线性表的顺序存储结构
/* datatype可为任何 类型,这里假设为int */ #define maxsize 1024 / * 线性表可能的最 大长度,这里假设为1024 */ typedef struct { datatype data[maxsize]; int last; } sequenlist; sequenlist *L; typedef int datatype;
学生成绩登记表。
姓名 张益搏 李建峰 刘沁峰 性别 男 男 男 成绩
…
…
…
…
数据元素
表中的每一个学生记录
5
线性表的基本概念
线性表的逻辑结构定义 表的长度
线性表是由n( ≥ ) 线性表是由 (n≥0)个数据元素 a1,a2,…,an构成的 有限序列 。
记作:(a1,a2,…,an) (n>0)
6
线性表的基本概念
EIS = ∑ p i (n - i + 1)
i =1
•
任何位置上插入元素的概率相等,则
pi = 1
n
故
1 n (n - i + 1) = EIS = ∑ 2 i =1 n + 1
23
n +1
删除运算 删除运算
逻辑关系 原来线性表
ai+1的直接前驱
(a1,a2,…, ai-1,ai, ai+1,…, an) 删除后线性表 (a1,a2,…, ai-1,ai+1,…, an)
n-1 n maxsize-1
20
顺序表的基本运算
1. 插入运算
插 入 前 0 a1 1 a2 M a i− 1 ai a i+ 1 M an
先移动后插入
移 动 后 a1 a2 M a i− 1 ai M a n−1 an 插 入 后 a1 a2 M a i− 1 x ai M a n−1 an
i− 2 插 入 x i
数据删除 (2) )
按姓名查询 (3) )
打印
31
数据结构
线性表应用实例
# define M 100 / * 顺序表的最大长度*/ typedef struct {int number; char name[20]; char sex; char addr[20]; } node; typedef struct { node stu[M]; int last; } sequenlist; sequenlist *L;
la s t n − 1
la s t
21
插入运算的实现
/* 将新结点x插入顺序表L的 第i 个位置上, L是sequenlist类型的指针变量 */
int INSERT(sequenlist ∗L, int x, int i) { int j; if ((L-> last)>=maxsize−1) { printf (″overflow″); return 0; } /* 表空间溢出 */ else If ((i<1)||(i>(L-> last)+2)) { printf(″error″); return 0; } /* 非法位置 */ else { for (j=L-> last; j>=i−1;j− −) L-> data[j+1]= L-> data[j]; /* 结点后移 */ L-> data[i−1]=x; /* 插入x,存在(∗L).data[i−1]中 */ L-> last=L->last+1; /* 终端结点下标加1 */ } 22 return(1); }
14
顺序表
用一组地址连续的存储单元依次存储线性表的元素
储 址 内 状 元 序 存 地 存 态 素 号 b b+c M b+(i−1)∗c − ∗ M b+(n−1)∗c − ∗ b+n∗c ∗ a1 a2 … ai … an 1 2 M i M n 用 备 区
线性表(a1,a2,……,an) 起始位置或基地址:Loc(a1) 每个元素占用:c个空间 线性表的第i (1≤i≤n) 个元 素 ai的存储位置为
EDE = ∑ p i (n - i)
i =1
•
任何位置上插入元素的概率相等,则
pi = 1
n
故
EDE
1 n -1 (n - i) = =∑ 2 i =1 n + 1
28
n +1
线性表的优缺点
顺序表的优缺点: 优点:可以随机存取表中任意元素;其存储 位置可用一个简单直观的公式来表示。 缺点: 1. 在进行插入或删除运算时,需移动大量元 素; 2. 在给长度变化较大的线性表预先分配空间 时,必须按最大空间分配,使存储空间不 能得到充分利用; 3. 表的容量难以扩充。
删除运算
2.删除运算
删 除 前 0 a1 1 a2 M i− 2 a i− 1 i− 1 ai i a i+ 1 M a n -1 la s t an
直接移动数据元素
删 除 a1 a2 M a i− 1 a i+ 1 M a n -1 an 删 除 后 (移 动 ) a1 a2 M a i− 1 a i+ 1 a i+ 2 M an la s t
27
算法分析
• 从上面算法可看出,顺序表的删除运算,其时间主要耗费在移动元素上, 而移动元素的个数不仅依赖于表长n,而且还与删除的位置i有关。 在第i个位置上删除一个元素的移动元素的次数为 假设
• • •
n−i
pi 是在第i个位置上删除一个元素的概率,
则在长度为n的线性表中删除一个元素时所需移动元素次数的期望值(平均 次数)为 n +1
软件技术基础
第2讲 讲
1
上讲主要内容
• 软件 • 数据结构
概念 复杂度
2
线 性 表
本讲主要内容
线性表的基本概念 顺序表
3
线性表的举例
[实例 实例1] 实例
线性表
英文字母表(A, B, C, …, Z)
数据元素
表中的每一个英文字母
4
线性表的举例
[实例 实例2] 实例
线性表
学号 02042001 02042002 02042003
Loc(ai)=Loc(a1)+(i−1)∗c − ∗
15
顺序表
线性表的这种机内表示称做线性表的顺序 存储结构或顺序映象。
线性表的顺序存储结构是一种随机存取的存储结构。 线性表的顺序存储结构是一种随机存取的存储结构。 随机存取的存储结构