数据结构 串的应用及实现 报告

数据结构 串的应用及实现 报告
数据结构 串的应用及实现 报告

实习报告

课程名称:数据结构

实验名称:串及其应用

指导教师:

学生班级:

学生姓名:

学生学号:

完成日期:

一、需求分析

1、本演示程序用C语言编写,实现串的堆分配存储基本操作、串的建立、串的输出、串的联接、求子串、串匹配、串的插入删除、串的替换等实现方法。

2、程序所达到的功能:

(1)建立串s=“abcdefghijklmn”,串s1=“xyz”,串t=“hijk”

(2)复制串t到t1,并输出t1的长度

(3)在串s的第9个字符位置插入串s1而产生串s2,并输出s2

(4)删除s第2个字符开始的5个字符而产生串s3,并输出s3

(5)将串s第2个字符开始的3个字符替换成串s1而产生串s4,并输出s4

(6)提取串s的第8个字符开始的4个字符而产生串s5,并输出s5

(7)将串s1和串t连接起来而产生串s6,并输出s6

(8)比较串s1和s5是否相等,输出结果

二、概要设计

1、编写栈的基本操作函数

链串类型定义如下所示:

typedef struct snode{

char data;

struct snode *next;

}listring;

(1)串赋值 Assign(s,t)

?将一个字符串常量赋给串s,即生成一个其值等于t的

串s

(2)串复制 StrCopy(s,t)

?将串t赋给串s

(3)计算串长度 StrLength(s)

?返回串s中字符个数

(4)判断串相等StrEqual(s,t)

?若两个串s与t相等则返回1;否则返回0。

(5)串连接 Concat(s,t)

?返回由两个串s和t连接在一起形成的新串。

(6)求子串 SubStr(s,i,j)

?返回串s中从第i(1≤i≤StrLength(s))个字符开始

的、由连续j个字符组成的子串。

(7)插入InsStr (s,i,t)

?将串t插入到串s的第i(1≤i≤StrLength(s)+1)个字

符中,即将t的第一个字符作为s的第i个字符,并返

回产生的新串

(8)串删除 DelStr (s,i,j)

?从串s中删去从第i(1≤i≤StrLength(s))个字符开

始的长度为j的子串,并返回产生的新串。

(9)串替换 RepStr (s,s1,s2)

?在串s中,将所有出现的子串s1均替换成s2。

(10)输出串DispStr(s)

?输出串s的所有元素值

(11)判断串是否为空 IsEmpty(s)

2、编写主函数

调用上述函数实现下列操作:

(1)建立串s=“abcdefghijklmn”,串s1=“xyz”,串t=“hijk”

(2)复制串t到t1,并输出t1的长度

(3)在串s的第9个字符位置插入串s1而产生串s2,并输出s2

(4)删除s第2个字符开始的5个字符而产生串s3,并输出s3

(5)将串s第2个字符开始的3个字符替换成串s1而产生串s4,并输出s4 (6)提取串s的第8个字符开始的4个字符而产生串s5,并输出s5

(7)将串s1和串t连接起来而产生串s6,并输出s6

(8)比较串s1和s5是否相等,输出结果

三、程序清单

#include

#include

typedef struct snode{

char data;

struct snode *next;

}listring;

//字符串赋值

void strassign(listring *&s,char cstr[]){

int i;

listring *r,*p;

s=(listring *)malloc(sizeof(listring));

r=s;

for(i=0;cstr[i]!='\0';i++){

p=(listring *)malloc(sizeof(listring));

p->data=cstr[i];

r->next=p;

r=p;

}

r->next=NULL;

}

//字符串复制

void strcopy(listring *&s,listring *t){

listring *p=t->next,*q,*r;

s=(listring *)malloc(sizeof(listring));

r=s;

while(p!=NULL){

q=(listring *)malloc(sizeof(listring));

q->data=p->data;

r->next=q;

r=q;

p=p->next;

}

r->next=NULL;

}

//字符串长度

int strlength(listring *s){

int i=0;

listring *p=s->next;

while(p!=NULL){

i++;

p=p->next;

}

return i;

}

//判断字符串是否相等

int strequal(listring *s,listring *t){

listring *p=s->next,*q=t->next;

while(p!=NULL&&q!=NULL&&p->data==q->data){ p=p->next;

q=q->next;

}

if(p==NULL&&q==NULL)

return 1;

else

return 0;

}

//字符串连接

