数据结构------线性表的链式存储结构

合集下载

数据结构 线性表

数据结构 线性表

第1讲线性表本章主要掌握如下内容:线性表的定义和基本操作,线性表的实现,线性表的顺序存储结构及链式存储结构,线性表的应用。

知识点分析(一)线性表的定义和基本操作1.线性表基本概念1)定义:是由相同类型的结点组成的有限序列。

如:由n个结点组成的线性表(a1, a2, …, a n)a1是最前结点,a n是最后结点。

结点也称为数据元素或者记录。

2)线性表的长度:线性表中结点的个数称为其长度。

长度为0的线性表称为空表。

3)结点之间的关系:设线性表记为(a1,a2,…a i-1 , a i, a i+1 ,…a n),称a i-1是a i的直接前驱结点....(简称前驱),a i+1是a i的直接后继结点....(简称后继)。

4)线性表的性质:①线性表结点间的相对位置是固定..的,结点间的关系由结点在表中的位置确定。

②如果两个线性表有相同的数据结点,但它们的结点顺序不一致,该两个线性表也是不相等的。

注意:线性表中结点的类型可以是任何数据(包括简单类型和复杂类型),即结点可以有多个成分,其中能唯一标识表元的成分称为关键字(key),或简称键。

以后的讨论都只考虑键,而忽略其它成分,这样有利于把握主要问题,便于理解。

『经典例题解析』线性表的特点是每个元素都有一个前驱和一个后继。

( )【答案】错误。

【解析】线性表的第一个数据元素没有前驱,最后一个元素没有后继。

其余的所有元素都有一个前驱和后继。

2.线性表的抽象数据类型线性表是一个相当灵活的数据结构,其长度可以根据需要增加或减少。

从操作上讲,用户不仅可以对线性表的数据元素进行访问操作,还可以进行插入、删除、定位等操作。

1)线性表的基本操作假设线性表L有数据对象 D={ai | ai∈ElemSet,i=1,2,3,…,n,n>=0},数据元素之间的关系R={<ai-1,ai>|ai-1,ai∈D,i=1,2,…,n},则线性表L的基本操作如下所示:●InitList(&L):其作用是构造一个长度为0的线性表(空线性表);●DestoryList(&L):其作用是销毁当前的线性表L;●ClearList(&L):清空线性表L,使之成为空表;●ListLength(L):返回线性表L的长度,即线性表中数据元素的个数;●ListEmpty(L) :判断线性表L是否为空表,是则返回True,否则返回False;●GetElem(L,i,&e):将线性表L中第i个数据元素的值返回到变量e中;●LocateELem(L,e,compare( )) :判断线性表L中是否存在与e满足compare()条件的数据元素,有则返回第一个数据元素;●PriorElem(L,cur_e,&pri_e):返回线性表L中数据元素cur_e的前驱结点;●NextElem(L,cur_e,&next_e):返回线性表L中数据元素cur_e的后继结点;●ListInsert(&L,i,e):向线性表L的第i个位置之前插入一个数据元素,其值为e;●ListDelete(&L,i,&e):删除线性表L的第i个数据元素,并将该数据元素的值返回到e中;●ListTraverse(L,visit()):遍历线性表中的每个数据元素。

数据结构之线性结构和非线性结构

数据结构之线性结构和非线性结构

数据结构之线性结构和⾮线性结构线性结构:⼀、概念1. 线性结构作为最常⽤的数据结构,其特点是数据元素之间存在⼀对⼀的线性关系。

2. 线性结构拥有两种不同的存储结构,即顺序存储结构和链式存储结构。

顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的,链式存储的线性表称为链表,链表中的存储元素不⼀定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。

3. 线性结构中存在两种操作受限的使⽤场景,即队列和栈。

栈的操作只能在线性表的⼀端进⾏,就是我们常说的先进后出(FILO),队列的插⼊操作在线性表的⼀端进⾏⽽其他操作在线性表的另⼀端进⾏,先进先出(FIFO),由于线性结构存在两种存储结构,因此队列和栈各存在两个实现⽅式。

⼆、部分实现1. 顺序表(顺序存储) 按照我们的习惯,存放东西时,⼀般是找⼀块空间,然后将需要存放的东西依次摆放,这就是顺序存储。

