数据结构c语言版(题目)

  如果TCPhashlistJuli采用线性表的顺序存储结构,则可以随机存取表中任一终端,但插入和删除终端时,需要移动大量元素,巧妙地终端离线不进行删除操作。

  数组,存储的元素应该是线性表顺序存储结构的数据结构。

  线性表题目类型:线性表在顺序结构上各种操作的实现;线性链表的各种操作;两个或多个线性表的各种操作;循环链表和双向链表;稀疏多项式及其运算在线性表的两种存储结构上的实现。

线性表

线性表在顺序结构上各种操作的实现

  题目1:(线性表顺序存储结构上的操作_Delete)从顺序存储结构的线性表a中删除第i个元素起的k个元素。(《数据结构题集 C语言版》P16)

  题目2:(线性表顺序存储结构上的操作_Insert)设顺序表va中的数据元素递增有序。试写一算法,将x插入到循序表的适当位置上,以保持该表的有序性。(《数据结构题集 C语版》P17)

  题目3:线性表顺序存储结构上的操作_逆置

试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表逆置。(《数据结构题集 C语版》2.21)

线性表

线性链表的各种操作

  题目1:(Insert)试写一算法,在无头结点的动态单链表上实现线性表的Insert(L,i,b),并和在带头结点的动态单链表上实现同样操作的算法进行比较。(《数据结构题集 C语音版》P17)

  题目2:(Delete)同上题要求,实现线性表操作Delete(L,i).

  题目3:已知线性表中的元素以值递增有序排序,并以单链表作为存储结构。试写一高效算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)同时释放被删除结点空间,并分析你的算法的事件复杂度(注意:mink和maxk是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)。(《数据结构题集 C语版》P17)

  题目4:同上题条件,试写一高效算法,删除表中所有值相同的多余元素(使得操作后的线性表所有元素的值均不相同),同是释放被删结点空间,并分析你算法的时间复杂度。(《数据结构题集 C语音版》P18)

对比题目2至4可知:线性表链表的删除操作的题目常有:带头结点和不带头结点的单链表的删除操作对比;删除所有值大于mink且小于maxk的元素;删除相同的多余元素同事释放结点空间。

 题目5:逆置试写一算法,对单链表实现就地逆置。(《数据结构题集 C语版》2.22)


两个或多个线性表的各种操作

题目1:(连接) 已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起,假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间复杂度。(《数据结构题集 C语版》2.15)

题目2:(删除+插入)知指针la和lb分别指向两个无头结点单链表中的首元结点。下列算法是从表la中删除自第i个元素起共len个元素后,将它们插入到表lb中第i个元素之前。试问此算法是否正确?若有错,请改正之。(《数据结构题集 C语版》2.16)

Status DeleteAndInsertSub(LinkedList la,LinkedList lb,int i,int j,int len)

{

if(i<0||j<0||len<0) return INFEASIBLE;

p=la; k=1;

while(k<i){ p=p->next; k++; }

q=p;

while(k<=len){ q=q->next; k++; }

s=lb; k=1;

while(k<j){ s=s->next; k++; }

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

return OK;

}

题目3:(归并)假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原表(即A表和B表)的结点空间构造C表。(《数据结构题集 C语版》2.24)

题目4:(集合求交,集合求并,集合求余)

2.25 假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合(即同一表中的元素值各不相同),现要求另辟空间构成一个线性表C,其元素为A和B中元素的交集,且表C中的元素有依值递增有序排列。试对顺序表编写求C的算法。

2.26 要求同2.25题。试对单链表编写求C的算法。

2.27 对2.25题的条件作以下两点修改,对顺序表重新编写求得表C的算法。

(1) 假设在同一表(A或B)中可能存在值相同的元素,但要求新生成的表C中的元素值各不相同;

(2) 利用A表空间存放表C。

2.28 对2.25题的条件作以下两点修改,对单链表重新编写求得表C的算法。

(1) 假设在同一表(A或B)中可能存在值相同的元素,但要求新生成的表C中的元素值各不相同;

