}
vc++6.0的使用:
1.新建一个项目。
单击File,弹出图1如下:
图1
点击New后弹出如下对话框:
图2
在图2中的Projects标签下选择Win32ConsoleApplication,在右边的Projectname输入框中输入你的项目名称(此例中我们把项目名称取为FirsPro)
,在
中通过点击
可以选择项目的保存位置。
注意要选中单选按钮
,然后点击下面的
,弹出如下对话框:
图3
点击
按钮,再在随后弹出的对话框中点击“OK”按钮就建好了一个新项目了。
2.在项目中添加c++源文件。
点击如图4中的
,展现项目的文件视图。
图4
点击菜单
中的File,在弹出的菜单中点击New,弹出图2,在图2中,选择File标签
图5
在图5中选择c++SourceFile,在输入框
中输入c++源文件的文件名(此例中源文件取名为ComplexNum),注意不要加文件名后缀,点击
后就建好了一个c++源文件。
结果如图6所示:
图6
在图6中的右侧就可以输入代码了。
如图7:
完成代码的输入后点击图7中右上方
中的
进行对源代码的编译,如果没有错误,就点击
生成可执行文件,最后点击
运行该程序。
实验2:
线性表实验
一、实验前任务:
1.填空题
①线性表是一种最常见也是最简单的数据结构,它是由若干个性质相同的数据元素构成的有限序列。
其特点是:
(1)、
(2)、(3)
(4)
②表长为n的顺序存储的线性表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均个数为,删除一个元素的平均个数为。
③线性表是具有n个的有限序列。
2.简答题
1述顺序存储与链接存储的优缺点?
2数据元素是数据的最小单位。
(判断正误)
3线性表采用链表储时,结点和结点内部的存储空间可以是不连续的。
(判断正误)
4若较频繁地对一个线性表进行插入和删除操作,该线性表宜采用何种存储结构?
为什么?
二、实验练习
1.实验练习1:
线性表输出
●实验目的
1、掌握线性表的特点;
2、根据线性表的存储结构实现相关算法。
●问题描述
有一整数数组T[n],要求“不用循环”按下标顺序输出数组元素。
●问题解答提示
把循环的条件改一下(改成只执行一次循环体的情形),就可以用顺序和循环表示分支;而用分支和顺序结构则可以通过递归表示循环。
此题用递归来实现。
三、实验后任务
分析程序算法,写出实验报告。
四、
1.编码练习
针对以下问题,请编写一个程序或一个程序段,以完成指定的操作
(1)设指针p指向双向链表中的结点K,指针f指向将要插入的新结点X,X要插在结点K之后,写出指针需要修改的有关步骤。
……
(2)写一算法,将一单链表逆转。
要求逆转在原链表上进行,不允许重新构造一个链表。
…
2.编程挑战。
在一个递增有序的线性表中,有数值相同的元素存在。
若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素。
例如(6,9,9,21,30,45,45,45,52,70)将变作(6,9,21,30,45,52,70),分析算法的时间复杂度。
实验3:
栈、队列实验内容
三、实验前任务:
1.填空题
①栈是的线性表,栈实现有
和两种实现方式。
②栈中数据的入出栈均在栈的一端进行,我们称为;栈中数据的出栈顺序与入栈顺序正好相反,因而栈又称为。
③队列为空的条件是。
从数据入出队列的先后顺序来说,队列是一种的线性表。
我们将队列中数据入队列的一端称为,允许数据出队列的一端称为一端称为。
2.简答题
1简要叙述栈在顺序与链式存储结构下栈空条件的异同?
2为什么说栈是LIFO结构?
3写出下列的算术表达式的后辍式,并写出由中辍表达式得出后辍式的具体过程。
a+b*(c–d)+e/f
4分析由后辍式求表达式值的具体过程,写出每一步骤下堆栈内数据的变化过程。
以(12+3 *(2-4))/2为例。
四、实验练习
1.实验练习
1:
栈实现
●实验目的
1、掌握栈的特点;
2、根据栈的存储结构实现相关算法及类。
●问题描述
有一栈ST,现输入N个数,存于ST中,然后将栈中的数据依次出栈输出。
●问题解答提示
1initializestackST;cnt←N
2inputx;
3ST.Push(x)
4cnt--;
5ifcnt>0thengoto2
6whilenotST.IsEmpty()
printST.Pop();
7end
2:
队列实现
●实验目的
3、掌握循环队列的特点;
4、根据循环队列存储结构实现相关算法及类。
●问题描述
有一循环队列RQ,现输入N个数,存于RQ中,然后将队列中的数据依次出队列输出。
●问题解答提示
1initializequeueRQ;cnt←N
2inputx;
3RQ.EnQueue(x)
4cnt--;
5ifcnt>0thengoto2
6whilenotRQ.IsEmpty()
printRQ.DeQueue();
7end
五、实验后任务
分析程序算法,写出实验报告。
六、
1.编码练习
针对以下问题,请编写一个程序或一个程序段,以完成指定的操作
(1)写出下列的算术表达式的后辍式,并写出由中辍表达式得出后辍式的具体过程.
a+b*(c–d)+e/f
……
(2)写一算法,对中辍表达式(12+3 *(2-4))/2求值。
…
2.编程挑战。
写一C++程序,对输入的中辍表达式,完成如下任务:
1)动态对表达式中的变量进和地赋值
2)将中辍式变换为后辍式;
3)对2生成的后辍式自左向右扫描求值。
五栈实现参考代码
typedefintBOOL;
#defineTRUE1
#defineFALSE0
templateclassCExStack;
template
classCStackNode
{
friendclassCExStack;
public:
CStackNode():
next(NULL){};
~CStackNode(){};
CStackNode(Te):
data(e),next(NULL){};
CStackNode(Te,CStackNode*pnext=NULL):
data(e),next(pnext){};
protected:
Tdata;
CStackNode*next;
};
template
classCExStack{
protected:
CStackNode*top;
public:
CExStack(){top=newCStackNode();};
~CExStack(){Destory();deletetop;};
voidPush(Te){
CStackNode*p=newCStackNode(e);
p->next=top->next;
top->next=p;
return;
};
TPop(){
Te=top->next->data;
CStackNode*q=top->next;
top->next=q->next;
deleteq;
returne;
};
TGetTop(){
returntop->next->data;
};
BOOLIsEmpty(){
returntop->next==NULL;
};
BOOLDestory(){
while(top->next!
=NULL){
CStackNode*q=top->next;
top->next=q->next;
deleteq;
}
returnTRUE;
};
};
实验4:
树
实验目的:
1)熟悉二叉树结点的结构和对二叉树的基本操作;
2)掌握对二叉树每一种操作的具体实现;
3)学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。
实验内容(任选):
1、定义二叉树的类型
2、根据嵌套括号表示法的字符串*str生成链接存储的二叉树
3、以嵌套括号表示法输出一棵二叉树
4、先序遍历的(非)递归算法
5、中序遍历的(非)递归算法
6、后序遍历的(非)递归算法
7、采用先序遍历查找值为X的结点
8、求二叉树的深度
9、判别给定的二叉树是否为完全二叉树
10、哈夫曼树和哈夫曼编码:
从终端输入若干个字符,统计字符出现的频率,将字符出现的频率作为节点的权值,建立哈夫曼树,然后对各字符进行哈夫曼编码,最后打印哈夫曼树和对应的哈夫曼编码。
11、由中辍表达式建立一棵二叉树BT,输出BT的前序编历、中序、后序编历的结果,并以后序编历为基础,对该表达式求值。
问题解答提示:
1、定义二叉树的类型
#defineMaxsize100
#defineMaxwidth40
typedefcharelemtype;
typedefstructnode
{elemtypedata;
structnode*left,*right;
}BTree;
2、根据嵌套括号表示法的字符串*str生成链接存储的二叉树
voidcreatree(BTree*&b,char*str)
{BTree*stack[Maxsize],*p;
inttop=-1,k,j=0;//top为栈指针,k指定是左还是右孩子,j为str指针
charch;
b=NULL;
ch=str[j];
while(ch!
=’\0’)
{switch(ch)
{case‘(‘:
top++;stack[top]=p;k=1;break;//为左结点
case‘)’:
top--;break;
case‘,’:
k=2;break;//为右结点
default:
p=(BTree*)malloc(sizeof(BTree));
p->data=ch;p->left=p->right=NULL;
if(b==NULL)//根结点
b=p;
else
{switch(k)
{case1:
stack[top]->left=p;break;
case2:
stack[top]->right=p;break;
}
}
}
j++;
ch=str[j];
}
}
3、采用先序遍历查找值为X的结点
Btree*find(BTree*b,elemtypex)
{BTree*p;
if(b==NULL)
returnNULL;
elseif(b->data==x)
returnb;
else
{p=find(b->left,x);
if(p!
=NULL)
return
4、哈夫曼树和哈夫曼编码:
在程序中构造四个子程序
intfreqchar(char*text,Btree*t)//统计字符出现的频率
intcreatetree((Btree*t)//根据字符出现的频率建立哈夫曼树
voidcode(Btree*t,inthead,char*code)//对哈夫曼树进行编码
voidprinttree(Btree*t,inthead,intdeep,int*path)//中序打印树
三、实验后任务:
1、以二叉链表作为存储结构,试编写求二叉树深度的算法。
2、一棵n个节点的完全二叉树存放在二叉树的顺序存储结构中,试编写非递归算法对该树进行前序遍历。
3、以二叉链表作为存储结构,设计算法交换二叉树中所有节点的左右子树。
四、参考代码(C++版)
templateclassBiTree;
//externvoidCreateTree(BiTreeNode*);
template
classBiTreeNode{
friendclassBiTree;
friendvoidCreateTree(BiTreeNode**);
public:
Tdata;
BiTreeNode*left,*right;
public:
BiTreeNode():
left(NULL),right(NULL){};
BiTreeNode(BiTreeNode*l,BiTreeNode*r,Titem):
data(item),left(l),right(r){};
};
template
classBiTree{
friendvoidCreateTree(BiTreeNode*);
public:
intindex;
BiTreeNode*root;
public:
BiTree():
root(NULL){index=1;};
BiTree(BiTreeNode*&parent,BiTreeNode*l,BiTreeNode*r,Titem){
BiTreeNode*pNode=newBiTreeNode(l,r,item);
parent=pNode;
index=1;
};
InSertNode(Titem,BiTreeNode*&parent){
BiTreeNode*pNode=newBiTreeNode(l,r,item);
parent=pNode;
return1;
};
InSertNode(BiTreeNode*e,BiTreeNode*&parent){
parent=e;
return1;
};
voidInTraverse(BiTreeNode*root){
if(root){
InTraverse(root->left);
if(root->left&&root->right)
printf("%3c",root->data.data.op);
else
//if(root->st==0.0)
printf("%3.0f",root->st);
InTraverse(root->right);
}
return;
};
floatOperate(charop,floatopr1,floatopr2){
//TODO:
addyourcodehere
return0;
}
voidPostTraverse(BiTreeNode*root){
if(root){
PostTraverse(root->left);
PostTraverse(root->right);
/*
if(root->left&&root->right)
printf("%3c",root->data.data.op);
else
//if(root->st==0.0)
printf("%3.0f",root->st);
*/
if(!
root->left&&!
root->right)
//TODO:
addyourcodehere
}
return;
};
};
实验5:
图
实验目的:
1、掌握图的各种存储结构,特别要熟练掌握邻接矩阵和邻接表存储结构
2、遍历试图各种应用的算法的基础,要熟练掌握图的深度优先遍历和广度优先遍历算法,复习栈和队列的应用。
3、掌握以邻接矩阵作为存储结构的生成图的最小生成树的普里姆算法和克鲁士卡尔算法。
问题描述:
1、采用邻接表存储结构,实现图的基本运算:
(1)、图类型定义
(2)、根据用户输入创建一个图
(3)、输出一个图
(4)、从顶点V开始深度优先搜索图
(5)、从顶点V开始广度优先搜索图
2、在一个邻接表存储的图中,分别实现以下算法:
(1)、求出图中每个顶点的出度;
(2)、求出图中出度最大的点,输出该点的编号
//队列的头文件Queue.h
#include
constintMaxSize=10;
template
classQueue
{
private:
intfront,rear;
Typedata[MaxSize];
public:
Queue(){front=rear=0;}
boolIsEmpty(){returnfront==rear;}
voidEnQue(Type&elem);
boolIsFull(){return(rear+1-front+MaxSize)%MaxSize==0;}
Type&DeQue();
};
template
voidQueue:
:
EnQue(Type&elem)
{
rear=(rear+1)%MaxSize;
data[rear]=elem;
}
template
Type&Queue:
:
DeQue()
{
front=(front+1)%MaxSize;
Typetemp;
temp=data[front];
returntemp;
}
//图的头文件Graph.h
#include
#include"Queue.h"
constintMaxEdges=50;//最大边数
constintMaxVertices=10;//最大顶点个数
classGraph
{
private:
charVertices[MaxVertices];//顶点数组
intEdge[MaxVertices][MaxVertices];//邻接矩阵
intnumOfVertices;//图中顶点的个数
public:
//给定顶点数构造图
Graph(intsz=MaxVertices);
//建立图的邻接矩阵
voidCreateAdjacentMatrix(intk1=0,intk2=0);
//检查输入的边序号是否越界,若越界则重新输入
voidCheck(intn,inti,intj);
//从初始点v出发深度优先遍历(DFS)图
voidDFS(intv);
//深度优先遍历函数
voidDFS(intv,int*visited);