求助 数据结构试题 谢谢!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助 数据结构试题 谢谢!!!相关的知识,希望对你有一定的参考价值。

一. 单项选择题(每题2分, 共30分)
1、根据数据元素的关键字直接计算出该元素存储地址的存储方法是(   )。
A)顺序存储方法
B)链式存储方法
C)索引存储方法
D)散列存储方法
2、下面程序段的时间复杂度为( )。
for (int i=0;i<m;i++) for (int j=0;j<n;j++) a[i][j]=i*j;
A)O(m2)
B)O(n2)
C)O(m*n)
D) O(m+n)
3、在一个单链表中,已知q所指结点是p所指结点的前驱,若在p、q之间插入s结点,则执行( )操作。
A)s->next=p-next;p->next=s;
B)q->next=s;s->next=p;
C)p->next=s->next;s->next=p;
D)p->next=s;s->next=q;
4、若某线性表中最常用的操作是取第i个元素和找第i个元素的前趋元素,则采用(  )存储方式最节省时间。
A)单链表
B)双链表
C)单向循环链表 
D)顺序表
5、带头结点的单链表h为空的判断条件是( )。
A)h==NULL
B)h->next==NULL
C)h->next==h
D)h!=NULL
6、设计一个判别表达式中左右括号是否配对出现的算法,采用(  )数据结构最佳。
A)线性表的顺序存储结构
B)栈 
C)队列 
D)线性表的链式存储结构
7、在一个具有n个单元的顺序栈中,假定以地址低端(即下标为0的单元)作为栈底,以top作为栈顶指针,则当作退栈处理时,top的变化为(  )。
A)top不变
B)top=0
C)top=top+1
D)top=top-1
11、在具有n个叶子的哈夫曼树中,其结点总数为(  )。
A)不确定
B)2n
C)2n+1
D)2n-1
12、下列说法正确的是( )。
A)无向图中的极大连通子图叫做连通分量
B)有向图中的极大连通子图叫做连通分量
C)无向图中的极大连通子图叫做强连通分量
D)有向图中的极大连通子图叫做强连通分量
13、某无序表具有N个数据,若采用顺序查找算法,且每个数据查找的概率相等,那么查找失败时,平均查找长度ASL=( )
A)N
B)(N+1)/2
C)N(N-1)/2
D)N-1
14、能采用二分查找的数据结构是( )
A)二叉树
B)有序表
C)哈希表
D)无序表
15、快速排序在最坏情况下的时间复杂度是(   )
A)O(n2log2n)
B)O(n2)
C)O(nlog2n)
D)O(log2n)
二. 填空题
1、 数据结构的逻辑结构包括线性结构和__________________结构两大类。
2、 对于一个长度为n的顺序存储的线性表,在表头插入元素的时间复杂度为________,在表尾插入元素的时间复杂度为_____________。
3、 设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出栈的顺序是s2,s3,s4,s6,s5,s1,则栈的容量至少应该是________。
4、 一棵深度为h的满二叉树上的结点总数为_______,一棵深度为h的完全二叉树上的结点总数的最小值为_______,最大值为_______。
求高手帮忙做一下参考,谢谢!!!

