数据结构—线性表的两种存储结构的比较

合集下载

习题二和上机答案

习题二和上机答案

习题二⒉1描述以下四个概念的区别:头指针变量,头指针,头结点,首结点(第一个结点)。

解:头指针变量和头指针是指向链表中第一个结点(头结点或首结点)的指针;在首结点之前附设一个结点称为头结点;首结点是指链表中存储线性表中第一个数据元素的结点。

若单链表中附设头结点,则不管线性表是否为空,头指针均不为空,否则表示空表的链表的头指针为空。

2.2简述线性表的两种存储结构有哪些主要优缺点及各自使用的场合。

解:顺序存储是按索引直接存储数据元素,方便灵活,效率高,但插入、删除操作将引起元素移动,降低了效率;而链式存储的元素存储采用动态分配,利用率高,但须增设表示结点之间有序关系的指针域,存取数据元素不如顺序存储方便,但结点的插入和删除十分简单。

顺序存储适用于线性表中元素数量基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素的情况;而链式存储适用于频繁进行元素动态插入或删除操作的场合。

2.3 在头结点为h的单链表中,把值为b的结点s插入到值为a的结点之前,若不存在a,就把结点s插入到表尾。

Void insert(Lnode *h,int a,int b){Lnode *p,*q,*s;s=(Lnode*)malloc(sizeof(Lnode));s->data=b;p=h->next;while(p->data!=a&&p->next!=NULL){q=p;p=p->next;}if (p->data==a){q->next=s;s->next=p;}else{p->next=s;s->next=NULL;}}2.4 设计一个算法将一个带头结点的单链表A分解成两个带头结点的单链表A和B,使A中含有原链表中序号为奇数的元素,而B中含有原链表中序号为偶数的元素,并且保持元素原有的相对顺序。

Lnode *cf(Lnode *ha){Lnode *p,*q,*s,*hb;int t;p=ha->next;q=ha;t=0;hb=(Lnode*)malloc(sizeof(Lnode));s=hb;while(p->next!=NULL){if (t==0){q=p;p=p->next;t=1;}else{q->next=p->next;p->next=s->next; s->next=p; s=p;p=p->next; t=0;}}s->next=NULL;return (hb);}2.5设线性表中的数据元素是按值非递减有序排列的,试以不同的存储结构,编写一算法,将x插入到线性表的适当位置上,以保持线性表的有序性。

数据结构习题及答案与实验指导(线性表)2

数据结构习题及答案与实验指导(线性表)2

第2章线性表线性表是一种最基本、最常用的数据结构,它有两种存储结构——顺序表和链表。

本章主要介绍线性表的定义、表示和基本运算的实现。

重点讨论了线性表的存储结构,以及在顺序、链式两种存储结构上基本运算的实现。

重点提示:●线性表的逻辑结构特征●线性表的顺序存储和链式存储两种存储结构的特点●在两种存储结构下基本操作的实现2-1 重点难点指导2-1-1 相关术语1.线性表线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,通常记为:(a1,a2,…,a n),其中n为表长,n=0时称为空表。

要点:一种逻辑结构,其数据元素属于相同数据类型,之间的关系是线性关系。

2.顺序表顺序存储的线性表。

要点:按线性表中的元素的逻辑顺序依次存放在地址连续的存储单元里,其存储特点:用物理上的相邻实现逻辑上的相邻。

3.链表用链表存储的线性表。

要点:链表是通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的,对每个结点的地址是否连续没有要求。

4.单链表每个结点除了数据域外还有一个指向其后继的指针域。

要点:通常将每个元素的值和其直接后继的地址作为一个结点,通过每个结点中指向后继结点的指针表示线性表的逻辑结构。

5.头指针要点:头指针是一个指针变量,里面存放的是链表中首结点的地址,并以此来标识一个链表。

如链表H,链表L等,表示链表中第一个结点的地址存放在指针变量H、L中。