计算机中的顺序存储是指在内存中⽤⼀块地址连续的空间依次存放数据元素,⽤这种⽅式存储的线性表叫顺序表其特点是表中相邻的数据元素在内存中存储位置也相邻,如下图:1 // 倒置线性表2 public void Reverse()3 {4 T tmp = default(T);56 int len = GetLength() - 1;7 for (int i = 0; i <= len / 2; i++)8 {9 if (i.Equals(len - i))10 {11 break;12 }1314 tmp = data[i];15 data[i] = data[len - i];16 data[len - i] = tmp;17 }18 }2. 链表(链式存储) 假如我们现在要存放⼀些物品,但是没有⾜够⼤的空间将所有的物品⼀次性放下(电脑中使⽤链式存储不是因为内存不够先事先说明⼀下...,具体原因后续会说到),同时设定我们因为脑容量很⼩,为了节省空间,只能记住⼀件物品位置。

数据结构习题

数据结构习题

A.找不到
B.查找时间复杂度为O(1)
C.查找时间复杂度为O(n)
D.查找结点的次数约
为n
(14)等概率情况下,在有n个结点的顺序表上做插入结点运算,需平均移动结点的数目
为( )。
A.n
B.(n-1)/2
C. n/2
D.(n+1)
/2
(15)在下列链表中不能从当前结点出发访问到其余各结点的是(
(11)L是线性表,已知LengthList(L)的值是5,经DelList(L,2)运算后,
LengthList(L)的值是( )。
A.2
B.3
C.4
D.5
(12)单链表的示意图如下:
L
ABCDΛ
指向链表Q结点的前趋的指针是(
)。
A.L
B.P
C.Q
D.R
(13)设p为指向单循环链表上某结点的指针,则*p的直接前驱( )。
结点。
(12) 在一个长度为n的顺序表中删除第i个元素,要移动
个元
素。
(13) 在一个长度为n的顺序表中,如果要在第i个元素前插入一个元素,要后移 个
元素。
(14) 在无头结点的单链表中,第一个结点的地址存放在头指针中,而其它结点的存储
地址存放在
结点的指针域中。
(15) 当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快速度
)。
A.双向链表
B.单循环链表 C.单链表
D.双向循
环链表
(16)在顺序表中,只要知道(
),就可以求出任一结点的存储地址。
A.基地址
B.结点大小
C. 向量大小
D.基地址和结点大小
(17)在双链表中做插入运算的时间复杂度为( )。

算法与数据结构第2章 线性表

算法与数据结构第2章  线性表