一.判断题

)1.某线性表采用顺序存储结构,元素长度为4,首地址为100,则下标为12的(第13个)元素的存储地址为148。
正确。第0个元素地址为100,则第i个元素地址为100+4*i,将12代入得148。

)2.在任何一种线性链表上都无法进行随机访问。
错误。比如只要知道顺序表首地址和每个数据元素所占存储单元的个数,就可以求出第i个数据元素的存储地址来,这也是顺序表具有按数据元素的序号随机存取的特点。

)3.顺序栈是一种规定了元素进栈顺序的栈。
错误。按存储结构来分,堆栈分为顺序栈和链栈,其中栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表,却并没有规定元素进栈顺序。

)4.循环列表中每一个元素都有后继。
正确。注意,这里可能有笔误,应写为“循环链表”而非“循环列表”。

)5.删除一个二叉树中的一个结点,再重新插入上去,一定能得到原来的二叉排序树。
错误。
二.填空题。
6.下面程序的时间复杂度为___________。
for
(int
i=1;
i<=m;
i++)
for
(int
j=1;
j<=n;
j++
)
S+=i
法则1:for循环:一个for循环的运行时间至多是该for循环内语句(包含测试)的运行时间乘以迭代的次数。
法则2:嵌套循环:从里向外分析这些循环。在一组嵌套循环内部的一条语句总的运行时间为该语句的运行时间乘以该组所有循环的大小的乘积。
对于此处嵌套的for循环,根据以上法则,时间复杂度为O(m*n)。
7.在长度为n的顺序表的第i(1≤i≤n+1)个位置上插入一个元素,元素的移动次数是____________。
从第i个元素(原来的)到第n个元素,每个元素后移一位,一共需要n+1-i次。
8.在一个具有n个结点的有序单链表中插入一个新结点,并让插入后的单链表仍然有序,则该操作的时间复杂性数量级为______。
找到节点位置,O(n);单链表插入操作,O(n);总的时间复杂度为O(n+n)=O(n)。
9.若用s[1]~s[n]作为两个顺序栈的共同存储空间,左右两个栈的栈顶分别为t1和t2,则判断某个栈是否可以插入新元素的条件是_________________。
当程序中同时使用两个栈时,可以将两个栈的栈底设在向量空间的两端,让两个栈各自向中间延伸。当一个栈里的元素较多,超过向量空间的一半时,只要另一个栈的元素不多,那么前者就可以占用后者的部分存储空间。
此处判断某个栈是否可以插入新元素的条件是&t1!=&t2
10.设森林T中有三棵树,第一,二,三棵树的结点个数分别为n1,n2,n3,将森林转换成二叉树后,其根结点的左子树上有____________个结点。
将一个森林转换为二叉树的具体方法是:①
将森林中的每棵树变为二叉树;②
因为转换所得的二叉树的根结点的右子树均为空,故可将各二叉树的根结点视为兄弟从左至右连在一起,就形成了一棵二叉树。
个人认为此处可以填3个答案,n1-1或者n2-1或者n3-1。
11.在带权值有向图的邻接矩阵中,第i行上非零元素的个数等于_______________。
当节点Vi与某节点Vj相邻接,则A(i,j)取非0值。
12.在各种查找方法中,平均查找长度与结点个数n无关的查找方法是_____________。
散列(Hash)查找。
参考技术A ABBDB BDDCC BB1.非线性2.1 n3.34.二的h次方减一 二的h减一次方 二的h次方减一后面四个选择题不太确定,因为没查资料。不过有两个是课本原话,记不太清楚了。其他的都是对的。希望对你有帮助。知道数据结构真的不是太好学。 参考技术B DBABB BDDAB BB
非线性;O(1);O(N);3;2^(h-1);2^h —1;2^(h-1);
12题在课本159页,严蔚敏那本书;
参考技术C D C B D B B D D A A B B
1 非线性结构
2 n n^2
3 3
4 2^h -1 2^(h-1) 2^h-1本回答被提问者和网友采纳
参考技术D ABBDB BDDCC BB 非线性新手

练习数据结构编程时出现error LNK2001错误,求助,谢谢。

以下是各个文件的源代码

//FILE:StuInfor.h
/*--------------------------------------------------------------------------------------------------------------------*/
#ifndef STUINFOR_H_H
#define STUINFOR_H_H

#include <cstdlib>
#include <iostream>

class StuInfor

friend class Student;
public:
StuInfor(void);
StuInfor(char* name,int id);
StuInfor(const StuInfor& stuinfor);
//~StuInfor();

bool PrintStuInfor() const;
protected:
char* Name;
int ID;
;

#endif

/*--------------------------------------------------------------------------------------------------------------------*/

//FILE:Student.h
#ifndef STUDENT_H_H
#define STUDENT_H_H

#include "StuInfor.h"
#include <iostream>

class Student

public:
Student(void);
Student(const StuInfor& infor);
//~Student();

bool PrintAll() const;
private:
StuInfor* Infor;
static Student* head;
Student* next;
;

#endif

/*--------------------------------------------------------------------------------------------------------------------*/

//FILE:StuInfor.cpp
#include "StuInfor.h"

StuInfor::StuInfor(char* name,int id)

Name=new char[strlen(name)+1];
strcpy(Name,name);
ID=id;


StuInfor::StuInfor(const StuInfor& stuinfor)

Name=new char[strlen(stuinfor.Name)+1];
strcpy(Name,stuinfor.Name);
ID=stuinfor.ID;


bool StuInfor::PrintStuInfor() const

std::cout<<Name<<" "<<ID<<std::endl;
return true;


/*--------------------------------------------------------------------------------------------------------------------*/

//FILE:Student.cpp

#include "Student.h"
#include "StuInfor.h"

Student::Student(const StuInfor& infor)

Infor=new StuInfor[strlen(infor.Name)+sizeof(int)+1];
strcpy(Infor->Name,infor.Name);
Infor->ID=infor.ID;
this->next=head;
head=this;