通常用头指针来惟一标识一个链表。

6.头结点要点:附加在第一个元素结点之前的一个结点,头指针指向头结点。

当该链表表示一个非空的线性表时,头结点的指针域指向第一个元素结点;为空表时,该指针域为空。

7.头结点的作用要点:其作用有两个,一是使对空表和非空表的处理得到统一;二是在链表的第一个位置上的操作和在其他位置上的操作一致,无需特殊处理。

2-1-2 线性表的顺序存储1.顺序表顺序存储的线性表称为顺序表。

其特点是:用一组地址连续的存储单元来依次存放线性表的数据元素,因此数据元素的逻辑顺序和物理次序一致(这是顺序存储的核心所在)。

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

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

数据结构之线性结构和⾮线性结构线性结构:⼀、概念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. 链表(链式存储) 假如我们现在要存放⼀些物品,但是没有⾜够⼤的空间将所有的物品⼀次性放下(电脑中使⽤链式存储不是因为内存不够先事先说明⼀下...,具体原因后续会说到),同时设定我们因为脑容量很⼩,为了节省空间,只能记住⼀件物品位置。

数据结构第二章:线性表

数据结构第二章:线性表
实现逻辑上相邻—物理地址相邻 实现逻辑上相邻— 实现随机存取 实现随机存取
实现:可用C 实现:可用C语言的一维数组实现
6
V数组下标 0 1
内存 a1 a2
元素序号 1 2
typedef int DATATYPE; #define M 1000 DATATYPE data[M]; 例 typedef struct card { int num; char name[20]; char author[10]; char publisher[30]; float price; }DATATYPE; DATATYPE library[M];
4
{加工型操作 加工型操作} 加工型操作
ClearList( &L ) 初始条件:线性表 L 已存在。 操作结果:将 L 重置为空表。 PutElem( &L, i, &e ) 初始条件:线性表L已存在,1≤i≤LengthList(L)。 操作结果:L 中第 i 个元素赋值同 e 的值 ListInsert( &L, i, e ) 初始条件:线性表 L 已存在,1≤i≤LengthList(L)+1。 操作结果:在 L 的第 i 个元素之前插入新的元素 e,L 的长度增1。 ListDelete( &L, i, &e ) 初始条件:线性表 L 已存在且非空,1≤i≤LengthList(L)。 操作结果:删除 L 的第 i 个元素,并用 e 返回其值,L 的长度减1。 }ADT LIST
3
PriorElem( PriorElem L, cur_e, &pre_e ) 初始条件:线性表 L 已存在。 操作结果:若 cur_e 是 L 中的数据元素,则用 pre_e 返回 它的前驱,否则操作失败,pre_e 无定义。 NextElem( NextElem L, cur_e, &next_e ) 初始条件:线性表 L 已存在。 操作结果:若 cur_e 是 L 中的数据元素,则用 next_e 返 回它的后继,否则操作失败,next_e 无定义。 GetElem( GetElem L, i, &e ) 初始条件:线性表 L 已存在,1≤i≤LengthList(L)。 操作结果:用 e 返回 L 中第 i 个元素的值。 LocateElem( LocateElem L, e, compare( ) ) 初始条件:线性表 L 已存在,compare( ) 是元素判定函数。 操作结果:返回 L 中第1个与 e 满足关系 compare( ) 的元 素的位序。若这样的元素不存在,则返回值为0。 ListTraverse(L, visit( )) ListTraverse 初始条件:线性表 L 已存在,visit( ) 为元素的访问函数。 操作结果:依次对 L 的每个元素调用函数 visit( )。 一旦 visit( ) 失败,则操作失败。

数据结构复习指南

