数据结构试题;设一棵二叉树以二叉链表为存储结构,试写一算法求该二叉树上度为2的结点个数
算法步骤:
设根节点为 r。
情况1,如果 r 既有左孩子又有右孩子,则返回 1 + 递归求左子树度为2节点个数 + 递归求右子树度为2节点个数。
情况2,如果 r 只有左孩子,则返回 递归求左子树度为2节点个数。
情况3,如果 r 只有右孩子,则返回 递归求右子树度为2节点个数。
情况4,如果 r 既没有左孩子又没有右孩子,则返回 0。
具有N个结点的二叉树,采用二叉链表存储,共有( )个空 链域.
这道数据题一共有N+1个空链域。二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点。满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树被称为满二叉树。完全二叉树:深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,称为完全二叉树。
C语言elemtype,其中elemtype不是关键字,那么如果我要让这个语句在C程序中能执行,应该怎么写?
我理解你说的意思是不是想让elemtype可以替换任意一种类型? 如果是的话,这种东西叫做模板,它是C++的内容,不在C语言的范畴内。 具体用法是: template typedef struct{ elemtype *elem; int length; int listsize; }sqlist; 之后声明变量时要赋予elemtype一个已知的类型,比如int。 struct sqlist a; 对于a这里面的elemtype就变成了int。 不过这是C++的内容,C里面不能用。 如果不用模板,而必须在C语言里用的话,有两种方法。 1. 之前声明它 typedef int elemtype; 2. 之前预编译它 #define elemtype int
C语言中,ElemType 是什么数据类型?
在C语言数据结构中,关于数据元素的类型定义均用“
ElemType
e;”来表示,其中e是表示数据元素的变量,而ElemType则是它的类型,ElemType的含义就是“数据元素的类型”,是一个抽象的概念,是表示我们所要使用的数据元素应有的类型。
ElemType是数据结构上为了说明问题而用的一个词。它是element
type(“元素的类型”)的简化体。
因为数据结构是讨论抽象的数据结构和算法,一种结构中元素的类型不一定是整型、字符型、浮点型或者用户自定义类型,为了不重复说明,使用过程用
“elemtype”
代表所有可能的数据类型,简单明了的概括整体。
在算法中,除特别说明外,规定ElemType的默认是int型。
拓展资料:
Elem
Type的使用方法:
在定义结构体array的时候有这样一段:
typedef
struct
{
ElemType
data[maxsize];
int
length;
}array;
使用:typedef
int
ElemType;//定义ElemType为int类型
你想让它是什么类型自己用typedef重定义就行。
也可以用模板表示,类似template<class
T>里面的T。
c语言常见的数据结构有哪些?
1、线性数据结构元素之间一般存在元素之间存在一对一关系,是最常用的一类数据结构,典型的有:数组、栈、队列和线性表。2、树形结构结点间具有层次关系,每一层的一个结点能且只能和上一层的一个结点相关,但同时可以和下一层的多个结点相关,称为“一对多”关系,常见类型有:树、堆。3、图形结构在图形结构中,允许多个结点之间相关,称为“多对多”关系。(1)线性数据结构:元素之间一般存在元素之间存在一对一关系,是最常用的一类数据结构,典型的有:数组、栈、队列和线性表(2)树形结构:结点间具有层次关系,每一层的一个结点能且只能和上一层的一个结点相关,但同时可以和下一层的多个结点相关,称为“一对多”关系,常见类型有:树、堆(3)图形结构:在图形结构中,允许多个结点之间相关,称为“多对多”关系
数据结构与c语言是什么关系
C语言是一种编程的语言,编程的语言有很多种。
数据结构则是讲的是关于一些数据的理论知识。不管什么编程语言都能用到数据结构的知识,数据结构是程序设计基础又核心的知识。
可以将c语言想象为一种语言,数据结构就是一种说话的技巧,如何使说话更简洁,有逻辑,容易让人听懂,这表达技巧不管用中文或者英语都可用到。
C语言是用来讲解数据结构的一种方法,也可以用JAVA语言来讲解。数据结构可以帮助了解内存是怎样存储数据,也可以帮提升自已的编程能力。
《数据结构(C语言版)》pdf下载在线阅读全文,求百度网盘云资源
《数据结构(C语言版)》(严蔚敏)电子书网盘下载免费在线阅读链接: https://pan.baidu.com/s/1LjQAo9GcvRLb9pPpvdmBTw 提取码: mwrr书名:数据结构(C语言版)作者:严蔚敏豆瓣评分:6.1出版社:清华大学出版社出版年份:2012-5页数:335内容简介:《数据结构》(C语言版)是为“数据结构”课程编写的教材,也可作为学习数据结构及其算法的C程序设计的参数教材。本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。其内容和章节编排1992年4月出版的《数据结构》(第二版)基本一致,但在本书中更突出了抽象数据类型的概念。全书采用类C语言作为数据结构和算法的描述语言。作者简介:严蔚敏 清华大学计算机系教授,长期从事数据结构教学和教材建设,和吴伟民合作编著的《数据结构》曾获“第二届普通高等学校优秀教材全国特等奖”和“1996年度国家科学技术进步奖三等奖”。吴伟民 广东工业大学计算机学院副教授,硕士生导师。广东省计算机学会图像图形分会秘书长。长期从事数据结构教学和系列教材建设。主要研究领域:数据结构和算法、可是计算、编译和虚拟机技术、智能系统等。和严蔚敏合作编著的《数据结构》曾获“第二届普通高等学校优秀教材全国特等奖”和“1996年度国家科学技术进步奖三等奖”。
《数据结构(C语言版)》pdf下载在线阅读,求百度网盘云资源
《数据结构(C语言版)》(严蔚敏)电子书网盘下载免费在线阅读资源链接:链接:https://pan.baidu.com/s/1BmtD5k3mLtJZO36Xw_Hq3w 密码:5dfz 书名:数据结构(C语言版)作者:严蔚敏豆瓣评分:6.1出版社:清华大学出版社出版年份:2012-5页数:335内容简介:《数据结构》(C语言版)是为“数据结构”课程编写的教材,也可作为学习数据结构及其算法的C程序设计的参数教材。本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。其内容和章节编排1992年4月出版的《数据结构》(第二版)基本一致,但在本书中更突出了抽象数据类型的概念。全书采用类C语言作为数据结构和算法的描述语言。本书概念表述严谨,逻辑推理严密,语言精炼,用词达意,并有配套出版的《数据结构题集》(C语言版),便于教学,又便于自学。本书后附有光盘。光盘内容可在DOS环境下运行的以类C语言描述的“数据结构算法动态模拟辅助教学软件,以及在Windows环境下运行的以类PASCAL或类C两种语言描述的“数据结构算法动态模拟辅助教学软件”。本书可作为计算机类专业或信息类相关专业的本科或专科教材,也可供从事计算机工程与应用工作的科技工作者参考。作者简介:严蔚敏 清华大学计算机系教授,长期从事数据结构教学和教材建设,和吴伟民合作编著的《数据结构》曾获“第二届普通高等学校优秀教材全国特等奖”和“1996年度国家科学技术进步奖三等奖”。吴伟民 广东工业大学计算机学院副教授,硕士生导师。广东省计算机学会图像图形分会秘书长。长期从事数据结构教学和系列教材建设。主要研究领域:数据结构和算法、可是计算、编译和虚拟机技术、智能系统等。和严蔚敏合作编著的《数据结构》曾获“第二届普通高等学校优秀教材全国特等奖”和“1996年度国家科学技术进步奖三等奖”。
数据结构和C语言有什么区别
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
区别:数据结构主要是关于数据的理论知识,而C语言是实现这种数据理论的方式。
数据结构c语言版,出队入队及依次输出一个队列的操作。
黑色的提示框是程序运行结果窗口,不是错误的窗口 代码错误说明如下:while(Q->front!=Q->rear)//在本循环体之中,Q->front Q->rear的值始终没有变化//故而在这里肯定是一个死循环{ printf("%d, ", Q->front->next->data); Q->front->next=Q->front->next->next;}//改正后的代码如下:QNode* s = Q->front;while(s!=Q->rear){ printf("%d, ", s->data); s=s->next;} 另外,所有的函数当中不应该有exit exit是一个系统函数,表示结束程序,而不是退出函数 如果需要退出函数可以使用return来达到该目的
数据结构 栈的出队入队完整代码
#define STACKSIZE 100int mstack[STACKSIZE],top,bottom;void mInitStack() { top=bottom=0; }void mPush(int x) { if ( top-bottombottom ) { r=mstack[top]; top--; } return r; }void mShowStack() { int i; printf("["); for ( i=bottom;i<top;i++ ) printf("%d ",mstack[i]); printf("]\n"); }void main(){ int i,n,x,loop=1,s; char buffer[80]; mInitStack(); scanf("%d",&n); for ( i=0;i<n;i++ ) { scanf("%d",&x); mPush(x); } mShowStack(); while ( loop ) { buffer[1]=0; gets(buffer); s=1; switch ( buffer[1] ) { case 'O': case 'o': x=mPop(); break; case 'U': case 'u': x=atoi(buffer+5); mPush(x); break; case 'n': case 'N': loop=0; break; default: s=0; break; } mShowStack(); } mShowStack();}
数据结构顺序表的c语言代码实现,主函数测试时插入和删除操作不能得到预期结果
你的代码中的插入和删除操作根本就无法实现,应为函数无法修改main()函数中传入的实参变量的,把形参改成指针才行代码改成如下:#include #define Maxsize 50#define FALSE 0#define TRUE 1typedef int ElemType;typedef int Status;typedef struct{ElemType data[Maxsize];int length;}SqList;Status LocateElem(SqList L,int e){//按值查找int i;if(L.length==0)return FALSE;for(i=0;ilength==Maxsize) //把 .改成 ->return FALSE;if(iL->length+1)return FALSE;for(j=L->length-1;j>=i-1;j--) //把 .改成 ->L->data[j+1]=L->data[j];//把 .改成 ->L->data[i-1]=e;//把 .改成 ->L->length++;//把 .改成 ->return TRUE ;}Status Delete(SqList * L,int i){//删除操作 //修改成指针int j;if(L->length==0)//把 .改成 ->return FALSE;for(j=i;jlength;j++){//把 .改成 ->L->data[j-1]=L->data[j];//把 .改成 ->}L->length--;//把 .改成 ->return TRUE;}SqList CreateList(SqList L){int i;L.length=30;for(i=0;i<L.length;i++){L.data[i]=i+1;}return L;}void printSqList(SqList L){int i;for(i=0;i<L.length;i++){printf("顺序表第%d个元素值为%d\n",i+1,L.data[i]);}printf("\n\n");}void main(){int k;int e; //待查元素int insertData;//待插元素int insert_location,delete_location;//插入位置及删除位置int isInserted,isDeleted;//判断是否插入或删除成功SqList L=CreateList(L);printSqList(L);printf("请输入您要查找的值:");scanf("%d",&e);k=LocateElem(L,e);printf("您要查找的值在顺序表第%d个\n",k);printf("\n\n");printf("请输入您要插入的位置:");scanf("%d",&insert_location);printf("\n");printf("请输入您要插入的值:");scanf("%d",&insertData);isInserted=Insert(&L,insert_location,insertData);if(isInserted){printf("%d",L.data[insert_location-1]);}printf("\n\n");printf("请输入您要删除的位置:");scanf("%d",&delete_location);printf("\n");isDeleted=Delete(&L,delete_location);if(isDeleted){printf("\n");printSqList(L);}}如果是C++可以把函数变成引用,那更简单
急求顺序表插入删除的代码,C语言版的数据结构,谢谢
/在指定的位置pos上插入一个数据元素item
void SeqList::Insert(const DataType&item,int pos)
{
int i;
if(size==MaxListSize)
{
printf("顺序表已满无法插入\
");
return 0;
}
if(possize)
{
printf("参数pos越界出错\
");
return o;
}
for(i=size;i>pos;i++)
data[i]=data[i-1];
data[pos]=item;
size++;
}
//删除指定位置pos上的数据元素并返回
DataTypeSequList::Delete(const int pos)
{
if(zize==0)
{printf("顺序表已空无元素可删除\"); return 0; }
if(possize-1)
{
printf("参数pos越界出错\
");
return 0;
}
DataType temp=data[pos];
for(int i=pose;i<size-1;i++)
data[i]=data[i+1];
size--;
return temp;
}
数据结构---C语言基础
程序=算法+数据结构 数据结构是设计OS、DBMS、编译等系统程序和各种应用程序的重要基础。 常见的数据结构有:数组、栈、队列、表、串、树、图和文件等。 数据是什么? ①杂乱的数据不能表达和交流信息 ②数据之间是有联系的 ③数据之间是有结构的; ④在某种数据的结构上可以定义一组运算 程序设计的基本要素: 数据(Date) :所有能被计算机处理的符号的集合。 数据元素(Data Element) :数据这个集合中的单个个体。 数据项(Data Item) :数据元素常常被分为若干个数据项,数据项是数据具有意义的最小单位。 数据对象(Data Object) :具有相同特性的数据元素的集合。 数据结构(Data Structure) :是带有结构的数据元素的集合。 逻辑结构(Logical Structure) :指数据元素之间的结构关系。 物理结构(Physical Structure) :指数据结构在计算机内存中的表示。 物理结构的存放直接决定了逻辑结构的选择。 什么是算法 算法是一个有限的指令集,遵循指令流可以完成特定的功能。 算法的基本特性: 如何衡量一个正确算法的好坏? 算法与程序的区别 主要区别在:有穷性、正确性和描述方法 程序可以是无穷的,例如OS。 算法是有穷的;程序可以是错误的,算法必须是正确的; 程序是用程序设计语言描述,在机器上可以执行; 算法还可以用框图、自然语言等方式描述。 衡量的三个标准: 运行所花费的时间(算法的时间特性); 所占用存储空间的大小(算法的空间特性); 其他(可读性、易调性、健壮性、可移植性等) 时间和空间特性的巨大改进源于更好的数据结构或算法。 为什么要计算时间复杂度? 设:A1,A2和A3是求解同一问题的不同算法,其时间复杂度分别为:O(n), O(nlogn), O(N!)。 C1和C2为计算机,且C2的计算速度是C1的10倍。 不必追求高效算法,低效算法可由高速计算机来弥补的看法,是错误的。
数据结构(c语言版)求助,我想了好久都没想出来?
这里一共是3层循环①、②、④,其关系如下图所示内外层循环关系示意图其中①是最外层循环,②是中间层循环,④是最内层循环,各语句的执行顺序是:先从最外层循环开始①、 ②、 ③各执行一次,到最内层④后,④连续执行(n+1)次,其内部语句⑤连续执行 n 次 ,然后返回至中间层 ②执行下一次,②每执行一次,③就执行一次,④连续执行(n+1)次,⑤连续执行 n 次 ,直至②执行(n+1)次后返回至①执行下一次,如此往复循环直至①执行(n+1)次后循环结束。也就是①每执行一次,②执行(n+1)次,③执行 n 次 ;②每执行一次,④执行(n+1)次,⑤执行 n 次 ;所以:②的执行次数是 n ✖(n+1)=n(n+1)③的执行次数是 n ✖ n=n2④的执行次数是 n ✖ n ✖(n+1)=n2(n+1)⑤的执行次数是 n ✖ n ✖ n=n3
数据结构习题
一、选择题
1.C
2.D
解析:A.完全二叉树可以用数组存储,树是非线性结构
B.链表且插入和删除运算效率高
C.链表也有双向链表 ,有两个指针域
3.A
4.A.顺序表可随机访问任一元素
5.D
6.这道题你是不是弄错了 全都对啊
7.D 满二叉树 :结点总数目N=2^H -1 H为数高度 ,求出结点总数为255
满二叉树,只有度为0 和度为2 的结点,度为0 的结点等于度为1 结点数目+1 因此选D
8.C 这题不用画图就可做出来, 后序遍历序列是dabec,------》得到根节点是:c
前序遍历;根左右 所以第一个一定是c 只有A项符合
9. A 虽然你没给图 但是一般都是A相 因为见过好多这个题 中序遍历和层次遍历结果一样
10. D
11.C
12.B 在最坏情况:比较次数为___每次查找都要从第一个比较到最后一个,都要遍历N次 :
总的比较次数N*N,平均比较次数就是N
13. C
二、填空题
1.出栈
2.n/2+n/(n+1) 1+2+3……n+n)/(n+1)=.n/2+n/(n+1)
3.1
4.设待排数据元素的关键字为(67,24,14,22,33,15,11,15),用选择法将其按升序排序,需要比较的次数为【 】。
5.13
6.11 3+6+2=11
*7.15 方法 同选择题 上那个满二叉树
8.无图
9. 16 和第七题一样的方法
跪求数据结构(c语言版)的几个问题解答
实验一
单链表有一个头节点h
e
a
d,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为N
U
L
L。
删除运算是将表的第i个结点删去。
具体步骤:
(1)找到要删除结点ai的存储位置p(因为在单链表中结点ai的存储地址是在其直接前趋结点ai-1的指针域next中)
(2)令p->next指向ai的直接后继结点(即把ai从链上摘下)
(3)释放结点ai的空间,将其归还给"存储池"。
插入运算是将值为x的新结点插入到表的第i个结点的位置上,即插入到ai-1与ai之间。
具体步骤:
(1)找到ai-1存储位置p
(2)生成一个数据域为x的新结点*s
(3)令结点*p的指针域指向新结点
(4)新结点的指针域指向结点ai。
#include
typedef
int
numtype;
typedef
float
scoretype;
typedef
struct
node
{numtype
num;
scoretype
score;
struct
node
*next;
}linklist;
int
n;
//创建单链表
linklist
*creat()
{
linklist
*head,*p1,*p2;
n=0;
p1=p2=(linklist*)malloc(sizeof(linklist));
printf("请输入第1个学号:\n");
//单链表内容,学号和成绩
scanf("%d",&p1->num);
printf("请输入第1个成绩:\n");
scanf("%f",&p1->score);
head=NULL;
while(1)
{n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(linklist*)malloc(sizeof(linklist));
printf("请输入第%d个学号:\n",n+1);
scanf("%d",&p1->num);
if(p1->num
==
0)
//这里是终止输入的符号,也就是学号输入0,那么就停止输入。你也可以设置为其它的符号
break;
printf("请输入第%d个成绩:\n",n+1);
scanf("%f",&p1->score);
}
p2->next=NULL;
return
head;
}
//单链表的插入
linklist
*insert(linklist
*head,linklist
*stud)
{
linklist
*p1,*p2,*p0;
p1=head;
p0=stud;
if(head==NULL)
{
head=p0;p0->next=NULL;}
else
{
while((p0->score>=p1->score)&&(p1->next!=NULL))
{
p2=p1;p1=p1->next;
}
if(p0->scorescore)
{
if(head==p1)
head
=p0;
else
p2->next=p0;
p0->next=p1;}
else
{
p1->next=p0;
p0->next=NULL;
}
}
return
head;
}
//单链表的删除
linklist
*del(linklist
*head,float
dscore)
{
linklist
*p1,*p2;
if(head==NULL)
{printf("\n
list
is
NULL!");
return
(head);
}
else
{
p1=head;
while((dscore!=p1->score)&&(p1->next!=NULL))
{
p2=p1;
p1=p1->next;
}
if(dscore
==
p1->score)
{
if(p1==head)
head=head->next;
else
p2->next=p1->next;
free(p1);
printf("已删除:%.2f\n",dscore);
}
else
printf("%.2f
没有在链表中找到!\n",dscore);
}
return
head;
}
//输出单链表
void
display(linklist
*r)
{linklist
*t;
t=(linklist*)malloc(sizeof(linklist));
t=r;
printf("\n
单链表显示
:\n学号\t成绩\n");
if(t==NULL)
printf("链表为空。");
else
while(t!=NULL)
{
printf("%d\t",t->num);
printf("%.2f\n
",t->score);
t=t->next;
}
printf("\n");
}
//单链表的插入与删除
int
main()
{
float
s;
linklist
*q,*p;
p=(linklist*)malloc(sizeof(linklist));
q=creat();
display(q);
printf("请输入要删除的结点对应的成绩:");
scanf("%f",&s);
q=del(q,s);
display(q);
printf("请输入要插入的学号和成绩:\n");
printf("学号:");
scanf("%d",&p->num);
printf("成绩:");
scanf("%f",&p->score);
q=insert(q,p);
display(q);
return
0;
}