(2) 利用原表(A表或B表)中的结点构成表C,并释放A表中的无用结点空间

2.29 已知A,B和C为三个递增有序的线性表,现要求对A表作如下操作:删去那些既在B表中出现又在C表中出现的元素。试对顺序表编写实现上述操作的算法,并分析你的算法的时间复杂度(注意:题中没有特别指明同一表中的元素值各不相同)。

2.30 要求同2.29题。试对单链表编写算法,请释放A表中的无用结点空间。

题目5:(分割)2.33 已知由一个线性链表表示的线性表中含有三类字符的数据元素(如:字母字符、数字字符和其他字符),试编写算法将该线性表分割为三个循环链表,其中每个循环链表表示的线性表中均只含一类字符。

循环链表和双向链表

2.32 已知有一个单向循环链表,其每个结点中含三个域:pre,data和next,其中data为数据域,next为指向后继结点的指针域,pre也为指针域,但它的值为空,试编写算法将此单向循环链表改为双向循环链表,即使pre成为指向前驱结点的指针域。

2.37 设以带头结点的双向循环链表表示的线性表L=(a1,a2,......,an)。试写一时间复杂度O(n)的算法,将L改造为L=(a1,a3,......,an,......,a4,a2)。

2.38 设有一个双向循环链表,每个结点中除有pre,data和next三个域外,还增设了一个访问频度域freq。在链表被起用之前,频度域freq的值均初始化为零,而每当对链表进行一次Locate(L,x)的操作后,被访问的结点(即元素值等于x的结点)中的频度域freq的值便增1,同时调整链表中结点之间的次序,使其按访问频度非递增的次序顺序排列,以便始终保持被频繁访问的结点总是靠近表头结点。试编写符合上述要求的Locate操作的算法。

稀疏多项式及其运算在线性表的两种存储结构上的实现。(看不懂题目,略)


栈和对列

栈的类型特点及其应用

3.15 假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点。试编写实现这个双向栈tws的三个操作:初始化inistack(tws)、入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i为0或1,用以分别指示设在数组两端的两个栈,并讨论按过程(正/误状态变量可设为变参)或函数设计这些操作算法各有什么有缺点。

3.16 假设如题3.1所属火车调度站的入口处有n节硬席或软席车厢(分别以H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作(即入栈或出栈操作)序列,以使所有的软席车厢都被调整到硬席车厢之前。

3.17 试写一个算法,识别一次读入的一个以@为结束符的字符序列是否为形如‘序列1&序列2’模式的字符序列。其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。

3.18 试写一个判别表达式中开、闭括号是否配对出现的算法。

3.19 假设一个算术表达式中可以包括三种括号:圆括号“(”和“)”、方括号“[”和“]”和花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素为字符的顺序表中)。

3.20 假设以二维数组g(1…m, 1…n)表示一个图像区域,g[i,j]表示该区域中点(i,j)所具颜色,其值为从0到k的整数。编写算法置换点(i0,j0)所在区域的颜色。约定和(i0,j0)同色的上、下、左、右的邻接点为同色区域的点。

3.21 假设表达式有单字母变量和双目四则运算符构成。试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰表达式。

3.22 如题3.21的假设条件,试写一个算法,对以逆波兰式表示的表达式求值。

3.23 如题3.21的假设条件,试写一个算法,判断给定的非空后缀表达式是否为正确的逆波兰表达式,如果是,则将它转化为波兰式。


递归算法执行过程中栈的状态和递归的消除

队列的类型特点和应用以及在不同存储结构上的实现方法

3.28 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列何处队列的算法。

3.29 如果希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag的值为0和1来区分,尾指针和头指针值相同时的队列状态是“空”还是“满”。试编写与此结构相应的入队列和出队列的算法,并从时间和空间角度讨论设标志和不设标志这两种方法的使用范围(如当循环队列容量较小而队列中每个元素占的空间较多时,哪一种方法较好)。

3.30 假设将循环队列定义为:以域变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。试给出此循环队列的队满条件,并写出相应的入队列和出队列的算法(在出队列的算法中要返回队头元素)。