利用已有基本运算求解问题 例2.1 假设有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即线性表中的数据元素即为集合中的成员。编写一 个算法求一个新的集合C=A∪B,即将两个集合的并集放在线 性表LC中。 解题思路: LC LA LC LB中不在LA中的元素
void unionList(List LA,List LB,List &LC)
该运算返回L中第 i(1≤i≤ListLength(L))个元素的值,存放在e中。
e=L->data[i-1];
return 1; } 本算法的时间复杂度为O(1)。
(7) 按元素值查找LocateElem(L,e) 该运算顺序查找第1个值域与e相等的元素的位序。若这样的元 素不存在,则返回值为0。 int LocateElem(SqList *L, ElemType e) { int i=0; while (i<L->length && L->data[i]!=e) i++; if (i>=L->length) else } return i+1; return 0;
{ int lena,lenb,lenc,i; ElemType e; InitList(LC); lena=ListLength(LA); for (i=1;i<=lena;i++) //求线性表的长度
//将LA的所有元素插入到Lc中
{ GetElem(LA,i,e); ListInsert(LC,i,e);
0
返回到 sq Main:
???
main:
引用的作用 main() { SqList *sq; InitList(sq); op(sq);

数据结构 线性表

数据结构 线性表

(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语言)

数据结构(C语言)
2、transpose算法:考虑到b.data中的行就是a.data中的列,要想得到b.data中行号为0的三元组元素,可对a.data扫描一遍,找出a.data中列号为0的元素,为后再找列号为其它的元素。
广义表
由一个大的表像数组中一样存储元素,但内部的元素可以使结构不一样的,或者是所谓的子广义表。(树和有向图也可以用广义表来表示)

树的存储结构:
1、双亲表示法(用一组连续的存储空间(一维数组)存储树中的各个结点,数组中的一个元素表示树中的一个结点,数组元素为结构体类型,其中包括结点本身的信息以及结点的双亲结点在数组中的序号,但是这样并不能反映出孩子结点之间的兄弟关系来,所以,得利用一些手法来区别兄弟,可在结点结构中增设存放第一个孩子的域和存放第一个右兄弟的域,就能较方便地实现上述操作了,在实际存储的时候,第一列是序号,第二列是数据的具体内容,第三列则是通过固定的数字关系来反映这是第几代父母,第一代也就是根结点,其为-1,一下慢慢变大。这种存储方法比较适应存储数据和查找父结点。)
队列也是一种特殊的线性表。它所有的插入操作均限定在表的一端进行,而所有的删除操作则限定在表的另一端进行。允许删除元素的一端称为队头,允许插入元素的一端称为队尾,删除元素称为出队,插入元素称为进队。(假如是一个循环队列是会出现队满和队空的情况)
队列的顺序存储结构:利用连续的存储单元存储队列。
队列的链式存储结构:利用地址对队列中的数据进行连接,但存储的数据不一定连续。
数据组织(数据、数据元素、数据项)的三个层次:数据可由若干个数据元素构成,而数据元素又可以由一个或若干个数据项组成。
四种基本的数据结构:集合、线性结构、树形结构、图状结构。
顺序存储的特点是在内存中开辟一组连续的空间来存放数据,数据元素之间的逻辑关系通过元素在内存中存放的相对位置来确定。

数据结构C语言版部分习题及答案[2]

数据结构C语言版部分习题及答案[2]

第二章习题与解答一判断题1.线性表的逻辑顺序与存储顺序总是一致的。

2.顺序存储的线性表可以按序号随机存取。

3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。

4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。

5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。

6.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。

7.线性表的链式存储结构优于顺序存储结构。

8.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。

9.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。

10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。

二单选题 (请从下列A,B,C,D选项中选择一项)1.线性表是( ) 。

(A) 一个有限序列,可以为空;(B) 一个有限序列,不能为空;(C) 一个无限序列,可以为空;(D) 一个无序序列,不能为空。

2.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。

插入一个元素时平均要移动表中的()个元素。

(A) n/2 (B) n+1/2 (C) n -1/2 (D) n3.线性表采用链式存储时,其地址( ) 。

(A) 必须是连续的;(B) 部分地址必须是连续的;(C) 一定是不连续的;(D) 连续与否均可以。

4.用链表表示线性表的优点是()。

(A)便于随机存取(B)花费的存储空间较顺序存储少(C)便于插入和删除(D)数据元素的物理顺序与逻辑顺序相同5.某链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( )存储方式最节省运算时间。

(A)单链表(B)双链表(C)单循环链表(D)带头结点的双循环链表6.循环链表的主要优点是( )。

(A)不在需要头指针了(B)已知某个结点的位置后,能够容易找到他的直接前趋(C)在进行插入、删除运算时,能更好的保证链表不断开(D)从表中的任意结点出发都能扫描到整个链表7.下面关于线性表的叙述错误的是( )。

《数据结构》习题及答案:第2章 线性表(第1次更新2012-3)

《数据结构》习题及答案:第2章 线性表(第1次更新2012-3)

第2章线性表一、选择题1.表长为N 的顺序表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均次数为(),删除一个元素需要移动的元素个数为()。

【**,★】A. (N-1)/2B. NC. N+1D. N-1E. N/2F. (N+1)/2G. (N-2)/22.线性表是具有N 个()的有限序列。

【*】A、表元素B、字符C、数据元素D、数据项E、信息3.“线性表的逻辑顺序和物理顺序总是一致的。

”这个结论是()。

【*】A、正确的B、错误的C、不一定,与具体结构有关。

4.线性表采用链式存储结构时,要求内存中可用存储单元的地址()。

【*,★】A、必须是连续的B、部分地址必须是连续的C、一定是不连续的D、连续或不连续都可以。

5.带头结点的单链表为空的判定条件是()。

【*】A、head==NULLB、head->next==NULLC、head->next==headD、head!=NULL6.不带头结点的单链表head 为空的判定条件是()。

【*】A、head==NULLB、head->next==NULLC、head->next==headD、head!=NULL7.非空的循环单链表head 的尾结点P 满足()。

(注:带头结点)【*】A、P->NEXT=NULLB、p=NULLC、p->next==headD、p==head8.在一个具有n 个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是()。

【*,★】A、O(1)B、O(n)C、O(n2)D、O(nlog2n)9.在一个单链表中,若删除P 所指结点的后继结点,则执行()。

【*,★】A、p->next=p->next->nextB、p=p->next;p->next=p->next->nextC、p->next=p->next;D、p=p->next->next;10.在一个单链表中,若在P所指结点之后插入S所指结点,则执行()。

数据结构三要素:数据逻辑结构、数据存储结构和数据的运算

数据结构三要素:数据逻辑结构、数据存储结构和数据的运算

数据结构三要素:数据逻辑结构、数据存储结构和数据的运算1. 数据的逻辑结构逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据。

它与数据的存储⽆关,是独⽴于计算机的。

数据的逻辑结构分为线性结构和⾮线性结构,线性表是典型的线性结构;集合、树和图是典型的⾮线性结构。

数据的逻辑结构分类见图1-1。

集合结构中的数据元素之间除了 “同属于⼀个集合”的关系外,别⽆其他关系。

线性结构结构中的数据元素之间只存在⼀对⼀的关系。

树形结构结构中的数据元素之间存在⼀对多的关系。

图状结构或⽹状结构结构中的数据元素之间存在多对多的关系。

2. 数据的存储结构存储结构是指数据结构在计算机中的表⽰(⼜称映像),也称物理结构。

它包括数据元素的表⽰和关系的表⽰。

数据的存储结构是逻辑结构⽤计算机语⾔的实现,它依赖于计算机语⾔。

数据的存储结构主要有:顺序存储、链式存储、索引存储和散列存储。

1) 顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元⾥,元素之间的关系由存储单元的邻接关系来体现。

其优点是可以实现随机存取,每个元素占⽤最少的存储空间;缺点是只能使⽤相邻的⼀整块存储单元,因此可能产⽣较多的外部碎⽚。

2) 链接存储:不要求逻辑上相邻的元素在物理位置上也相邻,借助指⽰元素存储地址的指针表⽰元素之间的逻辑关系。

其优点是不会出现碎⽚现象,充分利⽤所有存储单元;缺点是每个元素因存储指针⽽占⽤额外的存储空间,并且只能实现顺序存取。

3) 索引存储:在存储元素信息的同时,还建⽴附加的索引表。