bool Student::PrintAll() const

Student *p=head;
while (p->next!=NULL)

p->Infor->PrintStuInfor();
p=p->next;

return true;


Student* Student::head=NULL;
/*--------------------------------------------------------------------------------------------------------------------*/

//FILE:Main.cpp

#include <iostream>
using namespace std;

#include "Student.h"
#include "StuInfor.h"

int main(int argc,char* argv[])

StuInfor stuinfor1("张三",1001);
StuInfor stuinfor2("李四",1002);
Student stu1(stuinfor1);
Student stu2(stuinfor2);
stu1.PrintAll();
return 0;


/*--------------------------------------------------------------------------------------------------------------------*/

出错
--------------------Configuration: Student - Win32 Debug--------------------
Compiling...
Main.cpp
Linking...
Student.obj : error LNK2001: unresolved external symbol "public: __thiscall StuInfor::StuInfor(void)" (??0StuInfor@@QAE@XZ)
Debug/Student.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

Student.exe - 2 error(s), 0 warning(s)
谢谢 kivenxia。参考了你给的例子确实可以完成普通链表的创建,只是我的这个练习节点中的数据是复杂数据结构,想着用嵌套类实现。
LNK2001这个问题我遇见过多次,有时候参照网上给的做法能改好,有时不能。于是想知道这个例子中出现这个错误的原因,是那段代码出错了?
再次谢谢。

/*由于代码较长,我没有再作改动,这是数据结构编程的代码,要在C环境下运行,只需把引用方式改下即可*/

#include <stdio.h>
#include <malloc.h>
typedef struct node
float coef; /*序数*/
int expn; /*指数*/
struct node *next; /*指向下一个结点的指针*/
PolyNode;
void InitList(PolyNode *&L) /*初始化多项式单链表*/

L=(PolyNode *)malloc(sizeof(PolyNode)); /*建立头结点*/
L->next=NULL;

int GetLength(PolyNode *L) /*求多项式单链表的长度*/

int i=0;
PolyNode *p=L->next;
while (p!=NULL) /*扫描单链表L,用i累计结点个数*/

i++;p=p->next;

return i;

PolyNode *GetElem(PolyNode *L,int i) /*返回多项式单链表中第i个结点的指针*/

int j=1;
PolyNode *p=L->next;
if (i<1 || i>GetLength(L))
return NULL;
while (j<i) /*沿next域找第i个结点*/

p=p->next;j++;

return p;

PolyNode *Locate(PolyNode *L,float c,int e) /*在多项式单链表中按值查找*/

PolyNode *p=L->next;
while (p!=NULL && (p->coef!=c ||p->expn!=e))
p=p->next;
return p;

int InsElem(PolyNode *&L,float c,int e,int i) /*在多项式单链表中插入一个结点*/

int j=1;
PolyNode *p=L,*s;
s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=c;s->expn=e;s->next=NULL;
if (i<1 || i>GetLength(L)+1)
return 0;
while (j<i) /*查找第i-1个结点*p*/

p=p->next;j++;

s->next=p->next;
p->next=s;
return 1;

int DelElem(PolyNode *L,int i) /*在多项式单链表中删除一个结点*/

int j=1;
PolyNode *p=L,*q;
if (i<1 || i>GetLength(L))
return 0;
while (j<i) /*在单链表中查找第i-1个结点,由p指向它*/

p=p->next;j++;

q=p->next; /*q指向被删结点*/
p->next=q->next; /*删除*q结点*/
free(q);
return 1;

void DispList(PolyNode *L) /*输出多项式单链表的元素值*/

PolyNode *p=L->next;
while (p!=NULL)

printf("(%g,%d) ",p->coef,p->expn);
p=p->next;

printf("\n");

void CreaPolyList(PolyNode *&L,float C[],int E[],int n)

int i;
InitList(L);
for (i=0;i<n;i++)
InsElem(L,C[i],E[i],i+1);

void SortPloy(PolyNode *&L) /*对L的多项式单链表按expn域递增排序*/

PolyNode *p=L->next,*q,*pre;
L->next=NULL;
while (p!=NULL)

if (L->next==NULL) /*处理第1个结点*/

L->next=p;p=p->next;
L->next->next=NULL;

else /*处理其余结点*/

pre=L;q=pre->next;
while (q!=NULL && p->expn>q->expn) /*找q->expn刚大于或等于p->expn的结点*q的前驱结点*pre*/

pre=q;q=q->next;

q=p->next; /*在*pre结点之后插入*p*/
p->next=pre->next;
pre->next=p;
p=q;



