当前位置:文档之家› 数据结构课程实习报告

数据结构课程实习报告

数据结构课程实习报告
数据结构课程实习报告

课程名称:指导老师:学生姓名:班级:学号:

实习题一

1.需求规格说明

【问题描述】

大数运算——计算n的阶乘(n大于等于20)

【基本要求】

数据的表示和存储:累积运算的中间结果和最终的计算结果的数据类型要求是整型,试设计合适的存储结构,要求每个元素或结点最多存储数据的 3 位数值。

数据的操作及其实现:基于设计的存储结构实现乘法操作,要求从键盘上输入n 值;在屏幕上显示最终计算结果。

2.总体分析与设计

【设计思想】

因为大数的阶乘算出来的数值比较大,位数远远超过一个int或double行的位数,为了精确性的考虑,阶乘后的结果要用一种存储结构来存储并且累加和处理。所以要设计一个这样的数据结构实现对数据的存储,例如让每个存储单元只存储一部分的数值,在也运算的时候采用算数运算的进位方法来运算。

【设计表示】

抽象数据类型 Chain{

实例

链表头指针

操作

Chain():将链表头指针赋值为零;

Delete(k, x):删除第k个元素并且把它存在x中;

Insert(k, x):把x存到第k个节点;

};

定义一个ChainNode模板类来表示链表类的成员变量,其主要包含两个数据域,data和link,data表示节点的数值域,link表示链接域。然后在定义一个Chain类模板来表示要存储数据的数据类型包含first头指针和insert还有delete函数,insert 用来添加节点,delete用来删除节点,first永远指向链表的头指针,以保存这个链表的完整性。

在主函数中加一些代码来实现大数的阶乘过程中链表的操作,在进位时,如果没有高位,就insert一个节点并且将进位的数据插到生成的节点当中,当向高位进位的

时候,如果有高位就将仅为的数值和原高位相加,判断是否需要在进位,循环上述判断。

3.编码

开始做的时候每一个节点中的数值运算不太好处理,毕竟不是int,乘法的时候进位的判断和加法,循环等十分复杂,判断语句很难实现好。解决方法就是调试了一个星期,把每个判断与循环做好注释,在跟踪的时候看哪个判断出了问题,在注意解决,这题还比较简单,所以比较好调。

4.程序及算法分析

在main函数开头输入运算阶乘的数据number,然后从2开始做乘法运算,如果超过10就向前进位,如果没有前节点就insert,如果有就加在前节点的data域上面,如果加了之后有大于10,就循环前面的步骤,然后将链表的数值一个个给数组,倒过来输出就是结果了。

链表的insert是往前面插,所以输出的时候有点麻烦,所以我引进了一个中间的数组来帮助输出,要是做的链表是向后插的话就比较好输出,这是值得改进的。还有就是在main里写代码不是太好,所以吧那部分放到一个函数里就比较简洁了。体会是想清楚了控制判断,把程序写出来还是比较容易的。需要花时间、

5.附录

【代码】

#include "stdafx.h"

#include "iostream.h"

template

class Chain;

template

class ChainNode

{//将chain声明为chainnode的友元以

//使其访问chainnode的私有变量

friend Chain;

public:

T data;

ChainNode* link;

};

template

class Chain

{

public:

Chain(){first=0;}

~Chain();

Chain& Delete(int k,T& x);

Chain& Insert(int k,const T& x);

ChainNode* first;

};

template

Chain::~Chain()

{

ChainNode* next;

while (first)

{

next=first->link;

delete first;

first=next;

}

}

template

Chain& Chain::Delete(int k,T& x)