数据结构复习指南
{
front=pQ->rear->next;p=front->next;
front->next=p->next;*pd=p->data;if(pQ->rear==p)pQ->rear=front;free(p);pQ->len--;}
returnflg;}
第六章树和二叉树
1、二叉树的性质及其证明。
性质1:
s=(LiStack *)malloc(sizeof(LiStack));
s->next=NULL;
return s;
}
(2)进栈Push(&s,e)
将新数据结点插入到头结点之后。对应算法如下:
void Push(LiStack *s,ElemType e)
{
LiStack *p;
p=(LiStack *)malloc(sizeof(LiStack));
p=Preorder(T->lchild, x);
if(p) //返回值不是空指针,则表示x在左子树中
return(p);
else
return(Preorder(T->rchild, x)) ;
}
统计二叉树中叶子结点的个数
void PreOrder (BiTree T){
if ( T ) {
if ((!T->lchild)&& (!T->rchild))
2、定义线性表顺序存储结构。
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性的数据元素。
优点:随机存取表中元素。缺点:插入和删除操作需要移动元素。
3、顺序表存储结构下初始化、取第i个数据元素、插入、删除、定位Locate、销毁操作的实现。

(完整word版)数据结构简答题打印版1

(完整word版)数据结构简答题打印版1

数据结构简答题1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。

解:数据是对客观事物的符号表示。

在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。

数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

数据对象是性质相同的数据元素的集合,是数据的一个子集。

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

存储结构是数据结构在计算机中的表示。

数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。

是对一般数据类型的扩展。

1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。

解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。

一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。

抽象数据类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。

在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。

1.7 在程序设计中,可采用下列三种方法实现输出和输入:(1) 通过scanf和printf语句;(2) 通过函数的参数显式传递;(3) 通过全局变量隐式传递。

试讨论这三种方法的优缺点。

解:(1)用scanf和printf直接进行输入输出的好处是形象、直观,但缺点是需要对其进行格式控制,较为烦琐,如果出现错误,则会引起整个系统的崩溃。

(2)通过函数的参数传递进行输入输出,便于实现信息的隐蔽,减少出错的可能。

(3)通过全局变量的隐式传递进行输入输出最为方便,只需修改变量的值即可,但过多的全局变量使程序的维护较为困难。

2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。

数据结构习题与答案

数据结构习题与答案
A、所有的操作算法实现简单B、便于随机存储
C、便于插入和删除D、便于利用零散的存储器空间
3.若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素算法的时间复杂度为C。
A、O(log2n) B、O(1)
C、O(n) D、O(n2)
4.(1)静态链表既有顺序存储的特点,又有动态链表的优点。所以,它存取表中第i个元素的时间与i无关;
4、线性结构的特征:逻辑上满足有且仅有一个开始结点和一个终端结点,且其余结点有且仅有唯一的一个直接前趋和一个直接后继。
5.数据的存储结构被分为顺序、链接、索引和散列4种。
6.存储结构是逻辑结构的存储实现,其基本目标是建立数据的机内表示。
7.数据表示任务是逐步完成的,即数据表示形式的变化过程是:机外表示→
A、带尾指针的非循环链表B、带尾指针的循环链表
C、带头指针的非循环链表D、带头指针的循环链表
2、若用一个大小为6的数组来实现循环队列,且当rear和front的值分别为0和3。当从队列中删除一个元素,再加入两个元素后,rear和front的值分别是B。
A、1和5 B、2和4
C、4和2 D、5和1
3、设栈的输入序列为1、2、3、4,则C不可能是其出栈序列。
push (s,x); }
push (s,x); printf(x)
push(s,y); }
push(s,x);
push(s,'E');
push(s,x);
此题的输出结果是HELOLLL。
5、以下为单链表删除运算,分析算法,请在处填上正确的语句。
void delete_lkist(lklist head,int i)
D、q->next=p->next;q->prior=p;p->next=q;p->next=q;

数据结构(C++版)课后答案 (王红梅)第2章 线性表

数据结构(C++版)课后答案 (王红梅)第2章 线性表

第 2 章线性表课后习题讲解1. 填空⑴在顺序表中,等概率情况下,插入和删除一个元素平均需移动()个元素,具体移动元素的个数与()和()有关。