3.31 假设称正读和反读都相同的字符序列为“回文”,例如,‘abba’和‘abcba’是回文,‘abcde’和‘ababab’则不是回文。试写一个算法判别读入的一个以‘@’为结束符的字符序列是否是“回文”。

3.33 在顺序存储结构上实现输出受限的双端循环队列的入列和出列(只允许队头出列)算法。设每个元素表示一个待处理的作业,元素值表示作业的预计时间。入队列采取简化的短作业优先原则,若一个新提交的作业的预计执行时间小于队头和队尾作业的平均时间,则插入在队头,否则插入在队尾。

3.34 假设在如教科书3.4.1节中图3.9所示的铁道转轨网的输入端有n节车厢:硬座、硬卧和软卧(分别以P,H和S表示)等待调度,要求这三种车厢在输出端铁道上的排列次序为:硬座在前,软卧在中,硬卧在后。试利用输出受限的双端队列对这n节车厢进行调度,编写算法输出调度的操作序列:分别以字符‘E’和‘D’表示对双端队列的头端进行入队列和出队列的操作;以字符A表示对双端队列的尾端进行入队列的操作。

树和二叉树

遍历以及通过遍历实现二叉树的其他操作

6.33假定用两个一维数组L[n+1]和R[n+1]作为有n个结点的二叉树的存储结构,L[i]和R[i]分别指示结点i(i=1,2,...,n)的左孩子和右孩子,0表示空。试写一个算法判断结点u是否为结点v的子孙。

6.34 同6.33题的条件。先由L和R建立一维数组T[n+1],使T中第i(i=1,2,…,n)个分量指示结点i的双亲,然后判别结点u是否为结点v的子孙的算法。

6.35假设二叉树中左分支的标号为”0”,右分支的标号为”1”,并对二叉树增设一个头结点,令根结点为其右孩子,则从头结点到树中任一点所经分支的序列为一个二进制序列,可以作是某个十进制数的二进制表示.例如,右图所示二叉树中,和节点A对应的二进制序列为”110”,即十进制整数6的二进制表示,已知一棵非空二叉树以顺序存储结构表示,试写一尽可能简单的算法,求出与树的顺序存储结构中下标值为的结点对应的十进制数.


二叉树线索化和在线索二叉树上找给定结点的前驱和后驱

6.56③试写一个算法,在先序后继线索二叉树中,查找给定结点*p在先序序列中的后继(假设二叉树的根结点未知)。并讨论实现此算法对存储结构有何要求?

6.57③试编写一算法,在后序后继线索二叉树中 ,查找给定结点*p在后序序列中的后继(二叉树的根结点指针并为给出),并讨论实现算法对存储结构有何要求?

6.58试写出一算法,在中序全线索二叉树的结点*p之下,插入一棵以结点*x为根只有左子树的中序全线索二叉树,使*x为根的二叉树成为*p的左子树,若*p原来有左子树,则令它为*x 的右子树,完成插入之后的二叉树应保持全线索化特性。

树的遍历

6.59③试编写算法完成下列操作:无重复的输出以孩子兄弟链表存储的树T中所有的边。输出的形式为(k1 k2),(ki kj)…. ki kj)…其中,ki kj    为树结点中的结点标识。

6.60③试编写算法,对一棵以孩子-兄弟链表表示的树统计叶子的个数。

6.61③试编写算法,求一棵以孩子-兄弟链表表示的树的深度。

6.62④对以孩子-兄弟链表表示的树编写计算树的深度的算法。

6.63对以孩子链表表示的树编写计算树的深度的算法。

6.64④对以双亲表示的树编写计算树的深度的算法

树及二叉树的各种操作和输出操作。

6.65④已知一棵二叉树的前序虚痨和中序序列分别存储于两个一维数组中,试将编写算法建立该二叉树的二叉链表。

6.66④假设有n个结点的树T采用了双亲表示法,写出由此建立树的孩子-兄弟链表的算法。

