第二章线性表

一. 基本要求、重点、难点

本章主要介绍线性表的逻辑结构和各种存储表示方法,以及定义在逻辑结构上的各种基本运算及其在存储结构上怎样实现这些基本算法。本章的重点是熟练掌握顺序表(即线性表的顺序存储)和单链表上实现各种基本算法以及相关的时间复杂度分析。难点是可以使用本章所学到的基本知识设计有效算法,解决与线性表相关的应用问题。

二. 考核目标和考核要求

要求达到识记层次的有:线性表的逻辑结构特征、线性表上定义的基本运算,并能利用基本运算构造出较复杂的运算。

要求达到理解层次的有:顺序表和链表的主要优缺点、针对线性表上所须要运行的主要操作,知道选择顺序表还是链表作为其存储结构才干取得较优的时空性能。

要求达到综合应用层次有:顺序表的含义及特点,即顺序表怎样反映线形表中元素之间的逻辑关系;顺序表上的插入、删除操作及其平均时间性能分析;利用顺序表设计算法解决简单的应用问题。链表怎样表示线性表中元素之间的逻辑关系。链表中头指针和头结点的使用;单链表、双链表、循环链表链接方式上的差别;单链表上实现的建表、查找、插入和删除等基本算法、并分析其时间复杂度;循环表上尾指针代替头指针的作用。以及单循环链表上的算法与单链表上对应算法的异同点;双链表的定义及其相关的算法;利用链表设计算法解决简单的应用问题。

三. 练习

1. 单项选择题

1.1假设一个顺序表中第一个元素的存储地址为1000。每一个元素占4个地址单元,那么,第6个元素的存储地址应是( A )

A)  1020

B)  1010

C)  1016

D)  1024

凝视:利用计算存储地址的公式计算为Loc(ai)=Loc(a1)+L*(i-1):1000+4*(6-1)=1020。

1.2带头结点的单链表(以head为头指针)为空的推断条件是(  C )

A) head!=NULL

B) head->next==head

C) head->next==NULL

D) head==NULL

凝视:带头结点的单链表为空的条件是:head->next==NULL。

1.3对顺序存储的线性表,设其长度为n,在不论什么位置上删除操作都是等概率的。删除一个元素时大约要移动表中元素的个数是(  D  )

A) n/2

B)( 1)/2

C) n-1

D)( n-1)/2

凝视:对于顺序存储的线性表,设其长度为n,在不论什么位置上删除操作都是等概率的。插入一个元素大约须要移动n/2个元素,删除一个元素大约须要移动(n-1)/2个元素。

1.4链表不具有的特点是(  A  )

A) 可随机訪问任一元素

B) 插入删除不须要移动元素

C) 不必事先预计存储空间

D) 所需空间与线性表长度成正比

1.5 L是线性表,已知Length(L)的值是5。经运算Delete(L。2),后Length(L)的值是(  C  )

A) 5

B) 0

C) 4

D) 6

1.6在一个单链表中。若删除p指向结点的后继结点,则运行的操作为(  A )

A)    q=p->next;p->next=p->next->next。dispose(q);

B)    p=p->next;q=p->next;p=q->next。dispose(q)。

C)    q=p->next->next;p=p->next;dispose(q)。

A) p=p->next->next;q=p->next。dispose(q)。

1.7在线性表中。哪些元素仅仅有一个直接前驱和一个直接后继(  C )

A) 首元素

B) 尾元素

C) 中间的元素

D) 全部的元素

凝视:线性表的首元素仅仅有一个直接后继。尾元素仅仅有一个直接前驱,中间的元素仅仅有一个前驱元素和后继元素。

1.8在单循环链表中。已知q指向p指向结点的前驱结点,若在q。p所指结点之间插入一个s所指向的新结点,则运行的操作是(  A )

A)q->next=s,s->next=p。

B)p->next=s;s->next=q;

C)s->next=p->next;p->next=s;

D)p->next=s->next;s->next=p。

2. 填空题

2.1在一个长度为n的顺序表中第i个元素之前插入一个元素时,须要后移[n-i+1]个元素

2.2在一个长度为n的顺序表中删除第i个元素须要向前移动[n-1]个元素

2.3顺序表中逻辑相邻的元素,在物理位置上[相邻]

2.4在用p指针訪问单链表时,推断表没有訪问结束的条件是[p!=NULL]

2.5线性表a的元素长度为L。在顺序存储结构下Loc(ai)=Loc(a1)+[L*(i-1)]

2.6在单链表中除首结点外。随意结点的存储位置都由[直接前驱]结点中的指针表示

2.7在单链表中。设置表头结点的作用是插入或删除首结点时不必对[表头指针]进行处理