【解答】表长的一半,表长,该元素在表中的位置⑵顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的存储地址是()。

【解答】108【分析】第5个元素的存储地址=第1个元素的存储地址+(5-1)×2=108⑶设单链表中指针p 指向结点A,若要删除A的后继结点(假设A存在后继结点),则需修改指针的操作为()。

【解答】p->next=(p->next)->next⑷单链表中设置头结点的作用是()。

【解答】为了运算方便【分析】例如在插入和删除操作时不必对表头的情况进行特殊处理。

⑸非空的单循环链表由头指针head指示,则其尾结点(由指针p所指)满足()。

【解答】p->next=head【分析】如图2-8所示。

⑹在由尾指针rear指示的单循环链表中,在表尾插入一个结点s的操作序列是();删除开始结点的操作序列为()。

【解答】s->next =rear->next; rear->next =s; rear =s;q=rear->next->next; rear->next->next=q->next; delete q;【分析】操作示意图如图2-9所示:⑺一个具有n个结点的单链表,在指针p所指结点后插入一个新结点的时间复杂度为();在给定值为x的结点后插入一个新结点的时间复杂度为()。

【解答】Ο(1),Ο(n)【分析】在p所指结点后插入一个新结点只需修改指针,所以时间复杂度为Ο(1);而在给定值为x的结点后插入一个新结点需要先查找值为x的结点,所以时间复杂度为Ο(n)。

⑻可由一个尾指针唯一确定的链表有()、()、()。

【解答】循环链表,循环双链表,双链表2. 选择题⑴线性表的顺序存储结构是一种()的存储结构,线性表的链接存储结构是一种()的存储结构。

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