索引表中的每⼀项称为索引项,索引项的⼀般形式是:(关键字,地址)。

其优点是检索速度快;缺点是增加了附加的索引表,会占⽤较多的存储空间。

另外,在增加和删除数据时要修改索引表,因⽽会花费较多的时间。

4) 散列存储:根据元素的关键字直接计算出该元素的存储地址,⼜称为Hash存储。

其优点是检索、增加和删除结点的操作都很快;缺点是如果散列函数不好可能出现元素存储单元的冲突,⽽解决冲突会增加时间和空间开销。

数据结构(二):线性表的链式存储结构

数据结构(二):线性表的链式存储结构

数据结构(⼆):线性表的链式存储结构1、为什么要使⽤链式存储结构?因为我们前⾯讲的线性表的顺序存储结构,他是有缺点的。

最⼤的缺点就是插⼊和删除时需要移动⼤量元素,这显然就需要耗费时间。

要解决这个问题,我们就需要分析⼀下为什么当插⼊和删除时,就要移动⼤量元素,因为相邻两元素的存储位置也具有相邻关系,它们在内存中的位置也是挨着的,中间没有空隙,当然就⽆法快速介⼊,⽽删除之后。

当中就会留出空隙,⾃然就需要弥补。

问题就出在这⾥。

为了解决这个问题,⾃然⽽然的就出现了链式存储结构。

2、线性表链式存储结构的特点:线性表的链式存储结构不考虑元素的存储位置,⽽是⽤⼀组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的,这就意味着,这些数据元素可以存在内存未被占⽤的任意位置。

顺序存储结构:只需要存储数据元素信息。

链式存储结构:除了要存储数据元素信息之外,还要存储⼀个指⽰其直接后继元素的存储地址。

3、关键词:数据域:存储数据元素信息的域。

指针域:存储直接后继位置的域。

指针或链:指针域中存储的信息。

结点(Node):指针域+数据域组成数据元素的存储映像。

头指针:链表中第⼀个结点的存储位置。

头节点:在单链表的第⼀个结点前附设⼀个结点,成为头结点。

头结点的数据域不可以存储任何信息,可以存储线性表的长度等附加信息,头结点的指针域存储指向第⼀个结点的指针。

4、单链表:定义:n个结点链成⼀个链表,即为线性表的链式存储结构,因此此链表的每个结点中只包含⼀个指针域,所以叫做单链表。

PS:线性链表的最后⼀个结点指针为“空”,通常⽤NILL或“^”符号表⽰。

