一道迷宫求解 数据结构构考试题,求解?

全国2013年1月自学考试数据结构试题-自考试题-自考答案
&&您现在的位置:&& →
全国2013年1月自学考试数据结构试题&nbsp
试题类型:WORD文档
试题时间:2013年1月
所属省份:
试卷资费:免费下载
试卷收藏:
试卷评级:
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp分享到:
&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp
试卷内容预览
&nbsp&nbsp
全国2013年1月自学考试数据结构试题
课程代码:02331
请考生按规定用笔将所有试题的答案涂、写在答题纸上。
选择题部分
注意事项:
1.答题前,考生务必将自己的考试课程名称、姓名、准考证号用黑色字迹的签字笔或钢笔填写在答题纸规定的位置上。
2.每小题选出答案后,用2B铅笔把答题纸上对应题目的答案标号涂黑。如需改动,用橡皮擦干净后,再选涂其他答案标号。不能答在试题卷上。
一、单项选择题(本大题共15小题,每小题2分,共30分)
在每小题列出的四个备选项中只有一个是符合题目要求的,请将其选出并将“答题
纸”的相应代码涂黑。错涂、多涂或未涂均无分。
1.数据的逻辑结构可以分为
A.动态结构和静态结构 B.顺序结构和链式结构
C.线性结构和非线性结构 D.简单结构和构造结构
2.线性表是一个有限序列,组成线性表的基本单位是
A.数据项 B.数据元素
C.数据域 D.字符
3.栈中有a、b和c三个元素,a是栈底元素,c是栈顶元素,元素d等待进栈,则不可
能的出栈序列是
A.dcba B.cbda
C.cadb D.cdba
4.稀疏矩阵的三元组表是
A.顺序存储结构 B.链式存储结构
C.索引存储结构 D.散列表存储结构
5.已知广义表G,head(G)与tail(G)的深度均为6,则G的深度是
6.下列编码集合中,属于前缀编码的一组是
A.{11,10,001,101,0001} B.{00,010,}
C.{11,01,001,} D.{0,10,110,1011}
7.如题7图所示二叉树的中序序列为
8.有向图中所有顶点入度之和与所有顶点出度之和的比是
A.1/2 B.1
9.含有n个顶点和e条边的有向图的邻接矩阵中,零元素的个数是
C.n2-2e D.n2-e
10.n个顶点的无向连通图,其生成树的边数为
C.n+l D.nlogn
11.用自底向上的冒泡排序方法对序列(8,13,26,55,29,44)从大到小排序,第一趟排序需进行交换的次数为
12.对序列(8,13,26,55,29,44)从小到大进行基数排序,第一趟排序的结果是
A.(13,44,55,26,8,29) B.(13,26,55,44,8,29)
C.(8,13,26,29,44,55) D.(29,26,8,44,55,13)
13.采用分块查找时,要求数据
A.块内有序 B.分块有序
C.分块无序 D.每块中数据个数必须相同
14.下列关于散列函数的说法正确的是
A.散列函数越复杂越好
B.散列函数越简单越好
C.用除余法构造的散列函数是最好的
D.在冲突尽可能少的情况下,散列函数越简单越好
15.下列关于m阶B树的叙述中,错误的是
A.每个结点至多有m棵子树
B.每个结点至多有m-1个关键字
C.所有的叶结点均在同一层上
D.根结点至少有棵子树
非选择题部分
注意事项:
用黑色字迹的签字笔或钢笔将答案写在答题纸上,不能答在试题卷上。
二、填空题(本大题共10小题,每小题2分,共20分)
16.算法的时间复杂度与实现时采用的程序设计语言____________。
17.在长度为n的顺序表的第i(1≤i≤n)个元素之后插入一个元素时,需向后移动___________个元素。
18.设循环队列存放在向量data[0..m-l]中,在出队操作后,队头指针front变化为___________。
19.树的前序遍历序列等同于该树对应二叉树的____遍历序列。
20.一个100×90的整型稀疏矩阵有10个非零元素,设每个整型数占2个字节,则用三元组表存储该矩阵时,所需的字节数是___________。
21.当用二叉链表作为n个结点的二叉树的存储结构时,空指针域的个数是____。
22.采用邻接表表示n个顶点的有向图时,若表结点的个数为m,则该有向图的边数
为___________。
23.对同一个基本有序的待排序列分别进行堆排序、快速排序和冒泡排序,最省时间的
算法是___________。
24.在16个记录的有序顺序表中进行二分查找,最大比较次数是___________。
25.在排序算法中,若排序前后具有相同关键字的记录之间的相对次序保持不变,则称这种排序方法是___________的。
三、解答题(本大题共4小题,每小题5分,共20分)
26.在定义顺序表时,存放表结点的向量空间不宜过大也不宜过小,为什么?
27.画出题27图所示树的孩子链表。
28.已知一个无向图G如题28图所示,以顶点①为根,且小序号优先,分别画出G的深度优先生成树和广度优先生成树。
29.判别以下序列是否为堆,若不是,将其调整为大根堆,并画出大根堆。
①(1,5,7,20,18,8,10,40)
②(18,9,5,8,4,17,21,6)
四、算法阅读题(本大题共4小题,每小题5分,共20分)
30.单链表类型定义如下:
阅读下列算法,并回答问题:
f30 (LinklList
∥head是带头结点的非空单链表的头指针
while(p-&next-&next)
q=(ListNode*) malloc (sizeof(ListNode));
q-&data=x;
q-&next=p-&
p-&next=q;
(1)该算法的功能是什么?
(2)若单链表的长度为n,算法的时间复杂度是多少?该时间复杂度和链表的初始状态有关吗?
31.阅读下列算法(假设栈的操作函数都已定义),并回答问题:
Push (&S,x);
Push (&S,′a′);
Push (&S,y);
x=Pop(&S);
Push(&S,′t′);
Push(&S,x);
x=Pop(&S);
Push(&S,′s′);
( !StackEmpty(&S))
y=Pop (&S);
putchar (y);
putchar (x);
(1)自底向上写出执行while语句之前栈S中的元素序列。
(2)写出该函数的最后输出结果。
32.下列算法的功能是在中序线索树中查找结点*p的前趋,填上适当内容使算法完整。
{ Link,Thread }
∥ 枚举值Link和Thread分别为0和1
PointerTag
BinThrNode*f32 (BinThrNode
{ ∥ 在中序线索树中找结点*p的中序前趋,设p非空
BinThrNode
if(p-&ltag==Thread)
q=p-&lchild;
while(q-&rtag=Link)
return q;
33.分析下列排序算法中语句1和语句2的频度以及此算法的时间复杂度,并指出该算法是属于哪一种排序方法。
i,j,k,t;
(i=0;i&n;i++)
(k=j+1;k&=n;k++)
(a[k]&a[j])
a[i]=a[j];a[j]=t;
五、算法设计题(本题10分)
34.二叉排序树的类型定义如下:
}*BSTree;
编写递归算法从小到大输出二叉排序树T中所有data域值大于m且小于n的数据。
函数原型为void
f34(BSTree
............
&nbsp&nbsp&nbsp&nbsp更多其他年份试题
&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp
&nbsp&nbsp相关课程
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp
自己也曾经是自考生,当初考的是计算机专业的专科,花了我四年半年时间。许多朋友跟我说自考太难了,他们快要坚持不下去了。我自己的经验是,其实自考不难,难的是坚持。
我不相信人天生下来会有谁比谁更聪明的脑袋瓜,只相信谁比谁更努力。努力看书,多做题,多花时间在学习上面,一定能够成功。加油吧!
考一场试下来,需要花费很多精力,也需要花去不少钱。在此我向大家保证,我的网站一定会奉行免费的政策,无论如何,我都不会使网站变成收费模式。
如果本站收集的内容侵犯了你的权利,也请告诉我,我会进行核实后并立即予以删除。
如果认为此网站还可以,告诉你的朋友们吧,我会一如继往,努力拼命的,哈哈!小木虫 --- 600万学术达人喜爱的学术科研平台
&&查看话题
求解一数据结构题
给定元素的进栈顺序为A,B,C,D,E,F,G,请给出以B,A开头以G,F为最后出栈元素的所有可能出栈序列
如果存在拓扑序列, 那么 拓扑序列末尾的元素 在图中必定 出度为0, 因为如果它出度不为零,&&那与它是 末尾元素这个 假设矛盾。
谢谢啦,我还有几个问题可以问你吗:D
谢谢你啦我刚开始的时候也像你一样迷茫,同学给我推荐了,上面很多牛人分享的科研经验,对新手很有帮助,你也可以下载来试试!
当有新的数 输入到 工作区时, 这个数是属于本轮 还是 下一轮取决于它是否比本轮的MINMAX(书上是这么称呼的)大,&&所以如果能一直保持输入的数比MINMAX大,即所有 输入的数都属于本轮,&&有可能只生成一个归并段。
但是这种可能性非常低吧, 需要初始序列已经几乎有序了。
这个题目感觉很怪……哪里来的……
当有新的数 输入到 工作区时, 这个数是属于本轮 还是 下一轮取决于它是否比本轮的MINMAX(书上是这么称呼的)大,&&所以如果能一直保持输入的数比MINMAX大,即所有 输入的数都属于本轮,&&有可能只生成一个归并段。
但是这种可能性非常低吧, 需要初始序列已经几乎有序了。
这个题目感觉很怪……哪里来的……
考试题,这个判断可以打叉吗:D
设主串S=daaadcaaadcaaaadcaaadcdaaaabddcdaaa
模式T=aaadcaaadcda
那么模式T的Next的值以及NextVal的值
我的意思是说有非常低的可能, 不知道题目有没有考虑这种可能
刚刚答错了, 改一下
& && && && &1 2 3 4 5 6 7 8 9 10 11 12
模式& && && &a a a d c a a a d c d a
next& && &0 1 2 3 1 1 2 3 4 5 6 1
nextval&&0 0 0 3 1 0 0 0 3 1 6 0
你帮我对下答案吧, 这种比较容易粗心算错
N{h} = N{h-1} + N{h-2} + 1
这个题目好像12年考过吧……
我不知道答案是什么,但是是怎么算出来的呢,我看书居然也没看懂:victory:
你是往那里考,我们是不是报一所的
我考中科院软件所。& &你不是考的统考408吗? 你考哪?
KMP确实有点抽象 ……& &我打字一时半会肯定讲不清楚。&&我觉得看书看不懂比较正常……
我报的大连海事,不是中科,那对于我太难了
学术必备与600万学术达人在线互动!
扫描下载送金币
浏览器进程
打开微信扫一扫
随时随地聊科研数据结构考试试题(带答案)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
数据结构考试试题(带答案)
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩11页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢80道常见数据结构面试题及其解法
80道常见数据结构面试题及其解法
1.把二元查找树转变成排序的双向链表
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树节点的数据结构如下:
struct BSTreeNode
int m_nV // value of node
BSTreeNode *m_pL // left child of node
BSTreeNode *m_pR // right child of node
&iostream&
using&namespace&
struct&BSTreeNode
&&&&int&m_nV&
&&&&BSTreeNode
&&&&BSTreeNode
void&addBSTreeNode(BSTreeNode
*&pCurrent,int&value);
void&inOrderBSTree(BSTreeNode*
void&convertToDoubleList(BSTreeNode*
pCurrent);
BSTreeNode
*pHead=NULL;
BSTreeNode
*pIndex=NULL;
int&main()
&&&&BSTreeNode
*pRoot=NULL;
&&&&addBSTreeNode(pRoot,10);
&&&&addBSTreeNode(pRoot,6);
&&&&addBSTreeNode(pRoot,14);
&&&&addBSTreeNode(pRoot,4);
&&&&addBSTreeNode(pRoot,8);
&&&&addBSTreeNode(pRoot,12);
&&&&addBSTreeNode(pRoot,16);
&&&&inOrderBSTree(pRoot);
&&&&return&0;
void&addBSTreeNode(BSTreeNode
*&pCurrent,int&value)
&&&&if&(pCurrent==NULL)
&&&&&&&&BSTreeNode*
pBSTree=new&BSTreeNode();
&&&&&&&&pBSTree-&m_nValue=
&&&&&&&&pBSTree-&m_pLeft=NULL;
&&&&&&&&pBSTree-&m_pRight=NULL;
&&&&&&&&pCurrent=pBST
&&&&else&if&(pCurrent-&m_nValue&value)
&&&&&&&&addBSTreeNode(pCurrent-&m_pRight,value);
&&&&else&if&(pCurrent-&m_nValue&value)
&&&&&&&&addBSTreeNode(pCurrent-&m_pLeft,value);
&&&&&&&&cout&&&node
repeated&&&
void&inOrderBSTree(BSTreeNode*
&&&&if&(NULL==pBSTree)
&&&&&&&&return;
&&&&if&(NULL!=pBSTree-&m_pLeft)
&&&&&&&&inOrderBSTree(pBSTree-&m_pLeft);
&&&&convertToDoubleList(pBSTree);
&&&&if&(NULL!=pBSTree-&m_pRight)
&&&&&&&&inOrderBSTree(pBSTree-&m_pRight);
void&convertToDoubleList(BSTreeNode*
&&&&pCurrent-&m_pLeft=pI
&&&&if&(NULL==pIndex)
&&&&&&&&pHead=pC
&&&&&&&&pIndex-&m_pRight=pC
&&&&pIndex=pC
&&&&cout&&pCurrent-&m_nValue&&&
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。&
要求函数min、push 以及pop 的时间复杂度都是O(1)。
使用一个辅助栈来保存最小元素,这个解法简单不失优雅。设该辅助栈名字为minimum stack,其栈顶元素为当前栈中的最小元素。这意味着
要获取当前栈中最小元素,只需要返回minimum stack的栈顶元素即可。
每次执行push操作,检查push的元素是否小于或等于minimum stack栈顶元素。如果是,则也push该元素到minimum&stack中。
当执行pop操作的时候,检查pop的元素是否与当前最小值相等。如果相同,则需要将改元素从minimum&stack中pop出去。
struct minStack{
stack&int&
stack&int& minS;
void push(int i){
if (s.empty() || minS.empty()){
s.push(i);
minS.push(i);
if (minS.top() &= i){
minS.push(i);
s.push(i);
void pop(){
if (s.empty() || minS.empty()){
if (s.top() & minS.top()){
minS.pop();
int min(){
if (minS.empty())
return -1;
return minS.top();
3:题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
一种从前往后遍历的方法如下:
4 面试题目:
&&&&&&& 输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
&&&&&&& 例如输入整数 22 ,如下图二元树:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 10
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& /&&&& \
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 5&&&& 12
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& /&&& \&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 4&&&& 7&
&&&则打印出两条路径:10, 12和10, 5, 7。
思路:对于如图所示的二叉树,其实就是一个递归的过程,上例可以有三条路径10 5 4 ,10 5 7,10 12,递归调用者三次路径即可,如果满足就打印出来,不可以就再重复递归
代码如下:
需要注意的是出栈与入栈的处理,友情是这一步&&sum&-=&root-&m_nV&
5:题目是:输入n 个整数,输出其中最小的k 个。例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 和4。
问题分析:先用冒泡排序法将数列排序,然后输出其中最小的k个数,注意输入输出格式问题(空格问题)
方法:使用p、q两个指针,p每次向前走一步,q每次向前走两步,若在某个时候p == q,则存在环。
#include &stdio.h&
2 #include &stdlib.h&
4 #define LEN 8
5 typedef struct node* node_t;
7 struct node{
struct node *
12 //method 1
13 int has_loop(struct node *head);
14 //method 2
15 int has_loop2(node_t head);
17 int main()
node_t* arr = (node_t*)malloc(sizeof(struct node)*LEN);
arr[0] = (node_t)malloc(sizeof(struct node));
for(i = 1; i & LEN; i++)
arr[i] = (node_t)malloc(sizeof(struct node));
arr[i - 1]-&next = arr[i];
arr[LEN - 1]-&next = NULL;
//you can add a loop here to test
//arr[6]-&next = arr[0];
if (has_loop(arr[0]))
printf(&method1: has loop.\n&);
printf(&method1: has no loop.\n&);
if (has_loop2(arr[0]))
printf(&method2: has loop.\n&);
printf(&method2: has no loop.\n&);
44 //if two pointer are equal, but they don't have the same steps, then has a loop
45 int has_loop(node_t head)
node_t cur1 =
int pos1 = 0;
while(cur1){
node_t cur2 =
int pos2 = 0;
pos1 ++;
while(cur2){
pos2 ++;
if(cur2 == cur1){
if(pos1 == pos2)
cur2 = cur2-&
cur1 = cur1-&
68 //using step1 and step2 here
69 //if exists a loop, then the pointer which use step2 will catch up with the pointer which uses step1
70 int has_loop2(node_t head)
node_t p =
node_t q =
while (p != NULL && q != NULL)
if (q-&next != NULL)
q = q-&next-&
if (p == q)
//correct it on 17/11/2012
if (q != NULL)
if (p != NULL && p == q)
微软亚院之编程判断俩个链表是否相交
一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。
1、碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的。
2、当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同。
3、第三种思路是比较奇特的,在编程之美上看到的。先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null)。这样两个链表就合成了一个链表,判断原来的两个链表是否相交也就转变成了判断新的链表是否有环的问题了:即判断单链表是否有环?
这样进行转换后就可以从链表头部进行判断了,其实并不用。通过简单的了解我们就很容易知道,如果新链表是有环的,那么原来第二个链表的头部一定在环上。因此我们就可以从第二个链表的头部进行遍历的,从而减少了时间复杂度(减少的时间复杂度是第一个链表的长度)。
下图是一个简单的演示:
这种方法可以判断两个链表是否相交,但不太容易找出他们的交点。
4、仔细研究两个链表,如果他们相交的话,那么他们最后的一个节点一定是相同的,否则是不相交的。因此判断两个链表是否相交就很简单了,分别遍历到两个链表的尾部,然后判断他们是否相同,如果相同,则相交;否则不相交。示意图如下:
判断出两个链表相交后就是判断他们的交点了。假设第一个链表长度为len1,第二个问len2,然后找出长度较长的,让长度较长的链表指针向后移动|len1 - len2| (len1-len2的绝对值),然后在开始遍历两个链表,判断节点是否相同即可。
下面给出一个简单的实现:
typedef struct node_t
struct node_t * //next
node* find_node(node *head1, node *head2)
if(NULL == head1 || NULL == head2)
return NULL;//如果有为空的链表,肯定是不相交的
node *p1, *p2;
p1 = head1;
p2 = head2;
int len1 = 0;
int len2 =0;
int diff = 0;
while(NULL != p1-&next)
len1++;
while(NULL != p2-&next)
len2++;
if(p1 != p2) //如果最后一个节点不相同,返回NULL
return NULL;
diff = abs(len1 - len2);
if(len1 & len2)
p1 = head1;
p2 = head2;
p1 = head2;
p2 = head1;
for(int i=0; i& i++)
while(p1 != p2)
return p1;
通过上面的操作就可以找到两个链表的交点了。
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
&&&&&&&&&8
&&&&&&&/&&\
&&&&&&6&&&&10
&&& / \&&&&/ \
&&&5&&&7&&&9&&11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
树的题目一般都是递归的思路,因为是因为是排序树,而且是后序,所以思路是序列最后一个必是根节点,从前往后遍历,比根节点小的都是其左子树,并且位于序列的左半部分,比其大的为其右子树,应该位于其右半部分。左右子树按上述思路分别进行判断。
代码如下:
#include&iostream&
using&namespace&
void&test(const&int&data[],int&start,int&node,bool&&flag){
&&&&if(flag&&start&node){&&&&&&&
&&&&&&&&int&left=
&&&&&&&&while(data[node]&data[left]){&&
&&&&&&&&&&&&left++;&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&for(int&j=j&j++){&&&&&&
&&&&&&&&&&&&if(data[j]&data[node])
{flag=false;
&&&&&&&&test(data,0,left-1,flag);&&&&&&&&&&
&&&&&&&&test(data,left,node-1,flag);
int&main(void){
&&&&bool&flag=true;
&&&&int&a[]={5,7,6,9,11,10,8};
&&&&test(a,0,6,flag);
&&&&if(flag)
cout&&&yes&&&
&&&&else&cout&&&no&&&
&&&&int&b[]={7,4,6,5};
&&&&test(b,0,3,flag);
&&&&if(flag)
cout&&&yes&&&
&&&&else&cout&&&no&&&
&&&&system(&pause&);
&&&&return&0;
二元查找树的定义为:
(1)若左子树不空,则左子树上所有节点的值均小于其根节点的值。
(2)若右子树不空,则右子树上所有节点的值均小于其跟节点的值
(3)其左右子树也均为二叉查找树。
那么先给定一个数字序列5、7、6、9、11、10、8,判断这个序列是否是二元查找树的后根遍历。可以回想一下后序遍历的性质,先访问左子树,然后访问右子树,最后访问根节点。结合以上这些性质,就可以理解到,应该从给定序列的最后一个元素开始,最后一个元素设定为根节点,循环遍历一次数组,找左右子树的分界点,上面这个例子就是6,9之间。这样可以判断,5、6、7,这三个数为以8为根节点的左子树上的节点,9、11、10为以8为根节点的右子树的根节点。如果在对以上分出来的两个数组做同样的操作,那么就可以解决这个问题。综上所述,可以应用递归方法,递归的关键是找到结束的条件。下面给出代码,并进行两组测试。
我的热门文章
即使是一小步也想与你分享问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
描述编写这样一个程序:接收来自标准输入的n条指令,指令有如下三种:
a 后面跟一个整数,表示向集合插入一个数
d 后面跟一个整数,表示从集合删除一个数,集合中有多个指定数时,删除一个即可
p 从小到大打印出集合中的数输入
每行输入一条指令,注意指令可能不符合规范,整数可能超出C语言长整形范围,可能带符号,但长度不会超过100
输出当输入指令为p时,从小到大输出集合中的数,当指令不合法时,输出“Invalid Command”输入样例a -2a 97932ca 1a 4a 4d 4p
输出样例Invalid Command-2 1 4 97932
由于最开始没看到加粗内容部分,我简单写了如下代码:
Name:set.c
Copyright:
Author: HeHe.wang
Date: 18/05/16 17:14
Description: 数组实现-----&链表实现
C课程设计练习题1/5
# include &stdio.h&
# include &limits.h&
//检查输入数据合法性
int checkvalid(long long int n)
if(n&=LONG_MIN&&n&=LONG_MAX)
//删除数据前检查是否存在该数据
int checkexist(long long int a[],long long int value,int cnt)
for(i=0;i&i++)
if(value==a[i])
return -1;
//插入数据
int insert (int a[],int value,int cnt)
if(cnt==1)
while(a[i]&value)
if(i==cnt-1)
for(j=cnt-2;j&=i;j--)
a[j+1]=a[j];
//删除集合中的数据,如果数据存在
void delete(long long int a[],long long int value,int cnt)
for(i=0;i&i++)
if(a[i]==value)
for(j=i+1;j&j++)
a[j-1]=a[j];
//对应指令p
void printarr(long long int a[],int cnt)
for(;i&i++)
printf("%lld ",a[i]);
//输出数据每10个一行
if(i%9==0)
printf("\n");
int main()
long long int a[100]={0};
int cnt=0;
while(value=scanf("%c %lld",&c,&i))
if(value==1)
if(c=='p')
printarr(a,cnt);
printf("Invalid Command");
if(c=='a')
insert(a,i,cnt);
else if(c=='d')
delete(a,i,cnt);
printf("Invalid Command");
上面程序中插入数据
打印数据功能都正常,在主函数这块如果不考虑超出long long int表示范围,上面这段程序仍是错误的。原因估计跟scanf()有关,还没研究。关于scanf()的返回值是读取成功的数据个数,上面程序中输入完a 2回车正确,但继续执行指令就出现错误了,不知道是不是跟scanf有关系。写完再一读题,发现完了long long int 肯定处理不了如下指令:a
所以我开始想用链表来实现,我设计的数据结构如下:
struct SetNode
struct SetNode *pN
char code[105];
转换为字符串来存储对应数据,这又涉及到字符串对应整形大小比较问题,不知道我这个思路对不对,是否有更好的思路,原本以为这次的课程设计要简单一点,第一道一晚上就没写出来。跪求各路大神不吝赐教。(思路及伪代码请基于C语言,不要使用任何C++等高级语言里特有的,原因很简单,我们没学,我也不会)
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
第一个问题:每次用scanf前使用fflush(stdin)清空缓冲区,因为你的输入不光是字符,还有一个回车键,字符处理了,但回车还是留着的(准确说是剩了一个换行)第二个问题:scanf读到字符串里后,自己写一个判断大小函数,先比较字符串长度,长的更大,如果长度相同,就调strcpy比较即可
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
关于内存的问题:首先自己建立一个缓冲区
temp[ 110];
//题目说明长度不会超过100
gets( temp);
length = strlen(temp);//获得字符串实际长度
malloc( length + 1);//一定要加一
strcpy(str , temp );
缓冲区每次读入数据时使用,只需分配一次
关于比较的问题第一
正负 符号和数值部分最好分开存存储
//表示正负数
*// 数值部分
//字符串长度
比较函数首先比较符号,如果符号一样,length 不等 ,length长的大,负数取反如果length相等 ,在比较数值部分, 使用strcmp
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
提个建议,可以使用命令行数组,就不用scanf去接收命令了,仿照linux 命令写法。
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App
SegmentFault
一起探索更多未知}

我要回帖

更多关于 迷宫求解 数据结构 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信