PolyNode *AddPoly(PolyNode *pa,PolyNode *pb)

PolyNode *pc,*p1=pa->next,*p2=pb->next,*p,*tc,*s;
pc=(PolyNode *)malloc(sizeof(PolyNode)); /*新建头结点*pc*/
pc->next=NULL; /*pc为新建单链表的头结点*/
tc=pc; /*tc始终指向新建单链表的最后结点*/
while (p1!=NULL && p2!=NULL)

if (p1->expn<p2->expn) /*将*p1结点复制到*s并链到pc尾*/

s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=p1->coef;s->expn=p1->expn;s->next=NULL;
tc->next=s;tc=s;
p1=p1->next;

else if (p1->expn>p2->expn) /*将*p2结点复制到*s并链到pc尾*/

s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=p2->coef;s->expn=p2->expn;s->next=NULL;
tc->next=s;tc=s;
p2=p2->next;

else /*p1->expn=p2->expn的情况*/

if (p1->coef+p2->coef!=0) /*序数相加不为0时新建结点*s并链到pc尾*/

s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=p1->coef+p2->coef;s->expn=p1->expn;
s->next=NULL;
tc->next=s;tc=s;

p1=p1->next;p2=p2->next;


if (p1!=NULL) p=p1; /*将尚未扫描完的余下结点复制并链接到pc单链表之后*/
else p=p2;
while (p!=NULL)

s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=p->coef;s->expn=p->expn;s->next=NULL;
tc->next=s;tc=s;
p=p->next;

tc->next=NULL; /*新建单链表最后结点的next域置空*/
return pc;

void main()

PolyNode *L1,*L2,*L3;
float C1[]=3,7,5,9,C2[]=-9,8,22;
int E1[]=1,0,17,8,E2[]=8,1,7;
InitList(L1);
InitList(L2);
InitList(L3);
CreaPolyList(L1,C1,E1,4);
CreaPolyList(L2,C2,E2,3);
printf("两多项式相加运算\n");
printf(" 原多项式A:");DispList(L1);
printf(" 原多项式B:");DispList(L2);
SortPloy(L1);
SortPloy(L2);
printf("排序后的多项式A:");DispList(L1);
printf("排序后的多项式B:");DispList(L2);
L3=AddPoly(L1,L2);
printf("多项式相加结果:");DispList(L3);


/*这是第二题,由于你的链表没说是否排序,所以用的最耗时的方法,如果是排序的那用归并排序就很简单了*/

typedef struct node
int data;
struct node *next;
Link;
void merge(Link *a,Link *b,Link *c) /*设a,b都是带头结点的单链表,c是合并后的*/
Link *p,*q,*r,*s;
p=b->next;
c=(Link *)malloc(sizeof(Link));
q=c;
while(p!=NULL) /*将b复制到c*/
s=(Link *)malloc(sizeof(Link));
s->data=p->data;
q->next=s;
q=s;
p=p->next;

q->next=NULL;

p=a->next; /*找出不同的项,并连接在c的后面*/
while(p!=NULL)
r=b->next;
while(r!=NULL)
if(p->data==r->data)
break;
r=r->next;

if(r!=NULL)
s=(Link *)malloc(sizeof(Link));
s->data=p->data;
s->next=NULL;
q->next=s;
q=s;

p=p->next;



你最后看下,应该改下后就没问题了
参考技术A 我告诉你,你代码中的StuInfor类中的一个构造函数只做了声明,没有定义,就是那个默认构造函数StuInfor(void).
之所以在链接的时候报错而不是在编译的时候报错,是因为你这样做,没有语法上的错误,编译阶段检查不到.但是到了链接阶段,编译器去找你这个函数的定义时,发现找不到,所以报错!
改正的方法就是,你在StuInfor这个类当中,把默认构造函数StuInfor给定义了.像这样: StuInfor(void) 而不是像你这样StuInfor(void);声明

这样就没问题了本回答被提问者采纳

以上是关于求助 数据结构试题 谢谢!!!的主要内容,如果未能解决你的问题,请参考以下文章

求助,一片关于数学教育的翻译 请问下边的各个标题是啥意思 谢谢

练习数据结构编程时出现error LNK2001错误,求助,谢谢。

javaweb编程时,通过request向前端传递数据时,前端总是无法获得正确的数据,求助,谢谢。

求以下试题(数据结构)的详细答案~谢谢啦

易飞ERP报表数据库连接失败!!紧急求助!有知道怎么弄的帮下忙!谢谢了!

(紧急求助)请问PB中如何实现单据的审核,单据的状态有未审核以及审核两种状态,谢谢