头节点:在单链表的第⼀个结点前附设⼀个结点,成为头结点。

头结点的数据域不可以存储任何信息,可以存储线性表的长度等附加信息,头结点的指针域存储指向第⼀个结点的指针。

5、头结点与头指针的异同(1)头结点头结点是为了操作的统⼀和⽅便⽽设⽴的,放在第⼀个元素的结点之前,其数据域⼀般⽆意义(也可存放链表的长度)有了头结点,对第⼀元素结点前插⼊和删除第⼀结点,其操作就统⼀了头结点不⼀定是链表的必要素(2)头指针头指针式指向第⼀个结点的指针,若链表有头结点,则是指向头结点的指针。

线性表的链式存储结构

线性表的链式存储结构
1
线性表的链式存储结构
线性表的链式存储结构是指用一组任意的存储单 元(可以连续,也可以不连续)存储线性表中的数据 元素。为了反映数据元素之间的逻辑关系,对于每个 数据元素不仅要表示它的具体内容,还要附加一个表 示它的直接后继元素存储位置的信息。假设有一个线 性表(a,b,c,d),可用下图2所示的形式存储:
27
p
s
图 2-9
28
完整的算法:
int DuListInsert(DuLinkList *L,int i,EntryType e)
if (L.head->next==NULL) return TRUE; else return FALSE; }
12
6. 通过e返回链表L中第i个数据元素的内容 void GetElem(LinkList L,int i,EntryType *e) {
LNode *p; int j; //j为计数器,记载所经过的结点数目 if (i<1||i>ListLength(L)) exit ERROR; //检测i值的合理性 for (p=L.head,j=0; j!=i;p=p->next,j++); //找到第i个结点 *e=p->data; //将第i个结点的内容赋给e指针所指向的存储单元中 }
10
4. 求链表L的长度
int ListLength(LinkList L)
{
LNode *p;
int len;
for(p=L.head, len=0;p->next==NULL; p=p->next,len++);
return(len);
循环条件表达式 重复执行的语句

数据结构(c语言版)第三版习题解答

数据结构(c语言版)第三版习题解答
A.不确定 B.n− i+1 C.i D.n− i (4)在一个长度为n的顺序表中删除第i个元素(1<=i<=n)时,需向前移动( A )个 元素。
A.n− i B.n− i+1 C.n− i− 1 D.i (5)若长度为n的线性表采用顺序存储结构存储,在第i个位置上插入一个新元素的时 间复杂度为( A )。
定义:f (n)=O (g (n)) 当且仅当存在正的常数c和n0,使得对于所有的n≥n0,有f (n) ≤c g(n)。
2
上述定义表明,函数f顶多是函数g的c倍,除非n 小于n0。因此对于足够大的n (如n≥n0), g是f 的一个上限(不考虑常数因子c)。在为函数f 提供一个上限函数g 时,通常使用比较 简单的函数形式。比较典型的形式是含有n的单个项(带一个常数系数)。表1-1列出了一些 常用的g函数及其名称。对于表1-1中的对数函数logn,没有给出对数基,原因是对于任何大 于1的常数a和b都有logan =logbn/logba,所以logan和logbn都有一个相对的乘法系数1/logba, 其中a是一个常量。
void verge(seqlist *L)
{int t,i,j; i=0; j=L->length-1; while (i<j) { t=L->data[i]; L->data[i++]=L->data[j]; L->data[j-的,设计一个算法,插入一个值为x的结点,
数据结构
(C语言版)(第3版)
习题解析
揭安全 李云清 杨庆红 编著
江西师范大学计算机信息工程学院
联系方式:jieanquan@
2012年12月
1
第1章 绪论

《数据结构及其应用》笔记含答案 第二章_线性表

《数据结构及其应用》笔记含答案 第二章_线性表

第2章线性表一、填空题1、线性结构反映结点间的逻辑关系是一对一的。

2、线性结构的特点:1)只有一个首结点和尾结点2)除首尾结点外,其他结点只有一个直接前驱和一个直接后继3、线性表的顺序表示又称为顺序存储结构。

4、结点只有一个指针域的链表,称为单链表。

5、首尾相接的链表称为循环链表。

6、线性表的链式表示又称为非顺序映像。

7、指向链表中第一个结点的指针称为头指针。

8、链表中存储第一个数据元素的结点称为首元结点。

二、判断题1、线性表的逻辑顺序与存储顺序总是一致的。

(╳)2、顺序存储的线性表可以按序号随机存取。

(√)3、顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。

(╳)4、线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此属于同一数据对象。

(√)5、在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定相邻。

(╳)6、在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。

(√)7、线性表的链式存储结构优于顺序存储结构。

(╳)8、在线性表的顺序存储结构中,插入和删除时移动元素的个数与该元素的位置有关。

(√)9、线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。

(√)10、在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。

(╳)11、线性表的特点是每个元素都有一个前驱和一个后继。

(╳)三、单项选择题1、顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是(B)。

A.110 B.108 C.100 D.120解释:顺序表中的数据连续存储,所以第5个元素的地址为:100+2*4=108。

2、在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是(A)。

A.访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)B.在第i个结点后插入一个新结点(1≤i≤n)C.删除第i个结点(1≤i≤n)D.将n个结点从小到大排序解释:在顺序表中插入一个结点的时间复杂度都是O(n2),排序的时间复杂度为O(n2)或O(nlog2n)。

数据结构论文--关于线性表的链式结构

数据结构论文--关于线性表的链式结构

数据结构课程小论文题目:线性表的链式表示学号:090510126姓名:叶妍莉班级:090510学院:经济管理学院2011年12月8日一.引言: --------------------------------------------------------------------- 2 - 二.链表的概述 --------------------------------------------------------------- 2 -1.线性链表里的一些概念: ------------------------------------------ 3 -2.链表的有关概述: --------------------------------------------------- 3 -3.链表的存储方法: --------------------------------------------------- 4 -4.链表的分类: --------------------------------------------------------- 4 - 三.线性表的链式实现 ------------------------------------------------------ 4 -1.“插入”和“删除”操作的实现: ------------------------------ 5 -2.“合并链表”操作的实现: --------------------------------------- 6 - 四.链表的优点与缺点 ------------------------------------------------------ 6 - 五.总结 ------------------------------------------------------------------------ 7 -线性表的链式表示姓名:叶妍莉班级:090510 学号:090510126摘要:线性表对于学过数据结构的人来说都是再熟悉不过了,它是数据结构的一个基本内容,是最常用且最简单的一种数据结构。

数据结构教学课件:线性表链表

数据结构教学课件:线性表链表

头结点好处
a、由于开始结点的位置被存放在头结点的指针域中, 所以在链表的第一个位置上的操作(如插入、删 除等)就和在表的其它位置上的操作一致,无需 进行特殊处理; b、无论链表是否为空,其头指针是指向头结点的非 空指针(空表中头结点的指针域为空),头指针 始终不为空,因此空表和非空表的处理也就统一 了
}
带头结点的单链表 H
# a1 a2

an NULL
头结点
H
# NULL
头结点
linklist * initList() linklist * initList() { { linknode* pHead = (linknode*) linknode* pHead = 0; // pHead、 malloc( sizeof(linknode)); pRail分别为头、尾指针 linknode* pRail = pHead; linknode* pRail = pHead; // pHead、 char c; pRail分别为头、尾指针 char c; while( (c = getchar()) != ‘\n’) { linknode* pNode = while( (c = getchar()) != ‘\n’) { (linknode*)malloc( sizeof(linknod linknode* pNode = e )); (linknode*)malloc( sizeof( linknode scanf( "%c", &pNode->data ); )); scanf( "%c", &pNode->data ); pNode->next = 0; //新结点指 针域为空 pNode->next = 0; //新结点指针 pRail->next = pNode; 域为空 pRail = node; if( !pHead) pHead = pNode; } else pRail->next = pNode; return pHead; pRail = node; } } return pHead; }

考研《数据结构》考试大纲

考研《数据结构》考试大纲

理工大学2020年硕士学位研究生招生考试业务课考试大纲考试科目:数据结构代码:991考试的总体要求考查学生对数据的逻辑结构和物理结构的基本概念的掌握,对基本的数据结构和算法的掌握;考查学生利用基本数据结构和算法,使用C语言来解决实际科学和理论问题的思想和能力。

基本内容一、线性表1.线性表的概念及特点2.线性表的逻辑结构3.线性表的顺序及链式存储结构4.相关的各种基本运算二、栈和队列1.栈的概念、特点及存储结构2.栈的基本运算3.栈的应用4.队列的概念、特点及存储结构5.链队列、循环队列6.队列的应用及基本运算三、数组和广义表1.数组的顺序存储结构(二维及三维数组的元素地址计算)2.稀疏矩阵的压缩存储结构(三元组表、十字链表)四、树和二叉树1.二叉树的定义、性质及存储结构2.遍历二叉树和线索二叉树3.二叉树的应用五、图1.图的定义及存储结构(邻接矩阵表示和邻接表表示。

)2.图的遍历3.最小生成树4.拓扑排序六、查找1.静态表查找2.动态表查找(二叉排序树、平衡二叉树、B-树和B+树)3.哈希表的构造、哈希表的查找及分析、处理哈希冲突的方法七、内部排序1.插入排序、快速排序、选择排序、归并排序、基数排序等内部排序的特点与算法,各类排序方法的比较,时、空复杂度分析2.相关排序的应用考试题型:选择题(15%)、填空题(20%)、判断题(10%)、应用题(35%)、算法设计题(20%);其中算法设计题将着重考查学生使用C语言编程解决实际问题的能力,需要有一定的实际编程基础,而不是只会解书上的习题。

华中科技大学数据结构试题及答案

华中科技大学数据结构试题及答案

数据结构试题及答案一.是非题(每题1分共10分)1. 线性表的链式存储结构优于顺序存储结构。

F2. 栈和队列也是线性表。

如果需要,可对它们中的任一元素进行操作。

F3.字符串是数据对象特定的线性表。

T4.在单链表P指针所指结点之后插入S结点的操作是:P->next= S ; S-> next = P->next; F5.一个无向图的连通分量是其极大的连通子图。

T6.邻接表可以表示有向图,也可以表示无向图。

T7.假设B是一棵树,B′是对应的二叉树。

则B的后根遍历相当于B′的中序遍历。

T8.通常,二叉树的第i层上有2i-1个结点。

F9.对于一棵m阶的B-树,树中每个结点至多有m 个关键字。

除根之外的所有非终端结点至少有ém/2ù个关键字。

F10.对于任何待排序序列来说,快速排序均快于起泡排序。

F 二.选择题(每题2分共28分)1.在下列排序方法中,(c )方法平均时间复杂度为0(nlogn),最坏情况下时间复杂度为0(n2);( d )方法所有情况下时间复杂度均为0(nlogn)。

a. 插入排序b. 希尔排序c. 快速排序d. 堆排序2. 在有n个结点的二叉树的二叉链表表示中,空指针数为(b )。

a.不定b.n+1c.nd.n-13. 下列二叉树中,(a )可用于实现符号不等长高效编码。

a.最优二叉树b.次优查找树c.二叉平衡树d.二叉排序树4. 下列查找方法中,(a )适用于查找有序单链表。

a.顺序查找b.二分查找c.分块查找d.哈希查找5. 在顺序表查找中,为避免查找过程中每一步都检测整个表是否查找完毕,可采用(a )方法。

a.设置监视哨b.链表存贮c.二分查找d.快速查找6. 在下列数据结构中,( c )具有先进先出特性,( b )具有先进后出特性。

a.线性表b.栈c.队列d.广义表7.具有m个结点的二叉排序树,其最大深度为(f ),最小深度为(b )。

a. log 2 mb. └ log2 m ┘ +1c. m/2d .┌ m/2 ┐ -1 e. ┌ m/2 ┐ f. m8.已知一组待排序的记录关键字初始排列如下:56,34,58,26,79,52,64,37,28,84,57。

数据结构期末复习重点知识点总结

数据结构期末复习重点知识点总结

第一章绪论一、数据结构包括:逻辑结构、存储结构、运算(操作)三方面内容。

二、线性结构特点是一对一。

树特点是一对多图特点是多对多三、数据结构的四种存储结构:顺序存储、链式存储、索引存储、散列存储顺序存储结构和链式存储结构的区别?线性结构的顺序存储结构是一种随机存取的存储结构。

线性结构的链式存储是一种顺序存取的存储结构。

逻辑结构分类:集合线性树图,各自的特点。

或者分为线性结构和非线性结构。

四、算法的特征P13五、时间复杂度(1) i=1; k=0;while(i<n){ k=k+10*i;i++;}分析:i=1; //1k=0; //1while(i<n) //n{ k=k+10*i; //n-1i++; //n-1}由以上列出的各语句的频度,可得该程序段的时间消耗:T(n)=1+1+n+(n-1)+(n-1)=3n可表示为T(n)=O(n)六、数据项和数据元素的概念。

第二章线性表一、线性表有两种存储结构:顺序存储和链式存储,各自的优、缺点。

二、线性表的特点。

三、顺序表的插入、思想、时间复杂度o(n)、理解算法中每条语句的含义。

(1)插入的条件:不管是静态实现还是动态实现,插入的过程都是从最后一个元素往后挪动,腾位置。

静态是利用数组实现,动态是利用指针实现。

不管静态还是动态,在表中第i个位置插入,移动次数都是n-i+1。

四、顺序表的删除、思想、时间复杂度o(n)、理解算法中每条语句的含义。

(1)删除的条件:不管是静态实现还是动态实现,删除的过程都是从被删元素的下一位置向前挪动。

静态是利用数组实现,动态是利用指针实现。

不管静态还是动态,删除表中第i个元素,移动次数都是n-i。

五、顺序表的优缺点?为什么要引入链表?答:顺序表的优点是可以随机存取,缺点是前提必须开辟连续的存储空间且在第一位置做插入和删除操作时,数据的移动量特别大。

如果有一个作业是100k,但是内存最大的连续存储空间是99K,那么这个作业就不能采用顺序存储方式,必须采用链式存储方式。

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

/*实验二:线性表的链式存储结构
(实验性质:验证性实验)
设计并实现以下算法:给出用单链表存储多项式的结构,利用后接法生成多项式的单链表结构,
实现两个多项式相加的运算,并就地逆置相加后的多项式链式。

*/
#include"stdio.h"
#include"stdlib.h"
typedef struct Lnode //线性表单向列表存储结构
{
int data;
int zhishu;
struct Lnode *next;
}Lnode,*Linklist;
Linklist createlist() //创建多项式
{ int n=1;
Linklist L,A;
printf("输入多项式第1项的常数和指数(注意:结束请输入0 0!!!):\n");
A=L=(Linklist)malloc(sizeof(Lnode));
scanf("%d%d",&L->data,&L->zhishu);
while(L->data)
{
printf("输入多项式第%d项的常数和指数(注意:结束请输入0 0!!!):\n",++n);
L=L->next=(Linklist)malloc(sizeof(Lnode)); //在L后面开辟一个空间scanf("%d%d",&L->data,&L->zhishu);
}
L->next=NULL;
return A;
}
void shuchu(Linklist L) //输出多项式
{
while(L->next->next!=NULL)
{
printf("%d*a^%d+",L->data,L->zhishu);
L=L->next;
}
printf("%d*a^%d\n\n",L->data,L->zhishu);
}
Linklist lianjie(Linklist La,Linklist Lb) //把Lb接在La上
{
Linklist L=La;
while(La->next->next!=NULL)
La=La->next;
La->next=Lb;
return L;
}
//还是有问题???
Linklist hebing(Linklist La) //合并同指数项
{
Linklist L,L1,L2=La;
while(La->next->next!=NULL)
{ L1=La;
L=La->next;
while(L->next!=NULL)
{
if(La->zhishu==L->zhishu) //L后移,L1不动,只需修改L1->next的指针为L->next
{La->data=La->data+L->data;
L1->next=L->next; //把L->next的地址给L1->next
free(L); //释放L
L=L1->next; //把L1->next的地址给L
}
else
{L1=L1->next; //L1后移
L=L->next; //L后移
}
}
La=La->next;
}
return L2;
}
void sc1(Linklist L) //输出合并后的多项式
{
while(L->next->next!=NULL)
{ if(L->data!=0)
printf("%d*a^%d+",L->data,L->zhishu);
L=L->next;
}
if(L->data!=0)
printf("%d*a^%d\n\n",L->data,L->zhishu);
}
Linklist nizhi(Linklist L) //逆置
{
Linklist p,q,r=L;
p=L;
q=p->next;
while(q!=NULL)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
L->next=NULL;
L=p;
return L;
}
void sc(Linklist L) //输出逆置多项式
{
L=L->next;
while(L->next!=NULL)
{
printf("%d*a^%d+",L->data,L->zhishu);
L=L->next;
}
printf("%d*a^%d\n\n",L->data,L->zhishu); }
void main()
{
Linklist La,Lb,Lc;
La=createlist();
printf("La多项式为:\n");
shuchu(La);
Lb=createlist();
printf("Lb多项式为:\n");
shuchu(Lb);
Lc=lianjie(La,Lb);shuchu(Lc);
Lc=hebing(Lc);
printf("合并后的多项式为:\n");
sc1(Lc);
Lc=nizhi(Lc);
printf("逆置多项式为:\n"); sc(Lc);
}。

相关文档
最新文档