{//delete的实现

ChainNode* p=first;

if (k==1)

{

first=first->link;

}

else

{

ChainNode* q=first;

for (int index=1;index

{

q=q->link;

}

p=q->link;

q->link=p->link;

}

x=p->data;

delete p;

return *this;

}

template

Chain& Chain::Insert(int k,const T& x) {//insert的实现

if(k<0)

{cout<<"out of bound!"<

ChainNode *p=first;

for(int index=1;index

{

p=p->link;

}

if(k>0 &&!p)

{cout<<"out of bound!"<

ChainNode *y=new ChainNode;

y->data=x;

if(k)

{

y->link=p->link;

p->link=y;

}

else

{

y->link=first;

first=y;

}

return *this;

}

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

{//i为临时变量total是表示和的大小

//rest是看进位的数值大小

int i=0,count=2,number,total,rest=0,j=0;

int NO[100];//在最后要倒置是用到的临时数组cout<<"Enter a Number:"<

cin>>number;

Chain chain;

chain.Insert(0,1);

ChainNode* currentfirst=chain.first;

//保存chain的first以免破坏chain

for (count=2;count<=number;count++)

{

while (currentfirst)

{

total=(currentfirst->data)*count+rest;

//total是当前节点的值大小从小到大乘

//直到乘到输入数据number

rest=0;

if (total>9)

{//如果大于十取余

currentfirst->data=total%10;

rest=total/10;//rest表示取余后的大小

if (!(currentfirst->link))

{//如果没有上一节点,insert

j++;

i++;

chain.Insert(i,0);

}

}

else

{//total小于10

currentfirst->data=total;

}

currentfirst=currentfirst->link;

}

currentfirst=chain.first;

rest=0;//清零,不然下次加的时候受上次运算的影响

total=0;

}

currentfirst=chain.first;

for (i=0;i<=j;i++)

{

NO[i]=currentfirst->data;//currentfirst 只有有限个,不一定有100个!

currentfirst=currentfirst->link;

}

//输出

for (i=0;i<=j;i++)

{

cout<

}

cout<

return 0;

}

【输出】

实习题二

1.需求规格说明

【问题描述】

对一个合法的中缀表达式求值

假设表达式只包含+,-,*,/四个双目运算符,并且运算符本身不具有二义性。

【基本要求】

1.正确的解释表达式;

2.符合四则运算法则;

3.输出后计算结果;

2.总体分析与设计

【设计思想】

为每一个运算符设定一个优先级,然后根据输入的中序表达式将其变成后序表达式,在根据后序表达式求得表达式的值。

【设计表示】

抽象数据类型 Stake{

实例

元素线性表,栈回底,栈顶

操作

IsEmpty():如果栈为空,返回true,否则回false

IsFull():如果栈满,返回true,否则返回false

Top():返回栈顶指针;

Add(x):向栈中加元素x;

Delete(x):删除栈顶元素存在x中;

}

顶点i的入度

先写级函数,这里写的是level函数,传入的是操然后返回其优先级,左括号‘(’的优先级最大。设置为2,右括号‘)’和‘#’的优先级最小,设置为-1.在就是加法还有减法的优先级相同为0乘法和除法的优先级比加减法大为1.这是所有比较的依据,最基本的寒素,然后是比较函数,在入栈和出栈过程中频繁调用,其传入的是两个运算符(char型),然后调用level函数,判断其返回值的大小,如果前一个的优先级大就返回1,否则返回0,如果相等也返回0,但是如果传入的值有‘(’或‘)’,则再加特殊判断。然后是后续表达式函数,这里是postpix函数。将用户输入的字符型数组传入,然后将后续表达式的数组传出。中间根据栈的一系列特性和运算符优先级关系进行出栈和入栈操作,最后保存在结果数组中。最后一步就是将后续表达式传入计算函数这里是calculate函数,将后续表达式也通过运算和栈操作实现计算值的功能。

在详细设计表示主要讲calculate函数和postpix函数,postpix函数有两个传入参数,char str[]和char strResult[],其中前者是用户输入的数组,后者是需要得到的结果后缀表达式数组。首先在自定义的栈中压入‘#’,因为开始的时候栈中是没有符号的,也就没有优先级的分别,这里把‘#’压倒里面去就是为了后面可以比较符号优先级。然后优先级高的压栈,优先级低的直接放到结果数组中,如果是数字也是直接放到结果数组中。如果有括号,出栈或者入栈但是不放到结果数组中,因为他们不需要操作。这样就得到了后缀表达式。Calculata则是一个根据得到的后缀表达式求值的函数,其函数参数是后缀表达式和一个浮点数的变量的引用。在strResult传入函数中去之后将结果保存在result中,当然,在用这个函数的时候是要在函数体外声明这样一个参数的。然后从左到右依次扫描表达式的个单词,如果是操作数,存入栈中,如果是运算符,就提取前面的两个操作数(从栈中弹出两个数)进行运算,中间结果同样存入栈中作为下一个运算的操作数。如此反复直到表达式处理完毕。

3.编码

计算器做起来比较复杂,我做了将近两个星期才做好。主要是calculate函数

和postpix函数。在ppt上面的基础上想好思路倒是不难,但是实现起来总会不如

意,这时候调试的功能就来了,也是在这一次我真正开始调试,因为每次总要先看

看栈顶的东西是什么。所以根据调试来发现错误是解决这一个题目的关键,我认为。

在发现了栈顶的错误跟if判断的局限性之后才好改动compare函数和level函数。

所以最终这题是调试出来的。

4.程序及算法分析

使用的时候输入要求的算式的中缀表达式,然后就按回车键,屏幕上就可以输出计算得到的后缀表达式和计算的结果。虽然在大多数情况下可以正常输出,但是,总有一些时候他得不到正确的结果。就是表明这个程序并不是稳定的。有出错的可能,像这样的不完整的程序是比较危险的。但由于时间和精力有限。我到现在只能调试到这个地步。在此基础上仍有很大的提升空间。开始的时候我是想用MFC做的。但是太麻烦加上时间也不够。就只能退而求其次。如果有时间我回继续做的。

【代码】

int level(char a)

{//level 函数,返回某个操作符的优先级

int levelresult=-2;

switch (a)

{

case '+':

levelresult=0;

break;

case '-':

levelresult=0;

break;

case '*':

levelresult=1;

break;

case '/':

levelresult=1;

break;

case '(':

levelresult=2;

break;

case ')':

levelresult=-1;

break;

case '#':

levelresult=-1;

break;

default:

cout<<" level error!"<

}

return levelresult;//返回优先级

}

int compare(char a,char b)

{//比较两个操作符的优先级大小

//如果操作符a>b,返回1。否则返回0

int level1=0;

int level2=0;

level1=level(a);

level2=level(b);

if (level1>level2)

{

return 1;

}

else if (level1<=level2)

{

if (b==')' && a!='(' )

{

return 1;

}

if (b=='(')

{

return 1;

}

return 0;

}

cout<<"compare error!"<

}

void postfix(char str[],char strResult[])

{//变后缀表达式的函数

//返回strresult

Stake stake;

stake.Add('#');

char temp;

bool seprate=false;

int i=0;

for (;str[i]!=0;i++)

{

if (str[i]>='0' && str[i]<'9')

{

strResult[index]=str[i];

index++;

if (str[i+1]>='0' && str[i+1]<'9')

{

seprate=false;

}

else

{

strResult[index]=' ';

index++;

}

}

//优先级大的压栈

else if (compare(str[i],stake.Top())==1)

{

stake.Add(str[i]);

}

//优先级小的出栈

else if (compare(str[i],stake.Top())==0)

{

if (stake.Top()=='(')

{

stake.Delete(temp);

}

//stake.Delete(temp); //have stored ')'!

strResult[index]=stake.Top();

stake.Delete(temp);

index++;

if (stake.Top()=='(')

{

stake.Delete(temp);

}

stake.Add(str[i]);

if(stake.Top()==')')

{

stake.Delete(temp);

}

}

}

while (!stake.IsEmpty() && stake.Top()!='#')

{

char temp;

if (stake.Top()=='(' )

{

stake.Delete(temp);

}

if (stake.Top()==')')

{

stake.Delete(temp);

}

//得到结果数组

strResult[index]=stake.Top();

//删除top

stake.Delete(temp);

index++;

}

}

void calculate(char strResult[],double& result) {//计算函数

//从结果数组求得最后的结果

Stake numberstake;

int i=0;

double tempa,tempb,tempc, waste;;

char *temp;

temp=new char [];

for (;i

{

int j=0;

if (strResult[i]>='0' && strResult[i]<='9' )

{

while (j>=0)

{

temp[j]=strResult[i];

j++;

if (strResult[i+1]==' ')

{

j=-1;

}

if(strResult[i+1]!=' ')

{

i++;

}

}

//atof的参数是char型数组不是char型数组数据tempc=atof(temp);

numberstake.Add(tempc);

}

if (strResult[i]=='+')

{//如果是+就把栈顶两个数的和压入栈中

tempa=numberstake.Top();

numberstake.Delete(waste);

tempb=numberstake.Top();

numberstake.Delete(waste);

numberstake.Add(tempa+tempb);

}

else if (strResult[i]=='-')

{//如果是+就把栈顶两个数的余压入栈中

tempa=numberstake.Top();

numberstake.Delete(waste);

tempb=numberstake.Top();

numberstake.Delete(waste);

numberstake.Add(tempb-tempa);

}

else if (strResult[i]=='*')

{//如果是*就把栈顶两个数的积压入栈中

tempa=numberstake.Top();

numberstake.Delete(waste);

tempb=numberstake.Top();

numberstake.Delete(waste);

numberstake.Add(tempa*tempb);

}

else if (strResult[i]=='/')

{//如果是/就把栈顶两个数的商压入栈中

tempa=numberstake.Top();

numberstake.Delete(waste);

tempb=numberstake.Top();

numberstake.Delete(waste);

numberstake.Add(tempa/tempb);

}

else if (strResult[i]==' ')

{

}

}

//numberstake的栈顶就是结果

result=numberstake.Top();

}

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

{

int i=0;

char *str,*strResult;

str=new char [];

strResult=new char [];

cin>>str;

postfix(str,strResult);

for (;i

{

cout<

}

cout<

double result;

calculate(strResult,result);

cout<

return 0;

}

【输出】

实习题三

1.需求规格说明

【问题描述】

以二叉链表作为二叉树的存储结构建立二叉树,并对其进行操作,基本功能要求:(1)建立一棵二叉树;

(2 )对该二叉树进行前序、中序、后序、层序遍历;

(3)统计该二叉树叶子结点的个数。

(4 )求二叉树的深度。

(5)用非递归方法实现二叉树的中序遍历。

【基本要求】

从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序、中序、后序)、统计叶节点个数、求二叉树的深度并用非递归方法实现二叉树的中序遍历和层序遍历,将结果打印输出,。

2.总体分析与设计

【设计思想】

建立BinaryTree类,并且在类中声明数据成员和函数成员,其中数据成员包括树的根节点,函数成员包括前序遍历,中序遍历和后续遍历,层序遍历。共有函数包括得到叶子节点函数和判等函数和改变叶子函数。实现对二叉树的操作。

【设计表示】

抽象数据类型BinaryTree{

实例

根节点

操作

Creat():创建一个空的二叉树;

IsEmpty():如果二叉树为空,返回true,否则返回false;

Root(x):取x为根节点,如果操作失败,返回false否则返回true;

Creat:创建树;

PreOrder:前序遍历;

InOrder:中序遍历;

PostOrder:后续遍历;

LevelOrder:层序遍历;

}

Visit:访问树节点值;

GetLeaveCount:得到树的叶节点数;

Same:判断两棵树是否相等;

ChangeTreeNode:改变树的叶节点;

ChangeTree:改变整个树的叶节点

首先在main函数中声明一个char型树,然后调用creat函数,如果输入不是‘#’就往树里面插,左子树插完了就往右边插。直到插满为止。树的高度计算就是不断的往左子树走和往右子树走,走一步就++一下,最后看谁最大,把最大的作为高度。

前序遍历,中序遍历,后续遍历是用递归算法。层序遍历利用了队列操作。比较两个树是否相等的函数Same有两个参数,两个树的根节点的指针,递归调用这函数,一旦有一个节点的值不一样就return false;否则return true;对于得到叶子节点数的函数GetLeaveCount有两个参数就是这棵树的根节点和树的叶子节点树的int参数的引用,然后可以递归该函数并且没有左孩子和右孩子就count++。最后count就有叶子节点的数了。

3.编码

其实这题挺简单的,当然是现在看来,但是这题的代码是自己加最多的,好多函数的实现都是自己想的。其他后面几题都是书上的代码。这题的遍历操作基本没有问题,

主要是换节点和计算节点数目比较烦,但是实现起来也是比好的。调试也没有话太多时间。

4.程序及算法分析

类声明:

template

class BinaryTreeNode

{

friend void Visit(BinaryTreeNode*);

friend class BinaryTree;

public:

BinaryTreeNode(){LeftChild=RightChild=0;}

BinaryTreeNode(const T& e,BinaryTreeNode* l,

BinaryTreeNode* r)

{

data=e;

LeftChild=l;

RightChild=r;

}

T data; //根数据

BinaryTreeNode* LeftChild; //指向左子树指针

BinaryTreeNode* RightChild; //指向右子树指针

};

template

class BinaryTree

{

public:

BinaryTree(){root=0;}

~BinaryTree(){}

bool IsEmpty()const

{

return ((root)? false:true);

}

bool Root(T& x)const;

void MakeTree(const T& element,BinaryTree& left,BinaryTree& right);

BinaryTreeNode* Creat();

int Height(BinaryTreeNode* t)const;

void PreOrder(void (*Visit)(BinaryTreeNode* u))

{

PreOrder(Visit,root);

}

void InOrder(void (*Visit)(BinaryTreeNode* u))

{

InOrder(Visit,root);

}

void PostOrder(void (*Visit)(BinaryTreeNode* u))

{

PostOrder(Visit,root);

}

void LevelOrder(void(*Visit)(BinaryTreeNode *u));

void PreOrder(void (*Visit)(BinaryTreeNode* u),BinaryTreeNode* t);

void InOrder(void (*Visit)(BinaryTreeNode* u),BinaryTreeNode* t);

void PostOrder(void (*Visit)(BinaryTreeNode* u),BinaryTreeNode* t);

BinaryTreeNode* root;

};

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

{

BinaryTree tree;

BinaryTreeNode* treeroot=tree.Creat();

int leaveNO=0;

GetLeaveCount(treeroot,leaveNO);

tree.root=treeroot;

cout<<"高度:"<

cout<

cout<<"前序";

tree.PreOrder( Visit,treeroot);

cout<

cout<<"后序";

tree.PostOrder(Visit,treeroot);

cout<

cout<<"中序";

tree.InOrder(Visit,treeroot);

cout<

cout<<"层序";

tree.LevelOrder(Visit);

cout<

tree.PreOrder( ct,treeroot);

cout<<"节点总数:"<

cout<<"叶子节点:"<

cout<<"非叶子节点:"<

cout<<" ************** 节点变换后 ********************* "<

ChangeTreefunction(tree);

leaveNO=0;

GetLeaveCount(treeroot,leaveNO);

cout<<"高度:";

cout<

cout<<"前序";

tree.PreOrder( Visit,treeroot);

cout<

cout<<"后序";

tree.PostOrder(Visit,treeroot);

cout<

cout<<"中序";

tree.InOrder(Visit,treeroot);

cout<

cout<<"层序";

tree.LevelOrder(Visit);

cout<

tree.PreOrder( ct,treeroot);

cout<<"节点总数:"<

cout<<"叶子节点:"<

cout<<"非叶子节点:"<

cout<<" ************** 判断两棵树 **********************

"<

cout<<"再输一个树"<

BinaryTree tree2;

BinaryTreeNode* tree2root=tree2.Creat();

cout<

return 0;

}

template

void ChangeTreefunction(BinaryTree t)

{//改变孩子节点的顺序

//调用子函数PreOrder和ChangeTreeNode

if(t.root->LeftChild && t.root->RightChild)

{

t.PreOrder(ChangeTreeNode,t.root);

}

}

template

void ChangeTreeNode(BinaryTreeNode* t)

{//被ChangeTreefunction调用

//做前序遍历的visit

T temp;

if (t->LeftChild && t->RightChild)

{

temp=t->LeftChild->data;

t->LeftChild->data=t->RightChild->data;

t->RightChild->data=temp;

}

}

template

bool Same(BinaryTreeNode* t0,BinaryTreeNode* t1) {//判断两颗树是否相等

//用递归连续调用

if (!t0 || !t1)

{//如果传入不好

return false;

数据结构课程设计报告模板

《数据结构I》三级项目报告 大连东软信息学院 电子工程系 ××××年××月

三级项目报告注意事项 1. 按照项目要求书写项目报告,条理清晰,数据准确; 2. 项目报告严禁抄袭,如发现抄袭的情况,则抄袭者与被抄袭者均 以0分计; 3. 课程结束后报告上交教师,并进行考核与存档。 三级项目报告格式规范 1. 正文:宋体,小四号,首行缩进2字符,1.5倍行距,段前段后 各0行; 2. 图表:居中,图名用五号字,中文用宋体,英文用“Times New Roman”,位于图表下方,须全文统一。

目录 一项目设计方案 (3) 二项目设计分析 (4) 三项目设计成果 (4) 四项目创新创业 (5) 五项目展望 (6) 附录一:项目成员 (6) 附录二:相关代码、电路图等 (6)

一项目设计方案 1、项目名称: 垃圾回收 2、项目要求及系统基本功能: 1)利用数据结构的知识独立完成一个应用系统设计 2)程序正常运行,能够实现基本的数据增加、删除、修改、查询等功能3)体现程序实现算法复杂度优化 4)体现程序的健壮性 二项目设计分析 1、系统预期实现基本功能: (结合本系统预期具体实现,描述出对应基本要求(增、删、改、查等)的具体功能) 1. 2. 3. 4. 5. 6. 7. 2、项目模块功能描述 (基本分为组织实施组织、程序功能模块编写、系统说明撰写等。其中程序功能子模块实现) 模块一: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 模块二: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 模块n: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

数据结构实验报告--图

. 数据结构实验报告 图

一、实验目的 1、熟悉图的结构和相关算法。 二、实验内容及要求 1、编写创建图的算法。 2、编写图的广度优先遍历、深度优先遍历、及求两点的简单路径和最短路径的算法。 三、算法描述 1、图的邻接表存储表示: 对图的每个顶点建立一个单链表,第i个单链表表示所有依附于第i个点的边(对于有向图表示以该顶点为尾的弧);链表的每个节点存储两个信息,该弧指向的顶点在图中的位置(adjvex)和指向下一条弧的指针(nextarc)。每个连表的头结点存储顶点的数据:顶点信息(data)和指向依附于它的弧的链表域。 存储表示如下: typedef struct ArcNode { int adjvex; // 该弧所指向的顶点的位置 struct ArcNode *nextarc; // 指向下一条弧的指针 // InfoType *info; // 该弧相关信息的指针 } ArcNode; typedef struct VNode { char data; // 顶点信息 int data2; int sngle; ArcNode *firstarc; // 指向第一条依附该顶点的弧 } VNode, AdjList[MAX_NUM]; typedef struct { AdjList vertices; int vexnum, arcnum; int kind; // 图的种类标志 } ALGraph; 2、深度优先搜索: 假设初始态是图中所有定点未被访问,从图中的某个顶点v开始,访问此顶点,然后依次从v的未访问的邻接点出发深度优先遍历,直至途中所有和v有相同路径的点都被访问到;若图中仍有点未被访问,则从图中另选一个未被访问的点作为起点重复上述过程,直到图中所有点都被访问到。为了便于区分途中定点是否被访问过,需要附设一个访问标致数组visited [0..n-1],将其初值均设为false,一旦某个顶点被访问,将对应的访问标志赋值为true。 2、广度优先搜索: 假设初始态是图中所有顶点未被访问,从图中的某个顶点v开始依次访问v的各个未被访问的邻接点,然后分别从这些邻接点出发以此访问他们的邻接点,并使“先被访问的邻接顶点”先于“后被访问的邻接顶点”被访问,直至图中所有已被访问过的顶点的邻接顶点都被访问。若图中仍有未被访问的顶点,选择另一个未被访问的顶点开始,重复上述操作,直到图中所有顶点都被访问。为了使“先

数据结构课程设计报告模板

课程设计说明书 课程名称:数据结构 专业:班级: 姓名:学号: 指导教师:成绩: 完成日期:年月日

任务书 题目:黑白棋系统 设计内容及要求: 1.课程设计任务内容 通过玩家与电脑双方的交替下棋,在一个8行8列的方格中,进行棋子的相互交替翻转。反复循环下棋,最后让双方的棋子填满整个方格。再根据循环遍历方格程序,判断玩家与电脑双方的棋子数。进行大小判断,最红给出胜负的一方。并根据y/n选项,判断是否要进行下一局的游戏。 2.课程设计要求 实现黑白两色棋子的对峙 开发环境:vc++6.0 实现目标: (1)熟悉的运用c语言程序编写代码。 (2)能够理清整个程序的运行过程并绘画流程图 (3)了解如何定义局部变量和整体变量; (4)学会上机调试程序,发现问题,并解决 (5)学习使用C++程序来了解游戏原理。 (6)学习用文档书写程序说明

摘要 本文的研究工作在于利用计算机模拟人脑进行下黑白棋,计算机下棋是人工智能领域中的一个研究热点,多年以来,随着计算机技术和人工智能技术的不断发展,计算机下棋的水平得到了长足的进步 该程序的最终胜负是由棋盘上岗双方的棋子的个数来判断的,多的一方为胜,少的一方为负。所以该程序主要运用的战术有削弱对手行动战术、四角优先战术、在游戏开局和中局时,程序采用削弱对手行动力战术,即尽量减少对手能够落子的位置;在游戏终局时则采用最大贪吃战术,即尽可能多的吃掉对手的棋子;而四角优先战术则是贯穿游戏的始终,棋盘的四角围稳定角,不会被对手吃掉,所以这里是兵家的必争之地,在阻止对手进角的同时,自己却又要努力的进角。 关键词:黑白棋;编程;设计

数据结构上机实验报告

数据结构上机实验报告 学院:电子工程学院 专业:信息对抗技术 姓名:

学号: 教师:饶鲜日期:

目录 实验一线性表................................................. - 4 - 一、实验目的................................................ - 4 - 二、实验代码................................................ - 4 - 三、实验结果............................................... - 14 - 四、个人思路............................................... - 15 -实验二栈和队列.............................................. - 15 - 一、实验目的............................................... - 15 - 二、实验代码............................................... - 16 - 三、实验结果............................................... - 24 - 四、个人思路............................................... - 25 -实验三数组.................................................. - 26 - 一、实验目的............................................... - 26 - 二、实验代码............................................... - 26 - 三、实验结果............................................... - 28 - 四、个人思路............................................... - 28 -实验四树.................................................... - 29 - 一、实验目的............................................... - 29 - 二、实验代码............................................... - 29 -

数据结构课程设计报告

山东建筑大学 课程设计成果报告 题目: 1.数组实现两个矩阵的相乘运算 2.成绩分析问题 课程:数据结构A课程设计 院(部):管理工程学院 专业:信息管理与信息系统 班级:信管*** 学生姓名:*** 学号:******** 指导教师:******* 完成日期:2016年12月29日

目录 目录 (2) 一、课程设计概述 (3) 二、课程设计题目一 (3) 用数组实现两个矩阵的相乘运算 (3) 2.1[问题描述] (3) 2.2[要求及提示]: (3) 2.3[详细设计] (4) 2.4[调试分析] (5) 2.5[运行结果及分析] (5) 三、课程设计题目二 (6) 成绩分析问题 (6) 3.1[问题描述] (6) 3.2[概要设计] (6) 3.3[存储结构] (7) 3.4[流程图] (7) 3.5[详细设计] (8) 3.6[调试分析] (8) 3.7[运行结果及分析] (22) 四、参考文献: (25)

一、课程设计概述 本次数据结构课程设计共完成两个题:用数组实现两个矩阵相乘运算、成绩分析问题。使用语言:C 编译环境:vc6.0 二、课程设计题目一 用数组实现两个矩阵的相乘运算 2.1[问题描述] #include “stdio.h” int r[6][6]; void mult(int a[6][6] , int b[6][6]){ } main(){ int i,j; int num1[6][6],num2[6][6]; printf(“请输入第一个矩阵的值:”,); for(i=1;i<=6;i++) for(j=1;j<=6;j++) scanf(“%d”,&num1[i][j]); printf(“请输入第二个矩阵的值:”,); for(i=1;i<=6;i++) for(j=1;j<=6;j++) scanf(“%d”,&num2[i][j]); mult(num1,num2); printf(“\n两个矩阵相乘后的结果为:”); for(i=1;i<=6;i++) {for(j=1;j<=6;j++) printf(“%4d”,r[i][j]); printf(“\n”); } } 2.2[要求及提示]: 1、要求完善函数mult( ),

数据结构实验报告图实验

图实验一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10;

template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif MGraph.cpp

#include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) {

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include//库头文件-----动态分配内存空间 typedef int elemtype;//定义数据域的类型 typedef struct linknode//定义结点类型 { elemtype data;//定义数据域 struct linknode *next;//定义结点指针 }nodetype; 2)创建单链表

nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"<> d; if(d==0) break;//以0表示输入结束 if(i==1)//建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));//表示指针h h->data=d;h->next=NULL;t=h;//h是头指针 } else//建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t始终指向生成的单链表的最后一个节点

数据结构课程设计报告

《数据结构课程设计》报告 题目:课程设计题目2教学计划编制 班级:700 学号:09070026 姓名:尹煜 完成日期:2011年11月7日

一.需求分析 本课设的任务是根据课程之间的先后的顺序,利用拓扑排序算法,设计出教学计划,在七个学期中合理安排所需修的所有课程。 (一)输入形式:文件 文件中存储课程信息,包括课程名称、课程属性、课程学分以及课程之间先修关系。 格式:第一行给出课程数量。大于等于0的整形,无上限。 之后每行按如下格式“高等数学公共基础必修6.0”将每门课程的具体信息存入文件。 课程基本信息存储完毕后,接着给出各门课程之间的关系,把每门课程看成顶点,则关系即为边。 先给出边的数量。大于等于0的整形。 默认课程编号从0开始依次增加。之后每行按如下格式“1 3”存储。此例即为编号为1的课程与编号为3的课程之间有一条边,而1为3的前驱,即修完1课程才能修3课程。 例: (二)输出形式:1.以图形方式显示有向无环图

2.以文本文件形式存储课程安排 (三)课设的功能 1.根据文本文件中存储的课程信息(课程名称、课程属性、课程学分、课程之间关系) 以图形方式输出课程的有向无环图。 拓展:其显示的有向无环图可进行拖拽、拉伸、修改课程名称等操作。 2.对课程进行拓扑排序。 3.根据拓扑排序结果以及课程的学分安排七个学期的课程。 4.安排好的教学计划可以按图形方式显示也可存储在文本文件里供用户查看。 5.点击信息菜单项可显示本人的学好及姓名“09070026 尹煜” (四)测试数据(见六测设结果)

二.概要设计 数据类型的定义: 1.Class Graph即图类采用邻接矩阵的存储结构。类中定义两个二维数组int[][] matrix 和Object[][] adjMat。第一个用来标记两个顶点之间是否有边,为画图服务。第二个 是为了实现核心算法拓扑排序。 2.ArrayList list用来存储课程信息。DrawInfo类是一个辅助画图的类,其中 包括成员变量num、name、shuxing、xuefen分别代表课程的编号、名称、属性、 学分。ArrayList是一个DrawInfo类型的数组,主要用来在ReadFile、DrawG、DrawC、SaveFile、Window这些类之间辅助参数传递,传递课程信息。 3.Class DrawInfo, 包括int num;String name;String shuxing;float xuefen;四个成员变量。 4.Class Edge包括int from;int to;double weight;三个成员变量。 5.Class Vertex包括int value一个成员变量。 主要程序的流程图: //ReadFile.java

数据结构课程设计报告模板

数据结构课程设计报告模板

课程设计说明书 课程名称:数据结构 专业:班级: 姓名:学号: 指导教师:成绩: 完成日期:年月日

任务书 题目:黑白棋系统 设计内容及要求: 1.课程设计任务内容 通过玩家与电脑双方的交替下棋,在一个8行8列的方格中,进行棋子的相互交替翻转。反复循环下棋,最后让双方的棋子填满整个方格。再根据循环遍历方格程序,判断玩家与电脑双方的棋子数。进行大小判断,最红给出胜负的一方。并根据y/n选项,判断是否要进行下一局的游戏。 2.课程设计要求 实现黑白两色棋子的对峙 开发环境:vc++6.0 实现目标: (1)熟悉的运用c语言程序编写代码。 (2)能够理清整个程序的运行过程并绘画流程图 (3)了解如何定义局部变量和整体变量; (4)学会上机调试程序,发现问题,并解决 (5)学习使用C++程序来了解游戏原理。 (6)学习用文档书写程序说明

目录 1.引言 (1) 2.课题分析 (4) 3.具体设计过程 (5) 3.1设计思路 (5) 3.2程序设计流程图 (5) 3.3.函数实现说明 (10) 4.程序运行结果 (12) 5.软件使用说明 (16) 6.结论 (19) 参考文献 (20) 附录:源代码 (21)

1.引言 数据结构在计算机科学界至今没有标准的定义。个人根据各自的理解的不同而有不同的表述方法: Sartaj Sahni在他的《数据结构、算法与应用》一书中称:“数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。”他将数据对象(data object)定义为“一个数据对象是实例或值的集合”。Clifford A.Shaffer在《数据结构与算法分析》一书中的定义是:“数据结构是ADT(抽象数据类型Abstract Data Type)的物理实现。” Lobert L.Kruse在《数据结构与程序设计》一书中,将一个数据结构的设计过程分成抽象层、数据结构层和实现层。其中,抽象层是指抽象数据类型层,它讨论数据的逻辑结构及其运算,数据结构层和实现层讨论一个数据结构的表示和在计算机内的存储细节以及运算的实现。数据结构具体指同一类数据元素中,各元素之间的相互关系,包括三个组成成分,数据的逻辑结构,数据的存储结构和数据运算结构。 1.1. 重要意义 一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。 在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。 选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。 1.2. 研究内容

数据结构上机实验报告

数据结构实验报告 一.顺序表 要求:实现顺序表的初始化、在指定位置插入和删除元素。 算法思路:线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。顺序表的初始化操作就是为顺序表分配一个预定义大小的空间,并将线性表的当前长度设为“0”。线性表的插入操作是在线性表的第i-1个数据元素和第i个元素之间插入新的数据元素,使得长度为n的线性表变成长度为n+1的线性表,而删除恰好相反长度变为n-1的线性表,而且删除点后面的元素要往前移动一个位。 程序代码: #include #include #define MAXSIZE 50 typedef char elemtype; typedef struct //类型定义 { elemtype v[MAXSIZE]; int last; }SeqList; SeqList *Init_SeqList() //初始化操作 { SeqList *L; L=(SeqList*)malloc(sizeof(SeqList)); L->last=-1; return L; } void Create(SeqList *L) //建立顺序表 { int i=0; elemtype ch; scanf("%c",&ch); while(ch!='\n') { L->v[i++]=ch; scanf("%c",&ch); L->last=i-1; } } void PrintL(SeqList *L) //输出顺序表 { int i; printf("此表为:\n");

for(i=0;ilast;i++) { printf("%c",L->v[i]); } printf("%c\n",L->v[i]); } void Length(SeqList *L) //顺序表长度函数{ printf("此表长度:\n%d",L->last+1); printf("\n"); } void insert(SeqList *L,int i,elemtype x) //插入函数 { int j; if(L->last==0) printf("Error!\n"); if(i<1||i>L->last) printf("Error!"); for(j=L->last;j>=i-1;j--) L->v[j+1]=L->v[j]; L->v[i-1]=x; L->last++; PrintL(L); Length(L); } void Delete(SeqList *L,int i) //删除函数 { int j; if(L->last==-1) printf("Error!"); if(i<1||i>L->last+1) printf("Error!"); for(j=i;j<=L->last;j++) L->v[j-1]=L->v[j]; L->last--; PrintL(L); Length(L); } void main() //程序主函数 { int i,j,k; elemtype a,b;

数据结构课程设计报告范例

Guangxi University of Science and Technology 课程设计报告 课程名称:算法与编程综合实习 课题名称: 姓名: 学号: 院系:计算机学院 专业班级:通信121 指导教师: 完成日期:2012年12月15日

目录 第1部分课程设计报告 (3) 第1章课程设计目的 (3) 第2章课程设计内容和要求 (4) 2.1 问题描述 (4) 2.2 设计要求 (4) 第3章课程设计总体方案及分析 (4) 3.1 问题分析 (4) 3.2 概要设计 (7) 3.3 详细设计 (7) 3.4 调试分析 (10) 3.5 测试结果 (10) 3.6 参考文献 (12) 第2部分课程设计总结 (13) 附录(源代码) (14)

第1部分课程设计报告 第1章课程设计目的 仅仅认识到队列是一种特殊的线性表是远远不够的,本次实习的目的在于使学生深入了解队列的特征,以便在实际问题背景下灵活运用它,同时还将巩固这种数据结构的构造方………………………………………………………………………………………………………………………………………………………………………………………..(省略)

第2章课程设计内容和要求 2.1问题描述: 迷宫问题是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒子中设置了许多墙,对行进方向形成了多处阻挡。盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。对同一只老鼠重复进行上述实验,一直到老鼠从入口走到出口,而不走错一步。老鼠经过多次试验最终学会走通迷宫的路线。设计一个计算机程序对任意设定的矩形迷宫如下图A所示,求出一条从入口到出口的通路,或得出没有通路的结论。 图A 2.2设计要求: 要求设计程序输出如下: (1) 建立一个大小为m×n的任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏 幕上显示出来; (2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。 (3)用一种标志(如数字8)在迷宫中标出该条通路; (4)在屏幕上输出迷宫和通路; (5)上述功能可用菜单选择。

数据结构实验报告模板

数据结构实验报告 顺序表实验 1.实验目标 a.熟练掌握线性表的顺序存储结构。 b.熟练掌握顺序表的有关算法设计。 c.根据具体问题的需要,设计出合理的表示数据的顺序结构,并设计相关算法。 2.实验内容和要求 a.顺序表结构和运算定义,算法的实现以库文件方式实现,不得在测试主程序中直接实现; b.实验程序有较好可读性,各运算和变量的命名直观易懂,符合软件工程要求; c.程序有适当的注释。 3.数据结构设计 顺序表 4.算法设计 1.i表示要在顺序表中查找的位置,x表示查找到后返回的值。 int search(seqlist A,int i,elementType &x) { if(i<1||i>A.Len)//查找的范围不在顺序表中 return 0; else { x=A.data[i-1];//复制要查找的值 return 1; } } 2.i表示要在顺序表中插入的位置,x表示要插入的元素。 void insert(seqlist &A,int i,elementType x) { if(i<1||i>A.Len)//超出顺序表范围 cout<<"error"<=i;j--)//找到第i-1个结点擦,并后移元素 A.data[j]=A.data[j-1]; A.data[i-1]=x;//插入元素数据 A.Len++;//改变顺序表长度 }

} 3.先利用循环找到顺序表中第i个结点,然后进行删除操作。 void del(seqlist *L,int i) { int j; if(i<1||i>L->Len+1)//超顺序表范围 cout<<"超出表范围"<Len;j++) L->data[j]=L->data[j+1];//删除第i个结点 L->Len--; cout<<"删除元素后的表为:"; for(int k=0;kLen;k++)//输出顺序表 cout<data[k]<<" "; cout<Len==MAXLEN) return 0; else { int i=L->Len-1; L->Len++; while(x<=L->data[i]) { L->data[i+1]=L->data[i];//查找待插入的位置 i--; } L->data[i+1]=x;//插入元素 return 1; } } 5.申请两个新的顺序表,然后对原表进行遍历,由 A.data[i]%2进行及奇偶的分离,并分别存入顺序表B,C中。 void separatelist(seqlist A,seqlist *B,seqlist *C) { int b(0),c(0); for(int i=0;i

《数据结构实验》实验题目及实验报告模板

《数据结构实验》的实验题目及实验报告模板 实验一客房管理(链表实验) ●实现功能:采用结构化程序设计思想,编程实现客房管理程序的各个功能函数,从而熟练 掌握单链表的创建、输出、查找、修改、插入、删除、排序和复杂综合应用等操作的算法 实现。以带表头结点的单链表为存储结构,实现如下客房管理的设计要求。 ●实验机时:8 ●设计要求: #include #include #include //定义客房链表结点结构 typedef struct HNode { char roomN[7]; //客房名称 float Price; //标准价格 float PriceL; //入住价格(默认值=标准价格*80%) int Beds; //床位数Beds char State[5]; //入住状态(值域:"空闲"、"入住"、"预订",默认值为"空闲") struct HNode *next; //指针域 }Hotel, *HLink; (1)实现创建客房信息链表函数void Build(HLink &H),输入(客房名称、标准价格、床位数),同时修改入住价格、入住状态为默认值,即入住价格=标准价格*80%,入住状态为”空闲”(提示:用strcpy()字符串拷贝函数)。为了提高程序调试效率,要求:用文件操作来输入客房信息(客房名称、标准价格、床位数); (2)实现输出客房信息函数void Exp(HLink H),输出所有客房的客房名称、标准价格、入住价格、床位数、入住状态; (3)函数int Find(HLink &H, char *roomN),查找房间名称为roomN的客房。如果找到,则返回该客房在链表中的位置序号(>=1),否则返回0。提示:用strcmp()字符串比较函数; (4)实现函数void updateH(HLink &H, int beds, char *state),将床位数为beds的客房入住状态改为state。提示:用strcpy()字符串拷贝函数; (5)函数void Add(HLink &H),将该链表中未入住的客房入住价格均加价20%; (6)求出入住价格最高的客房函数HLink FirstH(HLink &H),该函数内return语句返回入住价格最高的客房结点指针,返回前将该结点在链表中删除; (7)函数void MoveK1(HLink &H, int k),将单链表中倒数第k个结点移到第一个结点位置,注意:严禁采用先计算链表长度n再减k(即n-k)的方法;

顺序表的应用数据结构实验报告记录

顺序表的应用数据结构实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

大学数据结构实验报告 课程名称数据结构实验第(三)次实验实验名称顺序表的应用 学生姓名于歌专业班级学号 实验成绩指导老师(签名)日期2018年9月30日一、实验目的 1.学会定义线性表的顺序存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。 2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集等运算。 3.掌握对多函数程序的输入、编辑、调试和运行过程。 二、实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对顺序表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容: 1.定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能: (1)根据指定学生个数,逐个输入学生信息 (2)逐个显示学生表中所有学生的相关信息 (3)根据姓名进行查找,返回此学生的学号和成绩 (4)根据指定的位置可返回相应的学生信息(学号,姓名,成绩) (5)给定一个学生信息,插入到表中指定的位置 (6)删除指定位置的学生记录 (7)统计表中学生个数 四、实验设计 1.定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能: (1)根据指定学生个数,逐个输入学生信息 for(count=0; count

数据结构课程设计报告,含菜单

算法与数据结构课程设计 报告 系(院):计算机科学学院 专业班级:计科11005 姓名:张林峰 学号: 201003784 指导教师:詹泽梅 设计时间:2012.6.11 - 2012.6.18 设计地点:12教机房

目录 一、课程设计目的 (2) 二、设计任务及要求 (2) 三、需求分析 (2) 四、总体设计 .............. 错误!未定义书签。 五、详细设计与实现[含代码和实现界面].. 8 六、课程设计小结 (15)

一.设计目的 1.能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。 2.提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。 3.初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。 4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。 5.培养根据选题需要选择学习书籍,查阅文献资料的自学能力。二.设计任务及要求 根据《算法与数据结构》课程的结构体系,设计一个基于DOS菜单的应用程序。要利用多级菜单实现各种功能。比如,主界面是大项,主要是学过的各章的名字诸如线性表、栈与队列、串与数组及广义表等,子菜单这些章中的节或者子节。要求所有子菜单退出到他的父菜单。编程实现时,要用到C++的面向对象的功能。 三.需求分析 菜单运用极其广泛,应用于各行各业。菜单运用起来极其方便。随着社会的发展,社会的行业出现多样化,也就需要各式

数据结构实验报告模板

2009级数据结构实验报告 实验名称:约瑟夫问题 学生姓名:李凯 班级:21班 班内序号:06 学号:09210609 日期:2010年11月5日 1.实验要求 1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。请输出n个人的出列顺序。 2)输入描述:从源文件中读取。 输出描述:依次从显示屏上输出出列顺序。 2. 程序分析 1)存储结构的选择 单循环链表 2)链表的ADT定义 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0} 数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n} 基本操作: ListInit(&L);//构造一个空的单链表表L ListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0. ListLength(L); //求单链表L的长度 GetElem(L,i);//返回链表L中第i个数据元素的值; ListSort(LinkList&List) //单链表排序 ListClear(&L); //将单链表L中的所有元素删除,使单链表变为空表 ListDestroy(&L);//将单链表销毁 }ADT List 其他函数: 主函数; 结点类; 约瑟夫函数 2.1 存储结构

[内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template class CirList;//声明单链表类 template class ListNode{//结点类定义; friend class CirList;//声明链表类LinkList为友元类; Type data;//结点的数据域; ListNode*next;//结点的指针域; public: ListNode():next(NULL){}//默认构造函数; ListNode(const Type &e):data(e),next(NULL){}//构造函数 Type & GetNodeData(){return data;}//返回结点的数据值; ListNode*GetNodePtr(){return next;}//返回结点的指针域的值; void SetNodeData(Type&e){data=e;}//设置结点的数据值; void SetNodePtr(ListNode*ptr){next=ptr;} //设置结点的指针值; }; 单循环链表类: templateclass CirList { ListNode*head;//循环链表头指针 public: CirList(){head=new ListNode();head->next=head;}//构造函数,建立带头节点的空循环链表 ~CirList(){CirListClear();delete head;}//析构函数,删除循环链表 void Clear();//将线性链表置为空表 void AddElem(Type &e);//添加元素 ListNode *GetElem(int i)const;//返回单链表第i个结点的地址 void CirListClear();//将循环链表置为空表 int Length()const;//求线性链表的长度 ListNode*ListNextElem(ListNode*p=NULL);//返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针 ListNode*CirListRemove(ListNode*p);//在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回 CirList&operator=(CirList&List);//重载赋

数据结构课程设计报告书

数据结构课程设计 学院名称:计算机工程学院 专业:信息管理与信息系统班级: 姓名: 年月日

《数据结构》课程设计任务书 学院计算机工程学院系部信息与软件工程系 年月日

《数据结构课程设计》报告 一、第一类题目 1.问题陈述 约瑟夫环问题:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数),一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。请设计一个程序求出出列顺序。 2.程序代码 #include #include int n,m; typedef struct LNode{ int num,data; struct LNode *next; }LNode,*LinkList; void List(LinkList &L,int n){ LinkList p,q; int i; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(i=0;inum=i+1; printf("输入编号为%d的人的密码:",i+1); scanf("%d",&p->data); if(L->next==NULL) L->next=p;//头结点L else q->next=p;//前后节点关系建立 q=p;} //q为前节点 p->next=L->next;} void input(){ printf("输入总人数n:"); scanf("%d",&n); printf("输入报数上限值m:"); scanf("%d",&m); } void output(LinkList L,LinkList p,int m){ int i; LinkList q; for(i=1;;i++){ q=p; p=p->next;

数据结构与算法上机实验报告

数据结构与算法B上机实验报告 第1次2011-10-02 顺序表的实现和基本操作 第2次2011-10-29 二叉树的实现和递归遍历 第3次2011-11-23 内部排序 第4次2011-12-dd 实现图从邻接矩阵到邻接表存储转化

第一次线性表数据结构 一、上机实习题目 线性链表操作——插入、删除、合并、排序、查找二数据结构设计(算法设计)源程序( #include #define MaxSize 100 using namespace std; typedef int ElemType; class SeqList { ElemType list[MaxSize]; int length; public: SeqList() {length=0;} void SeqListSort(int i,ElemType x); void SeqListCreat(int n); void SeqListInset(int i,ElemType x); void SeqListDelete(int i); void SeqListMerge(); int GetLength(){return length;} int SeqListFind(ElemType x); int SeqListIsEmpty(); void SeqListPrint(); }Mylist1,Mylist2;

//创建顺序表 void SeqList::SeqListCreat(int n) { ElemType x; cout<<"请输入数据元素:"; for (int i=0;i>x; list[i]=x; length++; } } //对顺序表进行排序 void SeqList::SeqListSort(int i,ElemType x) { for(int k=0;klist[i]) { x=list[k]; list[k]=list[i]; list[i]=x; } } } }

相关主题
文本预览
相关文档 最新文档