2.8循环链表S是空表的条件是[s->next==s]

2.9双向链表S是空表的条件是[s->next==s->prior==s]

3. 简答题

3.1线性表有两种存储结构。即顺序表和链表,这两种存储表示各有什么优缺点?

答:

a,表的顺序存储表示结构简单,不须要额外的存储空间,数据记录在逻辑上相邻,在存储位置上亦相邻。可随机存取。有些运算easy实现;但在做插入和删除运算时要移动大量的元素,表长是固定的。不易扩展。

b.链式存储表示是动态结构。表长可随意扩充,插入和删除不须要移动大量的元素;但不能随机存取,须要添加对应的存储空间。

3.2在链表结构中,头结点与開始结点有什么差别?

答: 在開始结点之前附设的一个结点称为头结点。它的数据域值是无意义的,而開始结点是链表中存储线性表中第一个元素的结点。

3.3哪些链表从尾指针出发能够訪问到链表中的任何位置?

答:循环链表和双向链表

4. 算法设计

4.1在顺序表中第i个位置上插入元素x

void InsertList(SeqList *L,DataType x,int i)

{//将新结点x插入L所指的顺序表的第i个结点ai的位置上

int j;

if(i<1||i>L->length+1)

Errr(“position error”); //非法位置。退出执行

if(L->length>=ListSize)

Error(“overflow”); //表空间溢出。退出执行

for(j=L->Length-1;j>=i-1;j--)

L->data[j+1]=L->data[j];

L->data[i-1]=x;

L->length++;}

4.2将顺序表中位置为i的元素删除

voidDeleteList(SeqList *L,int i)

{//从L所指的顺序表中删除第i个结点ai

int j;

if(i<1||i>L->length)

Error(“position error”);//非法位置

for(j=i;j<=L->length-1;j++)

L->data[j-1]=L->data[j];

L->length--;  //表长减小

}

4.3头插法建立单链表

LinkList CreateListF(void)