6.68③已知一棵树的由根至叶子结点按层次输入的结点序列及每个结点的度(每层中自左向右输入),试写出构造此树的孩子-兄弟链表的算法。

6.74⑤  试写一递归算法,以6.73题给定的树的广义表表示法的字符序列形式输出以孩子-兄弟链表表示的树。

6.75⑤  试写一递归算法,由6.73题定义的广义表表示法的字符序列,构造树的孩子链表。

6.76⑤  试写一递归算法,由6.73题给定的树的广义表表示法的字符序列形式输出以孩子链表表示的树。





题型:设计求解路径问题的算法;课本上的各种算法。


动态存储管理

系统程序设计中采用的几种动态存储管理的策略和方法;使用可利用空间进行动态存储管理分别策略;操作系统中用以进行动态存储管理的边界标志法和伙伴系统,无用单元收集时的标志算法。


查找

题型:静态查找表的查找;各种树表的查找插入删除;哈希表的构造、查找和维护。


内部排序

题型:各种排序算法


外部排序

题型:未总结


文件

题型:未总结


  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,数据结构是计算机科学中一种非常重要的学科,在程序设计中占有重要地位。其目的是为了设计、实现和应用数据结构和算法。 在学习数据结构时,C语言是一种非常重要的编程语言。数据结构C语言专升本习题,涵盖了数据结构中基本的数据类型、简单的数据结构和算法基础等内容。 学习数据结构C语言专升本习题,需要掌握C语言中的基础知识,如数组、指针、结构体等。这些知识对于理解数据结构和算法的原理和实现方式非常重要。 此外,在学习数据结构C语言专升本习题时,还需要注意掌握常见的数据结构,如栈、队列、链表和树等。同时还需要学习和掌握算法分析的基本方法和技巧。 最后,在学习数据结构C语言专升本习题时,需要多动手实践,通过编写程序来加深对数据结构和算法的理解和掌握。只有通过不断地实践和练习,才能真正学好数据结构和算法,并提高自己的编程能力。 ### 回答2: 数据结构是计算机科学的基础课程之一。它主要研究不同数据的组织、存储和管理方法,以及对这些数据进行操作的算法和技术。 C语言是一种通用的、高级的编程语言,与数据结构紧密相关。在数据结构c语言专升本习题中,学习者需要掌握基本的数据结构和算法,并利用C语言实现和优化它们。 习题通常包括对不同的数据结构(如数组、链表、树等)进行操作的编程题目,以及针对常见算法(如排序算法、查找算法等)的实现练习。通过做这些习题,学习者可以加深对数据结构和算法的理解,并提高编程技能。 在解决习题时,学习者需要注意算法的效率和空间复杂度,避免出现时间和空间浪费的情况。同时,要注意代码的风格和规范,编写高质量、易读、易维护的代码。 总之,数据结构c语言专升本习题对于提高计算机科学专业的技能和能力非常重要。学习者应该认真掌握这些习题,并理解其中的原理和思想,以便在以后的实际工作中得心应手。 ### 回答3: 数据结构是计算机科学中一个非常重要的领域,它主要研究数据组织、存储和管理的方法,是计算机软件设计必不可少的基础。 C语言是一种广泛使用的高级编程语言,出色的性能和灵活的特性使它成为许多软件开发人员和系统程序员的首选语言。 对于专升本考试来说,掌握数据结构C语言是非常必要的。数据结构c语言习题可以帮助我们深入理解数据结构C语言的使用。 在数据结构c语言习题中,我们可以学习到常见的数据结构,例如线性结构、树结构和图结构等等。同时,还可以学习到如何用C语言实现这些数据结构的操作和算法。 通过解决数据结构c语言习题,我们可以提高自己的编程能力,为日后的软件开发和系统设计积累宝贵经验。同时,还可以为我们的专升本考试打下坚实的基础,提高自己的考试成绩。 总之,数据结构c语言习题对于我们的学习和职业发展都非常重要,希望大家能够认真对待这一领域,不断提升自己的编程技巧和算法思维。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值