listring *concat(listring *s,listring *t){

listring *str,*p=s->next,*q,*r;

str=(listring *)malloc(sizeof(listring));

r=str;

while(p!=NULL){

q=(listring *)malloc(sizeof(listring));

q->data=p->data;

r->next=q;

r=q;

p=p->next;

}

p=t->next;

while(p!=NULL){

q=(listring *)malloc(sizeof(listring));

q->data=p->data;

r->next=q;

r=q;

p=p->next;

}

r->next=NULL;

return str;

}

//字符串的子串

listring *substr(listring *s,int i,int j){

int k;

listring *str,*p=s->next,*q,*r;

str=(listring *)malloc(sizeof(listring));

str->next=NULL;

r=str;

if(i<=0||i>strlength(s)||j<0||i+j-1>strlength(s)) return str;

for(k=0;k

p=p->next;

for(k=1;k<=j;k++){

q=(listring *)malloc(sizeof(listring));

q->data=p->data;

r->next=q;

r=q;

p=p->next;

}

r->next=NULL;

return str;

}

//字符串插入

listring *insstr(listring *s,int i,listring *t){ int k;

listring *str,*p=s->next,*p1=t->next,*q,*r;

str=(listring *)malloc(sizeof(listring));

str->next=NULL;

r=str;

if(i<=0||i>strlength(s)+1)

return str;

for(k=1;k

q=(listring *)malloc(sizeof(listring));

q->data=p->data;

r->next=q;

r=q;

p=p->next;

}

while(p1!=NULL){

q=(listring *)malloc(sizeof(listring));

q->data=p1->data;

r->next=q;

r=q;

p1=p1->next;

}

while(p!=NULL){

q=(listring *)malloc(sizeof(listring));

q->data=p->data;

r->next=q;

r=q;

p=p->next;

}

r->next=NULL;

return str;

}

//字符串删除

listring *delstr(listring *s,int i,int j){

int k;

listring *str,*p=s->next,*q,*r;

str=(listring *)malloc(sizeof(listring));

str->next=NULL;

r=str;

if(i<=0||i>strlength(s)||j<0||i+j-1>strlength(s)) return str;

for(k=0;k

q=(listring *)malloc(sizeof(listring));

q->data=p->data;

r->next=q;

r=q;

p=p->next;

}

for(k=0;k

p=p->next;

while(p!=NULL){

q=(listring *)malloc(sizeof(listring));

q->data=p->data;

r->next=q;

r=q;

p=p->next;

}

r->next=NULL;

return str;

}

//字符串替换

listring *repstr(listring *s,int i,int j,listring *t){ int k;

listring *str,*p=s->next,*p1=t->next,*q,*r;

str=(listring *)malloc(sizeof(listring));

str->next=NULL;

r=str;

if(i<=0||i>strlength(s)||j<0||i+j-1>strlength(s)) return str;

for(k=0;k

q=(listring *)malloc(sizeof(listring));

q->data=p->data;

r->next=q;

r=q;

p=p->next;

}

for(k=0;k

p=p->next;

while(p1!=NULL){

q=(listring *)malloc(sizeof(listring));

q->data=p1->data;

r->next=q;

r=q;

p1=p1->next;

}

while(p!=NULL){

q=(listring *)malloc(sizeof(listring));

q->data=p->data;

r->next=q;

r=q;

p=p->next;

}

r->next=NULL;

return str;

}

//字符串输出

void dispstr(listring *s){

listring *p=s->next;

while(p!=NULL){

printf("%c",p->data);

p=p->next;

}

printf("\n");

}

//判断字符串是否为空

void empstr(listring *s){

if(s->next==NULL)

printf("字符串是空的!");

else

printf("字符串不为空!");

}

void initstr(listring *&s){

s=(listring *)malloc(sizeof(listring));

s->next=NULL;

}

int main(void){

listring *s,*s1,*t,*t1,*s2,*s3,*s4,*s5,*s6;

int l;

strassign(s,"abcdefghijklmn");

strassign(s1,"xyz");

strassign(t,"hijk");

strcopy(t1,t);

printf("输出t1的长度:%d\n",strlength(t1));

s2=insstr(s,9,s1);

printf("输出s2:\n");

dispstr(s2);

s3=delstr(s,2,5);

printf("输出s3:\n");

dispstr(s3);

s4=repstr(s,2,3,s1);

printf("输出s4:\n");

dispstr(s4);

s5=substr(s,8,4);

printf("输出s5:\n");

dispstr(s5);

s6=concat(s1,t);

printf("输出s6:\n");

dispstr(s6);

l=strequal(s1,s5);

if(l==1)

printf("s1与s5相等!");

else

printf("s1与s5不相等!");

return 0;

}

四、调试分析

这次上机的内容是实现链串的基本算法,跟前面学的链表的基本算法是差不多的,所以这次实验还是比较简单的,但也曾出现过一点点小问题,直接把字符串赋值给指针s="abcdefghijklmn"; s1="xyz"; t="hijk";结果出现如下错误:

通过调用函数void strassign(listring *&s,char cstr[])将其订正为strassign(s,"abcdefghijklmn"); strassign(s1,"xyz"); strassign(t,"hijk");后没有错误;编译、组建都没有错误的情况下,s2是在串s的第9个字符位置插入串s1而产生的,本应出现的结果为可运行时却出现如下的结果查找了原因之后才发现在插入s1数据时,都把s的第九个字母的数据赋值给了s2,*p1=s1->next;q->data=p->data; 把错误改为q->data=p1->data;后运行正确。

虽然链串的基本算法的操作还是比较简单,但也会犯一些毛病,必须通过上机编译调试才能发现,上机之后才能把自认为对的代码重新纠正过来,从而有所进步。

通过这次的上机实验,我熟悉了串的定义和串的基本操作,掌握了链串的基本运算,加深对串数据结构的理解并逐步培养解决实际问题的编程能力。

五、用户使用说明

双击串的实现.exe。

程序名为串的实现.exe,运行环境为DOS。程序执行后显示

六、实验运行结果

数据结构实验报告格式

《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(2学时)

数据结构实验报告--图

. 数据结构实验报告 图

一、实验目的 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、掌握串的存储表示及基本操作; 2、掌握串的两种模式匹配算法:BF和KMP。 3、了解串的应用。 【实验学时】 2学时 【实验预习】 回答以下问题: 1、串和子串的定义 串的定义:串是由零个或多个任意字符组成的有限序列。 子串的定义:串中任意连续字符组成的子序列称为该串的子串。 2、串的模式匹配 串的模式匹配即子串定位是一种重要的串运算。设s和t是给定的两个串,从主串s的第start个字符开始查找等于子串t的过程称为模式匹配,如果在S中找到等于t的子串,则称匹配成功,函数返回t在s中首次出现的存储位置(或序号);否则,匹配失败,返回0。 【实验内容和要求】 1、按照要求完成程序exp4_1.c,实现串的相关操作。调试并运行如下测试数据给出运行结果: ?求“This is a boy”的串长; ?比较”abc 3”和“abcde“; 表示空格 ?比较”english”和“student“; ?比较”abc”和“abc“; ?截取串”white”,起始2,长度2; ?截取串”white”,起始1,长度7; ?截取串”white”,起始6,长度2; ?连接串”asddffgh”和”12344”; #include #include #define MAXSIZE 100 #define ERROR 0 #define OK 1 /*串的定长顺序存储表示*/

typedef struct { char data[MAXSIZE]; int length; } SqString; int strInit(SqString *s); /*初始化串*/ int strCreate(SqString *s); /*生成一个串*/ int strLength(SqString *s); /*求串的长度*/ int strCompare(SqString *s1,SqString *s2); /*两个串的比较*/ int subString(SqString *sub,SqString *s,int pos,int len); /*求子串*/ int strConcat(SqString *t,SqString *s1,SqString *s2); /*两个串的连接*/ /*初始化串*/ int strInit(SqString *s) { s->length=0; s->data[0]='\0'; return OK; }/*strInit*/ /*生成一个串*/ int strCreate(SqString *s) { printf("input string :"); gets(s->data); s->length=strlen(s->data); return OK; }/*strCreate*/ /*(1)---求串的长度*/ int strLength(SqString *s) { return s->length; }/*strLength*/ /*(2)---两个串的比较,S1>S2返回>0,s1length&&ilength;i++) { if(s1->data[i]>s2->data[i]) {

数据结构应用设计设计报告

数据结构应用设计设计报告题目名称:___基于哈夫曼编码的文件压缩器_ 设计环境:____ __VC6.0 ____________ 指导教师:_____ _蔡茂蓉______________ 专业班级:______软件工程0601班__ ___ 姓名:__ _ __杨文辉_____________ 学号:___ ____ _____ 联系电话:_ _ 电子邮件: 设计日期:年月日至年月日 设计报告日期:年月日

1 .题目................................................................................................... 错误!未定义书签。 2 .需求分析........................................................................................... 错误!未定义书签。 2.1文件压缩过程:......................................................................... 错误!未定义书签。 2.2文件解压过程:......................................................................... 错误!未定义书签。 2.3压缩文件的存储结构设计图:................................................. 错误!未定义书签。 2.4HAF文件示例:...................................................................... 错误!未定义书签。 3 .详细设计........................................................................................... 错误!未定义书签。 3.1压缩流程图:............................................................................. 错误!未定义书签。 3.2解压流程图:............................................................................. 错误!未定义书签。 3.3节点类设计:............................................................................. 错误!未定义书签。 3.4编码和译码时的控制结构的实现............................................. 错误!未定义书签。 4.调试分析........................................................................................... 错误!未定义书签。 6 .测试结果........................................................................................... 错误!未定义书签。 6.1文件压缩..................................................................................... 错误!未定义书签。 6.2文件解压..................................................................................... 错误!未定义书签。 7.实验总结........................................................................................... 错误!未定义书签。 8 .参考文献........................................................................................... 错误!未定义书签。

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

数据结构上机实验报告

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

学号: 教师:饶鲜日期:

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

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 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始终指向生成的单链表的最后一个节点

数据结构图的应用报告

数据结构课程设计图的应用个人报告 1979:Red and Black 第一、题目理解 有一个长方形的房间,覆盖平方米瓷砖。每一层的颜色或是红色或黑色。一名男子正站在一个黑色的瓷砖。从瓷砖,他可以转移到四个相邻瓷砖。但是他不能进入红色瓷砖,他只能移动黑砖。写程序的数量黑色瓦片,他可以达到通过重复上述动作。 题目要求只能走黑格子而不能走红格子,从其中一块黑格子开始求出可以到达的黑格子数。 第二、算法思想 用图的深度优先遍历可以解决问题,从开始的位置探索四个方向的格子,用递归直到走完所有黑格子。 建图结构,图的每一个顶点表示瓦片,如果两个相邻顶点都表示黑瓦,则在两个顶点间连线,表示可以从一片黑瓦移到另一片上;对建好的图从给定的起始点开始调用深度优先遍历算法,能访问几个顶点表示重复移动能达到的黑瓦的数目. 第三、如何实现 用一个二维数组来表示房间格子的分布。用变量count来记录可行黑格子的个数。用深度优先遍历算法来遍历整个二维数组。 search(int k,int t){ // Search函数,递归调用. if(k>=0 && k=0 && t

1915: Knight Moves 第一、题目理解 题目要求要计算国际象棋中骑士从一个指定位置到目的位置的最少步数。因为每一次都有八种走法,要把可行的走法记录下来,直到走到终点为止。输出最少的步数。 第二、算法思想 此问题可利用广度优先遍历算法,用一个数组来记录可行的走法,然后再用另一个数组来记录数组中的每一种情况的可行走法,重复以上步骤,当终点出现在第n数组中则结束。数组的数量n就是最小的步数。 第三、如何实现 数据结构: typedef struct { //定义顶点的结构 int x, y; int direction; }VRType; typedef struct { int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int length; }MGraph; typedef VRType QElemType; //队列定义 #define MAXQSIZE 1000 typedef struct { QElemType *base; int front; int rear; }SqQueue;

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

算法与数据结构课程设计 报告 系(院):计算机科学学院 专业班级:计科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);//重载赋

数据结构实验报告-答案

数据结构(C语言版) 实验报告

专业班级学号姓名 实验1 实验题目:单链表的插入和删除 实验目的: 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 实验要求: 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 实验主要步骤: 1、分析、理解给出的示例程序。 2、调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测 试程序的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 3、修改程序: (1)增加插入结点的功能。 (2)将建立链表的方法改为头插入法。 程序代码: #include"" #include"" #include"" #include"" typedef struct node . . 示意图:

head head head 心得体会: 本次实验使我们对链表的实质了解更加明确了,对链表的一些基本操作也更加熟练了。另外实验指导书上给出的代码是有一些问题的,这使我们认识到实验过程中不能想当然的直接编译执行,应当在阅读并完全理解代码的基础上再执行,这才是实验的意义所在。

实验2 实验题目:二叉树操作设计和实现 实验目的: 掌握二叉树的定义、性质及存储方式,各种遍历算法。 实验要求: 采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历 的操作,求所有叶子及结点总数的操作。 实验主要步骤: 1、分析、理解程序。 2、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针), 如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求 所有叶子及结点总数。 实验代码 #include"" #include"" #include"" #define Max 20 ertex=a; irstedge=NULL; irstedge; G->adjlist[i].firstedge=s; irstedge; R[i] 留在原位

数据结构实验报告3链串

宁波工程学院电信学院计算机教研室 实验报告 一、实验目的 1)熟悉串的定义和串的基本操作。 2 )掌握链串的基本运算。 3 )加深对串数据结构的理解,逐步培养解决实际问题的编程能力。 二、实验环境 装有Visual C ++ 6.0的计算机。 三、实验内容 编写一个程序,实现链串的各种基本运算,并在此基础上设计一个主程序。具体如下: 编写栈的基本操作函数 链串类型定义如下所示: typedef struct sno de{ char data; struct snode *n ext; }listri ng; (1)串赋值Assig n(s,t)

将一个字符串常量赋给串s, 即生成一个其值等于t 的串s ( 2 )串复制StrCopy(s,t) 将串t 赋给串s ( 3 )计算串长度StrLength(s) 返回串s 中字符个数 ( 4 )判断串相等StrEqual(s,t) 若两个串s 与t 相等则返回 1 ;否则返回0 。 ( 5 )串连接Concat(s,t) 返回由两个串s 和t 连接在一起形成的新串。 ( 6 )求子串SubStr(s,i,j) 返回串s中从第i(1 w i w StrLength(s))个字符开始的、由连续j 个字 符组成的子串。 ( 7)插入InsStr (s,i,t) 将串t 插入到串s 的第i(1 w i w StrLength(s)+1) 个字符中,即将t 的第一个字符作为s 的第i 个字符,并返回产生的新串( 8)串删除DelStr (s,i,j) 从串s 中删去从第i(1 w i w StrLength(s)) 个字符开始的长度为j 的 子串,并返回产生的新串。 (9)串替换RepStr (s,s1,s2) 在串s 中,将所有出现的子串s1 均替换成s2 。 (10)输出串DispStr(s) 输出串s 的所有元素值 (11 )判断串是否为空IsEmpty(s) 编写主函数 调用上述函数实现下列操作: (1) 建立串s= “ abcdefghijklmn ”,串s1= “xyz ”,串t =" hijk ” ( 2 ) 复制串t 到t1 ,并输出t1 的长度 ( 3) 在串s 的第9 个字符位置插入串s1 而产生串s2 ,并输出s2 ( 4) 删除s 第 2 个字符开始的 5 个字符而产生串s3 ,并输出s3 ( 5) 将串s 第 2 个字符开始的 3 个字符替换成串s1 而产生串s4 ,并输出s4 (6) 提取串s的第8个字符开始的4个字符而产生串S5,并输出S5 ( 7) 将串s1 和串t 连接起来而产生串s6 ,并输出s6 ( 8) 比较串s1 和s5 是否相等,输出结果

数据结构线性表的应用实验报告

实验报告 课程名称____数据结构上机实验__________ 实验项目______线性表的应用____________实验仪器________PC机___________________ 系别_____电子信息与通信学院___ 专业________ ___ 班级/学号______ __ 学生姓名______ ___________ 实验日期_______________________ 成绩_______________________ 指导教师_______________________

实验一.线性表的应用 1.实验目的:掌握线性链表的存储、运算及应用。利用链 表实现一元多项式计算。 2.实验内容: 1)编写函数,实现用链表结构建立多项式; 2)编写函数,实现多项式的加法运算; 3)编写函数,实现多项式的显示; 4)测试:编写主函数,它定义并建立两个多项式,显示 两个多项式,然后将它们相加并显示结果。变换测试用的多项式,检查程序的执行结果。 选做内容:修改程序,选择实现以下功能: 5)多项式求值:编写一个函数,根据给定的x值计算并 返回多项式f(x)的值。测试该函数(从终端输入一个x的值,调用该函数并显示返回结果)。 6)多项式相减:编写一个函数,求两个多项式相减的多 项式。 7)多项式相乘:编写一个函数,求两个多项式的乘积多 项式。 3.算法说明: 1)多项式的建立、显示和相加算法见讲义。可修改显示 函数,使输出的多项式更符合表达规范。

2)多项式减法:同次项的系数相减(缺项的系数是0)。 例如a(x)=-5x2+2x+3,b(x)= -4x3+3x,则a(x)-b(x) =4x3-5x2-x+3。提示:a(x)-b(x) = a(x)+(-b(x))。 3)多项式乘法:两个多项式的相乘是“系数相乘,指数 相加”。算法思想是用一个多项式中的各项分别与另 一个多项式相乘,形成多个多项式,再将它们累加在 一起。例如,a(x)=-5x2+2x+3,b(x)=-4x3+3x,则 a(x)*b(x) = (-4x3)*(-5x2+2x+3)+(3x)*(-5x2+2x+3) = (20x5-8x4-12x3) + (-15x3+6x2+9x) = 20x5-8x4-27x3+6x2+9x。 4.实验步骤: 根据实验报告的要求,我对文件夹里的C文件进行了丰 富和修改,步骤如下: 链表结构建立多项式: typedef struct polynode { float coef; //系数 int exp; //指数 struct polynode *next; //下一结点指针 } PNode; 编写函数,实现多项式的加法运算; PNode * PolyAdd (PNode *f1, PNode *f2) //实现加法功能。

数据结构串的操作实验报告

实验报告 课程数据结构实验名称实验三串 学号姓名实验日期: 串的操作 实验目的: 1. 熟悉串类型的实现方法,了解简单文字处理的设计方法; 2. 熟悉C语言的字符和把字符串处理的原理和方法; 3. 熟悉并掌握模式匹配算法。 实验原理: 顺序存储结构下的关于字符串操作的基本算法。 模式匹配算法BF、KMP 实验内容: 4-19. 在4.4.3节例4-6的基础上,编写比较Brute-Force算法和KMP算法比较次数的程序。 4-20. 设串采用静态数组存储结构,编写函数实现串的替换Replace(S,start,T,V),即要求在主串S中,从位置start开始查找是否存在字串T。若主串S中存在子串T,则用子串V替换子串T,且函数返回1;若主串S中不存在子串T,则函数返回0;并要求设计主函数进行测试。一个测试例子为:S=“I am a student”,T=“student”,V=“teacher”。程序代码: 4-19的代码: /*静态存储结构*/ typedef struct { char str[MaxSize]; int length; }String; /*初始化操作*/ void Initiate(String *S) { S->length=0; } /*插入子串操作*/ int Insert(String *S, int pos, String T) /*在串S的pos位置插入子串T*/ { int i; if(pos<0||pos>S->length) { printf("The parameter pos is error!\n"); return 0; } else if(S->length+T.length>MaxSize)

算法与数据结构图的应用实验报告

编号:XH03JW024-05/0 实训(验)报告 班级:姓名:座号:指导教师:成绩: 课程名称:算法与数据结构实训(验):实验六图的应用2011年12月9 日 一、实验目的: 1、掌握图的两种存储结构; 2、掌握图深度优先遍历的基本思想; 3、掌握图广度优先遍历的基本思想。 二、实训(验)内容、记录和结果(含数据、图表、计算、结果分析等) 1、程序源代码: // (以下为邻接表的队操作) void init1(linkqueue *q) { q->front=q->rear=(queue)malloc(sizeof(node)); q->front->next=NULL; } void ENQUEUE1(linkqueue *q, int v) { queue P; P=(queue)malloc(sizeof(node)); P->data=ga[v].vertex; P->next=NULL; q->rear->next=P; q->rear=P; } int DEQUEUE(linkqueue *q) { int k=0,u; queue P; P=q->front->next; while(ga[k].vertex!=P->data) k++; u=k; q->front->next=P->next; if(q->rear==P) q->rear=q->front; return u; } int isempty1(linkqueue *q)

{ if(q->front==q->rear) return 1; else return 0; } void CREATADJLIST(VerNode ga[]) /*建立无向图的邻接表*/ { int i,j,k; EdgeNode *s; getchar(); for(i=0;iadjvex=j; s->next=ga[i].firstedge; ga[i].firstedge=s; } } DFSL(int i) /*以Vi为出发点对邻接表存储的图G进行DFS搜索*/ { EdgeNode *p; printf("node:%c\n",ga[i].vertex);/*访问顶点Vi*/ visited1[i]=1; /*标记Vi已访问*/ p=ga[i].firstedge; /*取Vi边表的头指针*/ while(p) /*依次搜索Vi的邻接点Vj*/ { /*若Vj尚未访问,则以Vj为出发点向纵深搜索*/ if(!visited1[p->adjvex]) DFSL(p->adjvex); p=p->next; /*找Vi的下一个邻接点*/ } } BFSL(int k) //广度优先搜索邻接表表示的图 { int i; EdgeNode *p;

数据结构实验报告及心得体会

2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨

实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。

三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1;

相关文档
最新文档