{//返回单链表的头指针

char ch;

LinkList head;         //头指针

ListNode *s;           //工作指针

head=NULL;             //链表開始为空

ch=getchar( );         //读第一个字符

while(ch!=’\n’)

{s=(ListNode *)malloc(sizeof(ListNode));

s->data=ch;     //将读入的数据放入新结点的数据域中

s->next=head;

head=s;

ch=getchar( );    //读入下一个字符}

return head;    //返回头指针

}

4.4尾插法建立单链表

LinkList CreateListR(void)

{ char ch;

LinkList head;

ListNode *s,*r;

head=NULL;r=NULL;     //链表初值为空,尾指针初值为空

while((ch=getchar( ))!=’\n’)

{s=(ListNode *)malloc(sizeof(ListNode));

s->data=ch;

if(head==NULL)

head=s;

else r->next=s;

r=s;}

if(r!=NULL)

r->next=NULL;   //对于非空表,将尾结点指针域置空

return head;}

4.5在链表中查找序号为i的结点

ListNode *GetNode(LinkList head,int i)

{//在带头结点的单链表head中查找第i个结点,若找到(0≤i≤n),则返回该结点的存储位置,否则返回NULL

int j。

ListNode *p;

p=head;j=0。 //从头结点開始扫描

while(p->next&&j<i)

{ //顺指针向后扫描,直到p->next为NULL或j=i为止

p=p->next;

j++;}

if(i==j)  return p。 //找到了第i个结点

else return NULL; //当i<0或i>n时。找不到第i个结点}

4.6将值为x的结点插入到单链表的第i个位置上

void InsertList(LinkList head,DataType x,int i)

{//将值为x的新结点插入到带头结点的单链表head的第i个结点的位置上

ListNode *p;

p=GetNode(head,i-1);//寻找第i-1个结点

if(p==NULL)

Error(“position error”)。  //i<1或i>n+1时插入位置i有错

s=(ListNode*)malloc(sizeof(ListNode));

s->data=x;

s->next=p->next。

p->next=s;}

4.7删除单链表中的第i个结点

voidDeleteList(LinkList head,int i)

{//删去带头结点的单链表head上的第i个结点

ListNode *p, *r;

p=GetNode(head,i-1)。 //找第i-1个结点

if(p==NULL||p->next==NULL)//i<1或i>n时删除位置有错

Error (“position error”); //退出程序执行

r=p->next。

p->next=r->next;

free(r);    //释放结点所占用的空间}

转载于:https://www.cnblogs.com/claireyuancy/p/7389898.html

数据结构习题之线性表相关推荐

  1. 大话西游之王道考研数据结构第一讲---线性表的顺序表示

    大话西游之王道考研数据结构第一讲---线性表的顺序表示 写在前面的话 王道考研数据结构是一本非常好的书,本系列所有的内容是按照其书进行讲述的,所以您可以以那本书作为主要内容,这个做参考. 大学时候,在 ...

  2. 【数据结构】除去线性表中的重复数字

    题目:写一个算法将单链表中值重复的结点删除,使所得的结果表中各结点值均不相同. 刚看到这个题目给我第一个思路是冒泡排序,可以利用冒泡排序的两层循环找出相同的结点,然后free掉.第一层循环是控制循环的 ...

  3. Algorithms_基础数据结构(04)_线性表之链表_单向循环链表约瑟夫环问题

    文章目录 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 约瑟夫问题 结构 分析 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 tip:单向链表 约瑟夫问题 N个人围成一圈, ...

  4. Java版数据结构与算法——线性表

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...

  5. 数据结构复习题(线性表)

    数据结构复习题(线性表) 线性表 选择题 填空题 判断题 解答题 顺序表的插入和删除 单链表的插入与删除,创建 线性表 选择题 用单链表方式存储的线性表,存储每个节点需要两个域,一个是数据域,另一个是 ...

  6. 算法与数据结构(一):线性表(C++实现)

    文章目录 算法与数据结构(一):线性表(C++实现) 头文件定义线性表类的成员变量和成员函数 头文件类成员函数的实现 主函数 参考:算法分析与设计(C++描述) 石志国.刘冀伟.姚亦飞编著 算法与数据 ...

  7. C语言数据结构-第二章线性表-电大

    第二章线性表--内容简介 本章将进入线性结构的学习. 线性结构是最简单.最常用的一种数据结构. 本章将学习线性表的定义.顺序和链式两种存储方式及相应存储结构上的运算实现.通过典型示例训练,掌握线性表的 ...

  8. 数据结构实验--基于线性表的图书信息管理系统

    本文是依据数据结构习题解析与实验指导(李冬梅)一书中的第一个实验–基于线性表的图书信息管理系统所写的. 之所以写这个,是因为这个实验不仅涉及到线性表的结构设计,还包括一些线性表的基本操作,个人认为,做 ...

  9. 数据结构之【线性表】(顺序表、链表的基本操作实现)

    概念 线性表:是N个数据元素的有限序列. 顺序表:用一组地址连续的存储单元依次存储[线性表 ]的数据元素.(区别于有序表:表中的数据元素存在非递增或非递减有序) 链表:用一组任意的存储单元来存储[线性 ...

最新文章

  1. 自动驾驶制图中的深度学习
  2. 学习笔记(2)IPC机制
  3. 安装labelImg对数据集标注
  4. RabbitMQ指南(上)
  5. python爬取的信息条数比页面显示多_Python爬取分析北京二手房数据?数据结果真的太吓人了...
  6. matlab里两个for怎么跳出循环,急急急!matlab含有两个for循环,程序不知道哪儿错了,求指教!...
  7. 阿里云物联网平台 > 设备接入 > 使用开放协议自主接入 > MQTT协议接入 >
  8. 太慢不能忍,CPU 拿硬盘和网卡开刀了!
  9. 百度大数据 CMO的新左脑-百度-喻友平
  10. Makefile、.mk、.bp、Blueprint、Soong、kati工具链的关系
  11. 2008流媒体服务器点播搭建详解
  12. MyBatis源码阅读(一) --- 源码阅读环境搭建
  13. 【问】安装SQL 2012R2时提示NetFx3
  14. 成就电子电路设计高手(二),EDA在电子电路设计中的应用
  15. xgene:之ROC曲线、ctDNA、small-RNA seq、甲基化seq、单细胞DNA, mRNA
  16. 阿里CEO张勇:打破各企业边界 联手对抗黑灰产
  17. vue-cli3.0 进行项目的部署和构建
  18. Web3即将到来,我们做了什么?
  19. python模块:Sockets阻塞和非阻塞测试
  20. 网易数据分析高级总监:10年数据分析老司机的深度思考!

热门文章

  1. 解决mysql地区时间错误_mysql time zone时区的错误解决
  2. 500g linux怎么分区吗,500G的硬盘,怎么分区比较合理?
  3. some ubuntu shell commands
  4. read .off file in matlab
  5. ubuntu shortcuts
  6. 零基础入门语义分割-Task4 评价函数与损失函数
  7. VGG16迁移学习,实现医学图像识别分类工程项目
  8. grafana默认用户名密码_提升运维格调?Grafana整合Zabbix
  9. 关机时无人照管更新正在运行_路辉物流设备:无人化分拣作业驱动物流业降本增效...
  10. HowNet介绍及使用