在两种存储结构下实现线性表的创建,插入,删除,按值查找一、使用线性表的链式存储结构实现#include <stdio.h>#include <stdlib.h>typedef struct LNode{int data; //链表数据struct LNode* next; //链表指针}LNode,*LinkList;/*头插法-建立单链表*/LinkList HeadCreate(LinkList la){int num;la=(LinkList)malloc(sizeof(LNode)); //建立头结点la->next=NULL;scanf("%d",&num);while(num!=10){LNode *p=(LinkList)malloc(sizeof(LNode));p->data=num;p->next=la->next;la->next=p;scanf("%d",&num);}return la;}/*尾插法-建立单链表*/LinkList TailCreate(LinkList la){int num;la=(LinkList)malloc(sizeof(LNode));la->next=NULL;LinkList s,r=la;scanf("%d",&num);while(num!=10){s=(LinkList)malloc(sizeof(LNode));s->data=num;r->next=s;r=s;scanf("%d",num);}r->next=NULL;return la;}/*单链表遍历*/void TravelList(LinkList la){LinkList p=la->next;while(p!=NULL){printf("%d->",p->data);p=p->next;}printf("\n");}/*单链表的按位查找*/LinkList GetElem(LinkList la,int i){int j=1;LNode* p=la->next;if(i<1)return NULL;while(p && j<i){p=p->next;j++;}return p;}/*单链表的按值查找*/LinkList LocalElem(LinkList la,int e) {LNode* p=la->next;while(p!=NULL && p->data!=e)p=p->next;return p;}/*单链表插入操作*/bool InsertList(LinkList la,int i,int e){//在la链表中的i位置插入数值eint j=1;LinkList p=la,s;while(p && j<i){p=p->next;j++;}if(p==NULL)return false;if((s=(LinkList)malloc(sizeof(LNode)))==NULL)return false;s->data=e;s->next=p->next;p->next=s;return true;}/*单链表删除操作*/bool DeleteList(LinkList la,int i){int j=1;LinkList p=la,q;while(p && j<i) //p指向第i-1个元素{p=p->next;j++;}if(p==NULL || p->next==NULL) //表示不存在第i-1个和第i的元素return false;q=p->next;p->next=q->next;free(q);return true;}/*单链表的表长*/int LengthList(LinkList la)int nLen=0;LinkList p=la->next;while(p){p=p->next;nLen++;}return nLen;}/*单链表逆置*/LinkList Reserve(LinkList la){if(la==NULL || la->next==NULL)return la;LinkList p=la->next,q=p->next,r=q->next;la->next=NULL;p->next=NULL;while(r!=NULL){q->next=p;p=q;q=r;r=r->next;}q->next=p;la->next=q;return la;}int main(){LNode la;LinkList p;p=HeadCreate(&la); //头插法创建单链表TravelList(p);printf("%p\n",GetElem(p,1)); //获得第1个结点地址InsertList(p,2,10); //在链表的第2个位置插入元素10TravelList(p);DeleteList(p,3); //删除链表的第3个元素TravelList(p);printf("%d\n",LengthList(p)); //获得链表长度p=Reserve(p);TravelList(p);return 0;}//运行结果//5 6 12 7 8 14 9 3 2 5 14 10头插法创建链表//14->5->2->3->9->14->8->7->12->6->5-> 显示链表//00382490第一个结点的地址//14->10->5->2->3->9->14->8->7->12->6->5-> 插入元素值为10的结点//14->10->2->3->9->14->8->7->12->6->5-> 删除第三个结点//11 获//5->6->12->7->8->14->9->3->2->10->14-> 链表逆置//Press any key to continue二、使用线性表的顺序存储结构实现#include<stdio.h>#define MaxSize 50struct SqList{int data[MaxSize]; //存放顺序表的元素int length; //存放顺序表的长度};/*顺序表的插入操作*/bool InsertList(SqList&L,int i,int e){//在顺序表中第i个位置插入数值eint j;if(i<1 || i>L.length)return false;if(L.length>MaxSize)return false;for(j=L.length;j>=i;j--) //将第i个起得数据后移L.data[j]=L.data[j-1];L.data[j]=e;L.length++;return true;}/*顺序表的删除*/bool DeleteList(SqList&L,int i){//删除顺序表中第i个元素int j;if(i<1 || i>L.length)return false;for(j=i;j<L.length;j++)L.data[j-1]=L.data[j];L.length--;return true;}/*顺序表的按值查找*/int LocateElem(SqList&L,int e){for(int i=0;i<L.length;i++)if(L.data[i]==e)return i+1;return 0;}/*顺序表的输出*/void OutPutList(SqList&L){for(int i=0;i<L.length;i++)printf("%d ",L.data[i]);printf("\n");}int main(){SqList list;int A[5]={1,4,7,2,10};/*初始化顺序表*/for(int i=0;i<5;i++)list.data[i]=A[i];list.length=5;OutPutList(list);InsertList(list,3,12);OutPutList(list);DeleteList(list,3);OutPutList(list);printf("%d\n",LocateElem(list,10));return 0;}//运行结果//1 4 7 2 10 创建并输出顺序表//1 4 12 7 2 10 在3的位置插入值为12的元素//1 4 7 2 10 删除第三个元素//5 输出值为10的元素的位置//Press any key to continue上面是我用两种存储方式实现线性表的创建、插入、删除和按值查找的功能,还包含一些额外的功能,你可以自己根据我的代码改进,让代码更符合你的要求。

线性表的顺序存储和链接存储结构的比较1. 顺序存储结构:优点:1)随机存取(时间复杂度为O(1));2)无需为表示表中元素之间的逻辑关系而增加额外的存储空间;缺点:1)插入、删除操作需要移动大量元素,效率低(时间复杂度为O(n));2)表的长度难以确定2. 链式存储结构优点:1)插入、删除不需要移动数据,效率高(时间复杂度为O(1));缺点:1)存取时需要遍历,效率低(时间复杂度为O(n));3、适用的场合顺序存储结构:频繁查找,很少插入、删除;链式存储结构:频繁插入、删除;。

相关文档
最新文档