数据结构实验报告

数据结构实验报告
数据结构实验报告

课程设计实验报告

实验名称:表达式类型的实现

编译环境:硬件:PC软件:VS2010

问题描述

一个表达式和一棵二叉树之间,存在着自然的对应关系。写一个程序,实现基于二叉树

表示的算术表达式Expression的操作。

基本要求

假设算术表达式Expression可以含有变量(a~z)、常量(0~9)和二元运算符(+,-,

*,/,^(乘幂))。实现以下操作。

(1)ReadExpr(E)——以字符序列的形式输入语法正确的前缀表示式并构造表达式E。

(2)WriteExpr(E)——用带括弧的前缀表示式输出表达式E。

(3)Assign(V,c)——实现对变量V的赋值(V=c),变量的初值为0。

(4)Value(E)——对算术表达式E求值。

(5)CompoundExpr(P,E1,E2)——构造一个新的复合表达式(E1)P(E2)。

选作内容:

(1)增加常数合并操作MergeConst(E)-------合并表达式中E的所有常数运算。例如:表达式E=2+2*1-A进行合并常数的操作后,求得E=4-A

(2)以表达式的原书写形式输入

需求分析

1.以字符序列的形式输入语法正确的中缀表示式并构造表达式E。即要根据正确的前缀式建立一棵二叉树T。

2.用带括弧的前缀表达式输出表达式E。即要求在前缀遍历二叉树的时候考虑运算符的优先级,在适当的位置输出括弧。

3.实现对变量V的赋值(V=c),变量的初值为0。那就在中缀遍历二叉树的过程中比较结点的值是否为V,找到V以后将c赋给V。

4.对算术表达式E求值。如果表达式中有变量的话,首先提示用户表达式中变量,建议先执行操作3(实现对变量V赋值),执行完后再回来执行表达式求值这一步骤。表达式求值利用递归,如果某个结点的值为运算符并且它的左右孩子结点的值为数据,那么就把(左孩子)(运算符)(右孩子)的结果赋给该结点。

一层一层往上,最后只剩下一个根结点。此时根结点的值就是表达式E的值。

5.构造一个新的复合表达式(E1)P(E2)。只要先构造表达式E1的二叉树和E2的二叉树,然后利用P把这两棵二叉树连接起来构成一棵新的二叉树。

6.合并表达式E中所有常数运算。此原理类似于对表达式E求值,不同之处只在于该功能只对常数合并。

概要设计

1. 树的抽象数据类型定义:

ADT Tree{

数据对象 D: D是具有相同特性的数据元素的集合。

数据关系 R: 若D为空集,则称为空树;若D仅含一个数据元素,则R为空集,否则R={H},H 是如下二元关系:

(1)在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;

(2)若D-{root}≠ф,则存在D-{root}的一个划分D1,D2,…Dm(m>0),对任意

j≠k(1<=j,k<=m)有Dj∩Dk = ф,且对任意的i(1≤i≤m),唯一存在数据

元素Xi∈Di,有∈H;

(3)对应于D-{root}≠ф的划分,H - {}有唯一的一

个划分H1,H2…Hm(m>0),对任意j≠k(1<=j,k<=m)有Dj∩Dk = ф,且对

任意的i(1≤i≤m),Hi是Di上的二元关系,(Di,{Hi})是一棵符合本定

义的树,称为根的root的子树。

基本操作:

Double Expression (char *exp);

功能:算术表达式求值

double calculate (double opnd1,char op,double opnd2 );

功能:操作数四则运算

void push( char , char, double , ExpressionCalculateStack *);

功能:入栈

double pop ( char , ExpressionCalculateStack *);

功能:出栈

void GetNextNotation ( char *notation,char *exp);

功能:读下一个运算符或操作数

char GetTypeOfNotation( char *notation );

功能:判定是运算符或是操作数

int CompareOpPrior(char op2, char op1);

功能:运算符优先级别比较

BTNode *ReadExpr(char s[],int i,int j)

功能:读入表达式

void WriteExpr(BTNode *b)

功能:/把输入的表达式转换为相应的二叉树,并以前缀表达式的形式输出

char Seek(char s[],int k)

功能:判断是否有字母输入

void CompoundExpr(char E1[],char E2[],char p)

功能:复合表达式

void Assign(char s[],char i,char j)

功能:对变量进行复制

}

流程图:

程序清单:

头文件(MyExpression.h)

#include

#include

#include

#include

#include

#define MaxSize 100

typedef char ElemType;

typedef struct node

{

ElemType data;

struct node *lchild;

struct node *rchild;

}BTNode;

#define MAX_EXP_LEN 128 /* 表达式最大长度 */

#define MAX_NOTATION_NUM 32 /* 一个表达式中的最大算符个数 */ #define MAX_NOTATION_LEN 20 /* 表达式中一个算符的最大字串长度 */

#define NULL 0

typedef struct stack { /* 表达式计算堆栈 */

double OpdStack[MAX_NOTATION_NUM]; /* 操作数堆栈 */

char OpStack[MAX_NOTATION_NUM]; /* 运算符堆栈 */

int OpdStackTop, /* 操作数堆栈顶指针 */

OpStackTop; /* 运算符堆栈顶指针 */

} ExpressionCalculateStack;

#define OPND 'D' /* 操作数类型标志 */

#define OPTR 'R' /* 运算符类型标志 */

#define CONTINUE_READ_NEXT_NOTATION 'C' /* 表达式扫描标志,继续扫描 */

#define STOP_READ_NEXT_NOTATION 'S' /* 表达式扫描标志,暂停扫描 */

/* 部分子函数声明如下(主要是表达式求值函数)*/

double Expression(char *exp); /* 算术表达式求值*/

double calculate (double opnd1,char op,double opnd2 ); /* 操作数四则运算 */

void push( char , char, double , ExpressionCalculateStack *); /* 入栈 */ double pop ( char , ExpressionCalculateStack *); /* 出栈 */

void GetNextNotation ( char *notation,char *exp); /* 读下一个运算符或操作数 */

char GetTypeOfNotation( char *notation ); /* 判定是运算符或是操作数 */

int CompareOpPrior(char op2, char op1); /* 运算符优先级别比较 */

源代码文件(MyExpression.c)

#include"MyExpression.h"

#include"stdlib.h"

extern double Expression(char *oldexp) ;

extern int CompareOpPrior(char op2, char op1);

extern char GetTypeOfNotation( char *notation ) ;

extern void GetNextNotation (char *notation,char *exp);

extern double calculate(double opnd1,char op,double opnd2 );

extern double pop(char type,ExpressionCalculateStack *s);

extern void push(char type, char op,double opnd,ExpressionCalculateStack *s);

BTNode *ReadExpr(char s[],int i,int j)

{

BTNode *p;

int k,plus=0,posi;

if(i==j)

{

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

p->data=s[i];

p->lchild=NULL;

p->rchild=NULL;

return p;

}

//以下是i!=j的情况

if(i!=j)

{

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

{ if(s[k]=='+'||s[k]=='-')

{

plus++;

posi=k;

}

}

if(plus==0)

{

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

if(s[k]=='*'||s[k]=='/')

{

plus++;

posi=k;

}

}

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

p->data=s[posi];

p->lchild=ReadExpr(s,i,posi-1);

p->rchild=ReadExpr(s,posi+1,j);

return p;

// }

}

}

void WriteExpr(BTNode *b) //把输入的表达式转换为相应的二叉树,并以前缀表达式的形

式输出

{

if(b!=NULL)

{

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

if(b->lchild!=NULL||b->rchild!=NULL)

{

printf("(");

WriteExpr(b->lchild );

if(b->rchild!=NULL)

printf(",");

WriteExpr(b->rchild);

printf(")");

}

}

}

char Seek(char s[],int k)//判断是否有字母输入

{

char a[1]={0};

int i;

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

if(s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z')

return a[0]='1';

}

void Assign(char s[],char i,char j)

{

for(int p=0;p<=strlen(s)-1;p++)

if(s[p]==i)

s[p]=j;

}

void CompoundExpr(char E1[],char E2[],char p)//复合表达式{char NewE[MaxSize],q[1];

int k=0,i;

BTNode *bt1,*bt2,*T;

if(p=='+'||p=='-')//复合函数为+或-是应怎样复合

{

for( i=0;i

NewE[i]=E1[i];

NewE[strlen(E1)]=p;

for( k=0;k

NewE[i+1]=E2[k];

NewE[i+1]='\0';

printf("复合后的表达式为:%s\n\n",NewE);

printf("其对应的二叉树为:");

T=ReadExpr(NewE ,0,strlen(NewE)-1);

WriteExpr(T);

printf("\n");

}

else

{printf("复合的表达式为:");//复合符号为*或/是应该怎样复合这两个表达式bt1=ReadExpr(E1,0,strlen(E1)-1);

printf("(");

WriteExpr(bt1);

printf(")");

printf("%c",p);

bt2=ReadExpr(E2,0,strlen(E2)-1);

printf("(");

WriteExpr(bt2);

printf(")");

printf("\n");

}

}

void Conbination(char s[],int k)//对常数项进行合并

{//int FX=0;

if(s[k]=='*')

{

if((s[k-1]>='0'&&s[k-1]<='9')&&(s[k+1]>='0'&&s[k+1]<='9')) //判断是否为数字{ /*FX=s[k-1]*s[k+1];

s[k-1]=FX;*/

s[k-1]=(s[k-1]-48)*(s[k+1]-48)+48;

for(int i=k;i

s[i]=s[i+2];

}

}

if(s[k]=='/')

{

if((s[k-1]>='0'&&s[k-1]<='9')&&(s[k+1]>='0'&&s[k+1]<='9'))

{ s[k-1]=(s[k-1]-48)/(s[k+1]-48)+48;

for(int i=k;i

s[i]=s[i+2];

}

}

if(s[k]=='+')

{

if((s[k-1]>='0'&&s[k-1]<='9')&&(s[k+1]>='0'&&s[k+1]<='9'))

{ s[k-1]=(s[k-1]-48)+(s[k+1]-48)+48;

for(int i=k;i

s[i]=s[i+2];

}

}

if(s[k]=='-')

{

if((s[k-1]>='0'&&s[k-1]<='9')&&(s[k+1]>='0'&&s[k+1]<='9'))

{ s[k-1]=(s[k-1]-48)-(s[k+1]-48)+48;

for(int i=k;i

s[i]=s[i+2];

}

}

printf("常数合并后为:%s",s);

}

void MergeConst(char s[])//常数合并

{

int i,j,n;

for(i=0;i

{

if(s[i]=='*'||s[i]=='/')

Conbination(s,i);

}

for(j=0;j

{

if(s[j]=='+'||s[j]=='-')

Conbination(s,j);

}

}

void main()

{double fx=0;

BTNode *b;

int i=0,j=0;

char s[MaxSize], yesORno,value,getvalue,GetDigitl=NULL,p,E1[7],E2[3],e1,e2; printf(" \n\n 表达式类型实现的使用说明:\n\n");

printf(" 表达式暂时还不能进行括号操作,请不要输入括号,\n\n"); printf(" 数字的输入只能是一位数(0-9),字母的输入a-z或A-Z\n\n"); printf(" 表达式输入时请按以下形式输入:A-S+D\n\n");

printf("************************************\n\n");

printf(" 1.输入表达式 2.输出表达式\n\n");

printf(" 3.对变量赋值 4.对表达式求值\n\n");

printf(" 5.复合表达式 6.常数合并\n\n");

printf(" 7.返回\n\n");

printf("************************************\n\n");

printf("请输入选择(1-7)");

while((GetDigitl=getchar())!='7')

{

switch(GetDigitl)

{ case '1':

{

printf("\n\n请以中缀表达式形式输入表达式,例如a+b*c/d\n\n");

printf("你的输入");getchar();

gets(s); //以中缀表达式形式输入表达式

printf("\n");

printf("你输入的表达式为:%s\n",s);

b=ReadExpr(s,0,strlen(s)-1);

printf("\n请输入选择(1-7)\n");

break;

}

case '2':

{

printf("\n对应的二叉树:");

WriteExpr(b);

printf("\n\n");

printf("\n请输入选择(1-7)\n");

break;

}

case '3':

{

while((yesORno=Seek(s,strlen(s)-1))=='1')

{

printf("表示式中有变量!\n");

getchar();

printf("需要赋值的变量:");

value=getchar();

getchar();

printf("变量值:");

getvalue=getchar();

Assign(s,value,getvalue);

}

b=ReadExpr(s,0,strlen(s)-1);

printf("\n对应的二叉树:");

WriteExpr(b);printf("\n请输入选择(1-7)\n");

break;

}

case '4':

{yesORno=Seek(s,strlen(s)-1);

if(yesORno=='1')

printf("表达式中有未知变量,请选择3进行变量赋值\n");

else

{

fx=Expression(s); /* 表达式求值*/

printf("\n表达式的运算结果为: %f \n",fx);

}

printf("\n请输入选择(1-7)\n");

break;

}

case '5':

{

printf("请从(+、-、*、/)中选择一个作为复合符号\n");

printf("你的选择是:");

getchar();

p=getchar();

printf("\n");

printf("请输入要复合的第一个表达式:");

getchar();

gets(E1);

printf("\n");

printf("请输入要复合的第二个表达式:");

gets(E2);

printf("\n");

CompoundExpr(E1,E2,p);

printf("\n请输入选择(1-7)\n");

break;

}

case '6':

{ MergeConst(s);

printf("\n请输入选择(1-7)\n");

break;

}

}

}

}//一下是表达式求值函数

#include"MyExpression.h"

double Expression(char *oldexp) //表达式计算函数,输入的是表达式字符串{

char notation[MAX_NOTATION_LEN], // 存放当前符号扫描读入的符号op1,op2,

exp[MAX_EXP_LEN]; // 存放当前操作表达式

char flag=CONTINUE_READ_NEXT_NOTATION; //判别是否继续扫描下去

int prior; //存放算符优先级别比较结果: op2op1 : 1 //op2=op1 : 0

double opnd1,opnd2; // 存放当前用于计算的2个操作数ExpressionCalculateStack s; //定义堆栈s

s.OpdStackTop=s.OpStackTop=0;

strcpy(exp,oldexp); //把原表达式复制给当前操作表达式

strcat(exp,"#"); //把‘#’接到exp后面,原exp最后面的‘\0’被取消

push(OPTR,'#',0.0,&s); // 初始化表达式计算堆栈

while(1)

{

if( flag==CONTINUE_READ_NEXT_NOTATION )

GetNextNotation (notation,exp);

else /* 有运算结果进操作数栈后*/

flag=CONTINUE_READ_NEXT_NOTATION;

if ( GetTypeOfNotation( notation )==OPND )

{

opnd2 = atof(notation);

push(OPND,NULL,opnd2,&s); //操作数处理

}

else // 运算符处理

{ op2 = notation [0];

op1 = (char) pop(OPTR,&s); // 运算符出栈

prior = CompareOpPrior(op2,op1);

if ( prior < 0 ) //op2 < op1

{

push(OPTR, op1,0.0,&s); //刚出栈的运算符再次进栈

push(OPTR, op2,0.0,&s); // 当前运算符优先级别高,进栈

}

if ( prior > 0 ) //op2 > op2

{ opnd2 = pop(OPND,&s) ;

opnd1 = pop(OPND,&s);

opnd2 = calculate(opnd1,op1,opnd2 );

push( OPND, NULL,opnd2,&s);

flag=STOP_READ_NEXT_NOTA TION; ///暂停读入下一个表达式符号

//使当前运算符与栈顶运算符再作一次比较}

if(prior==0) //op2 = op1 的情况处理

{ if( op2=='#')return pop(OPND,&s) ;//结束运算,将运算结果从堆栈中弹出

}

}

}

}

void push(char type, char op,double opnd,ExpressionCalculateStack *s)

{

if(type==OPND)

s->OpdStack[s->OpdStackTop++]= opnd;

else s->OpStack[s->OpStackTop++] = op;

}

double pop(char type,ExpressionCalculateStack *s)

{

if(type==OPND) // 是操作数栈

return s->OpdStack[--s->OpdStackTop];

else // 是运算符栈

return (double) (s->OpStack[--s->OpStackTop]);

}

double calculate(double opnd1,char op,double opnd2 )

{

switch(op) {

case '+': return opnd1+opnd2;

case '-': return opnd1-opnd2;

case '*': return opnd1*opnd2;

case '/': if( opnd2!=0.0)

return opnd1/opnd2;

else return 0.0;

}

return 0.0;

}

void GetNextNotation (char *notation,char *exp) // 读入下一个完整的符号:操作数或运算符{ // 把一个完整的操作数或运算符保存到notation[] static int i=0; // 变量i为表达式扫描的当前位置,注意其类型

int j;

char type,lasttype = GetTypeOfNotation( exp+i );

for( j=0; exp[i]!='\0' ; j++,i++ )

{ if( exp[i]==' ' )continue;

notation[j]=exp[i];

type=GetTypeOfNotation( notation+j );

if( type==OPTR && lasttype==OPTR ) { i++, j++; break; } //第一次读到的就是

//运算符if( type==OPTR && lasttype==OPND ) break; //由读到的不是运算符转为读到的是

运算符

lasttype=type;

}

notation[j]=NULL;

if( notation[0]=='#') i=0; //表达式扫描完毕

}

char GetTypeOfNotation( char *notation ) //判断一个字符是不是运算符

{

char opstr[]="+-*/()#"; //运算符集

int i;

if( notation[0]=='\0' ) return NULL;

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

if( notation[0]==opstr[i]) return OPTR; //'R' 即是运算符

return OPND; // 'D' 即是操作数或小数点或其它如空格等

}

int CompareOpPrior(char op2, char op1) //2个先后出现的运算符优先级别比较:按P53表3.1

//定

{

char opstr[]="+-*/()#";

int i,j;

int priortable[7][7]= // + - * / ( ) #

{

1, 1, -1, -1, -1, 1, 1,

1, 1, -1, -1, -1, 1, 1,

1, 1, 1, 1, -1, 1, 1,

1, 1, 1, 1, -1, 1, 1,

-1, -1, -1, -1, -1, 0, 'I',

1, 1, 1, 1, 'I', 1, 1,

-1, -1, -1, -1, -1, 'I', 0,

};

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

if( op1==opstr[i] ) break;

for( j=0; opstr[j]!='\0'; j++ )

if( op2==opstr[j] ) break;

return priortable[i][j];

}

测试分析与用户使用步骤:

出初始界面如下

数据测试,测试结果如下:

选择操作1,操作结果如下,输入你想呀输入的表达式:

输入表达式后,继续选择你要执行的操作

选择2操作,此操作是将以中缀形式输入的表达式,构造成一棵树,然后以二叉树的先序遍历的形式输入其结果,其结果如下:

执行完操作2后,继续选择你要的操作

选择3操作是将表达式中的变量进行赋值,直到表达式中的所有变量都赋上确切的值位置为止,并以所对应的二叉树的先序遍历的形式输出其结果,其执行结果如下:

执行完操作3后,即可执行4的操作,对表达式求值。若表达式中有变量,没有经过执行操作3而是直接执行操作4的话,程序会提醒用户先去执行操作3后,再回来执行操作4,其操作结果如下:

变量已赋值:

变量若尚未赋值:

执行完操作4后,接下来的就只有操作5没执行而已了

操作5是对用户输入的两个表达式进行复合,复合符号为+或-跟复合符号为*或/,其复合的方式不一样,其操作结果如下:

以上是复合符号为+和复合符号为-的复合结果

下面看一下复合复合为*和复合符号/的结果:

执行完后可执行操作6,合并常数项,其操作结果如下:只有+和—号的合并:

加减乘除都有的常数项合并:

执行到这里已经将此程序的所有操作都执行完了,剩下最后的操作就是操作6,此操作就是返回编译环境

调试分析:

由于用的编译环境是VS2010,且用的是scanf或gets()或getcher()来获取用户信息,所以在用户输入信息时,有时候会出现获取不到用户输入的信息,后来设置了断点调试后,用了一个getchar()来接受回车符即可

字符串数组的操作若没有在字符串的结尾加上‘\0’的话会出现乱码的问题。

还有一个就是ASCII值与数字本身值的转换,若S[10]是一个字符串数组,执行

S[K-1]=S[K-1]*S[K+1]后得到的是S[K-1]的ASCII值乘以S[K+1]的ASCII值

最后一点,经过这次的课程设计,我觉得断点调试很重要

实验总结:此次实验主要是根据用户输入的表达式将其转换为对应的对二叉树,并对其

进行一系列的操作(按二叉树的先序遍历将其对应的二叉树输出,对表达式中的变量进行赋值,对表达式进行求值),在这个过程中涉及到了对队列的操作、栈的操作、二叉树的操作等等,其中栈的操作主要是用在对表达式的求值上,先判断读进来的是字符还是数字,然后把他们放在两个不同的栈中,实际上就是根据是字符还是数字,然后将他们进栈,再求值。

实验心得:因为之前选的实验是二叉树的操作,所以对二叉树的存储类型与基本操作比

较熟悉,所以在做表达式转换为对应的二叉树是做得比较顺手,没有遇到什么大问题。

在做表达式求值时,用到了栈的操作,由于上课比较认真听课,所以那些操作都很熟悉,没有什么障碍

在复合表达式操作中,遇到了出现乱码的问题,主要是字符串数组的操作出了点小差错,导致字符串数组的后面出了乱码,仔细研究后字符串数组后将其解决

这个程序的操作中遇到最多的错误是由于编译器的问题,若从键盘键入东西,按回车键结束时,总是需要一个getchar()来接受回车符,否则下面的操作讲得不到自己想要的结果。

刚开始不知道是这个错误,所以弄了很久,后来设了断点设调试时终于发现了根源所在,很快就把问题给解决了

总的来说,这次的课程设计做得还是蛮顺利,没什么大的问题出现。

数据结构实验报告格式

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

数据结构实验一顺序表问题及实验报告模板 - Copy

实验一顺序表问题 【实验报告】 《数据结构与算法》实验报告一 学院:计算机与信息学院班级: 学号:姓名: 日期:程序名: 一、上机实验的问题和要求: 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 1.从键盘输入10个整数,产生顺序表,并输出结点值。 调试数据:9 8 7 6 5 4 3 2 1 2.从键盘输入1个整数,在顺序表中查找该结点。若找到,输出结点的位置;若找不到, 则显示“找不到”。 调试数据:第一次输入11,第二次输入3 3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插 入在对应位置上,输出顺序表所有结点值,观察输出结果。 调试数据:第一次insert "11" after "6" ,第二次insert "86" at "2" 4.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 调试数据:第一次delete the number at "2" ,第二次delete value "9" 注意:顺序表输出表现形式如下(实验报告上为截图): 顺序表: 第一题 Initially Seq: head -> 9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> null 第二题 找不到 6 第三题 insert "11" after "6": head -> 9 -> 8 -> 7 -> 6 -> 11 -> 5 -> 4 -> 3 -> 2 -> 1 -> null insert"86"at"2":head -> 9 -> 8 -> 86 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> null 第四题 delete the number at "2":head -> 9 -> 8 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 ->null delete value "9": head -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> null

(完整版)数据结构实验报告全集

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

数据结构实验报告

数据结构实验报告 一.题目要求 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

数据结构实验报告图实验

图实验一,邻接矩阵的实现 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++) {

数据结构实验报告完整

华北电力大学 实验报告| | 实验名称数据结构实验 课程名称数据结构 | | 专业班级:学生姓名: 学号:成绩: 指导教师:实验日期:2015/7/3

实验报告说明: 本次实验报告共包含六个实验,分别为:简易停车场管理、约瑟夫环(基于链表和数组)、二叉树的建立和三种遍历、图的建立和两种遍历、hash-telbook和公司招工系统。 编译环境:visual studio 2010 使用语言:C++ 所有程序经调试均能正常运行 实验目录 实验一约瑟夫环(基于链表和数组) 实验二简易停车场管理 实验三二叉树的建立和三种遍历 实验四图的建立和两种遍历 实验五哈希表的设计

实验一:约瑟夫环 一、实验目的 1.熟悉循环链表的定义和有关操作。 二、实验要求 1.认真阅读和掌握实验内容。 2.用循环链表解决约瑟夫问题。 3.输入和运行编出的相关操作的程序。 4.保存程序运行结果 , 并结合输入数据进行分析。 三、所用仪器设备 1.PC机。 2.Microsoft Visual C++运行环境。 四、实验原理 1.约瑟夫问题解决方案: 用两个指针分别指向链表开头和下一个,两指针依次挪动,符合题意就输出结点数据,在调整指针,删掉该结点。 五、代码 1、基于链表 #include using namespace std; struct Node { int data; Node* next; }; void main() { int m,n,j=1; cout<<"请输入m的值:";cin>>m; cout<<"请输入n的值:";cin>>n; Node* head=NULL; Node* s=new Node; for(int i=1;i<=n;i++) { Node* p=new Node; p->data=n+1-i;

数据结构图的遍历实验报告

实验项目名称:图的遍历 一、实验目的 应用所学的知识分析问题、解决问题,学会用建立图并对其进行遍历,提高实际编程能力及程序调试能力。 二、实验容 问题描述:建立有向图,并用深度优先搜索和广度优先搜素。输入图中节点的个数和边的个数,能够打印出用邻接表或邻接矩阵表示的图的储存结构。 三、实验仪器与设备 计算机,Code::Blocks。 四、实验原理 用邻接表存储一个图,递归方法深度搜索和用队列进行广度搜索,并输出遍历的结果。 五、实验程序及结果 #define INFINITY 10000 /*无穷大*/ #define MAX_VERTEX_NUM 40 #define MAX 40 #include #include #include #include

typedef struct ArCell{ int adj; }ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { char name[20]; }infotype; typedef struct { infotype vexs[MAX_VERTEX_NUM]; AdjMatrix arcs; int vexnum,arcnum; }MGraph; int LocateVex(MGraph *G,char* v) { int c = -1,i; for(i=0;ivexnum;i++) if(strcmp(v,G->vexs[i].name)==0) { c=i; break;} return c;} MGraph * CreatUDN(MGraph *G)//初始化图,接受用户输入{ int i,j,k,w; char v1[20],v2[20]; printf("请输入图的顶点数,弧数:"); scanf("%d%d",&G->vexnum,&G->arcnum);

数据结构实验报告模板

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);//重载赋

数据结构实验报告模板(验证型)

学期:2010-2011学年第一学期指导教师:杨华莉成绩: 实验一顺序表的基本操作 一、实验目的 1.掌握使用VC++6.0调试程序的基本方法; 2.掌握线性表的顺序存储结构的类型定义; 3.掌握顺序表的基本操作的实现,如:插入、删除、遍历、查找、排序、修改、合并等; 4.掌握顺序表的应用。 二、实验要求 1.认真阅读和掌握本实验的示例程序。 2.上机运行示例程序,打印出程序的运行结果,并作必要的说明。 3.对示例程序,按照对线性表的操作需要,在程序中至少添加2个顺序表的相关操作。如: i.查找并显示分数在区间[a,b)的学生信息; ii.查找并显示最高分或最低分学生信息; iii.统计不及格或及格人数及所占比例; iv.将信息表按学号、姓名或分数升序或降序排列; v.按学号顺序进行数据元素的插入; vi.删除指定学号或姓名的学生信息; vii.修改某个学生的信息; viii.其它。 4.重新改写主函数(要求必需调用自己添加的操作),打印出文件清单(自己添加的函数、修改后的主函数和运行结果)。 5.对修改后的程序,分析每一个算法(函数)的时间复杂度。 6.根据上述要求撰写实验报告,并简要给出算法设计小结和心得。 三、实验环境 1.台式计算机每人一台; 2.软件:Visual C++6.0 四、实验内容和实验结果

一.示例程序运行结果及说明

二.自己添加的新函数(至少2个),要求加必要的注释。 SqList Delete_SqList(SqList &L)//删除学生信息 { Elemtype x; int i=0; int choice=DMenu(); char name[25]; int num,k; if(!L.length) { printf("表为空,无法删除!"); exit(0); } switch(choice) { case 1: //按姓名删除 printf("\n请输入要删除的学生的姓名\n"); scanf("%s",&name); k=strcmp(name,L.data[i].name);//比较姓名 if(k==0) { x=L.data[i-1]; for(int m=L.length-1;m>=i-1;--m) L.data[i-1]=L.data[i]; --L.length; break; } case 2: //按学号删除 printf("\n请输入要删除学生的学号\n"); scanf("%d",&num); if(num==L.data[i].num) { for(int m=L.length-1;m>=i-1;--m) L.data[i-1]=L.data[i]; --L.length; break; } case 3:break; } return L;

数据结构实验报告图实验

邻接矩阵的实现 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++) { cout << "Please enter two vertexs number of edge: " cin >> i >> j; arc[i][j] = 1; arc[j][i] = 1; } }

数据结构实验报告七查找、

云南大学软件学院数据结构实验报告 (本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □ 学期:2010秋季学期 任课教师: 实验题目: 查找算法设计与实现 姓名: 王辉 学号: 20091120154 电子邮件: 完成提交时间: 2010 年 12 月 27 日

云南大学软件学院2010学年秋季学期 《数据结构实验》成绩考核表 学号:姓名:本人承担角色: 综合得分:(满分100分) 指导教师:年月日(注:此表在难度为C时使用,每个成员一份。)

(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%) 1 哈希表查找。根据全年级学生的姓名,构造一个哈希表,选择适当的哈希函数和解决冲突的方法,设计并实现插入、删除和查找算法。 熟悉各种查找算法的思想。 2、掌握查找的实现过程。 3、学会在不同情况下运用不同结构和算法求解问题。 4 把每个学生的信息放在结构体中: typedef struct //记录 { NA name; NA tel; NA add; }Record; 5 void getin(Record* a)函数依次输入学生信息 6 人名折叠处理,先将用户名进行折叠处理折叠处理后的数,用除留余数法构造哈希函数,并返回模值。并采用二次探测再散列法解决冲突。 7姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。将初始班级的通讯录信息存入文件。 二、【实验设计(Design)】(20%) (本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系) 1抽象数据类型的功能规格说明和结构体: #include

数据结构实验报告无向图

《数据结构》实验报告 ◎实验题目: 无向图的建立与遍历 ◎实验目的:掌握无向图的邻接链表存储,熟悉无向图的广度与深度优先遍历。 ◎实验内容:对一个无向图以邻接链表存储,分别以深度、广度优先非递归遍历输出。 一、需求分析 1.本演示程序中,输入的形式为无向图的邻接链表形式,首先输入该无向图的顶点数和边数,接着输入顶点信息,再输入每个边的顶点对应序号。 2.该无向图以深度、广度优先遍历输出。 3.本程序可以实现无向图的邻接链表存储,并以深度、广度优先非递归遍历输出。 4.程序执行的命令包括:(1)建立一个无向图的邻接链表存储(2)以深度优先遍历输出(3)以广度优先遍历输出(4)结束 5.测试数据: 顶点数和边数:6,5 顶点信息:a b c d e f 边的顶点对应序号: 0,1 0,2 0,3 2,4 3,4 深度优先遍历输出: a d e c b f 广度优先遍历输出: a d c b e f 二概要设计 为了实现上述操作,应以邻接链表为存储结构。 1.基本操作: void createalgraph(algraph &g) 创建无向图的邻接链表存储 void dfstraverseal(algraph &g,int v)

以深度优先遍历输出 void bfstraverseal(algraph &g,int v) 以广度优先遍历输出 2.本程序包含四个模块: (1)主程序模块 (2)无向图的邻接链表存储模块 (3)深度优先遍历输出模块 (4)广度优先遍历输出模块 3.模块调用图: 三详细设计 1.元素类型,结点类型和指针类型:typedef struct node { int adjvex; struct node *next; }edgenode; typedef struct vnode { char vertex; edgenode *firstedge; }vertxnode; typedef vertxnode Adjlist[maxvernum]; typedef struct { Adjlist adjlist; int n,e; }algraph; edgenode *s; edgenode *stack[maxvernum],*p; 2.每个模块的分析: (1)主程序模块 int main()

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

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;

数据结构实验报告图实验

图实验 一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 #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 #include using namespace std; #include "" 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;

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

《数据结构实验》的实验题目及实验报告模板 实验一客房管理(链表实验) ●实现功能:采用结构化程序设计思想,编程实现客房管理程序的各个功能函数,从而熟练 掌握单链表的创建、输出、查找、修改、插入、删除、排序和复杂综合应用等操作的算法 实现。以带表头结点的单链表为存储结构,实现如下客房管理的设计要求。 ●实验机时: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)的方法;

数据结构实验报告

本科实验报告 课程名称:数据结构(C语言版) 实验项目:线性表、树、图、查找、内排序实验地点:明向校区实验楼208 专业班级:学号: 学生姓名: 指导教师:杨永强 2019 年 1 月10日

#include #include #include #define OK 1 typedef struct{//项的表示,多项式的项作为LinkList的数据元素float coef;//系数 int expn;//指数 }term,ElemType; typedef struct LNode{ //单链表节点结构 ElemType data; struct LNode *next; }LNode, *LinkList; typedef LinkList polynomial; int CreatLinkList(polynomial &P,int n){ //创建多项式P = (polynomial)malloc(sizeof(LNode)); polynomial q=P; q->next=NULL; polynomial s; for(int i = 0; i < n; i++){ s = (polynomial)malloc(sizeof(LNode)); scanf("%f%d",&(s->data.coef),&(s->data.expn)); q->next = s; s->next = NULL; q=q->next; } return OK; } 运行结果 2. void PrintfPolyn(polynomial P){ polynomial q; for(q=P->next;q;q=q->next){ if(q->data.coef!=1) printf("%g",q->data.coef);

数据结构实验报告

数据结构实验报告 第 6 次实验 学号:20141060106 姓名:叶佳伟 一、实验目的 1、复习图的逻辑结构、存储结构及基本操作; 2、掌握邻接矩阵、邻接表及图的创建、遍历; 3、了解图的应用。 二、实验内容 1、(必做题)假设图中数据元素类型是字符型,请采用邻接矩阵或邻接表实现图的以下基本操作: ( 1)构造图(包括有向图、有向网、无向图、无向网); ( 2)根据深度优先遍历图; ( 3)根据广度优先遍历图。 三、算法描述 (采用自然语言描述) 四、详细设计 (画出程序流程图) 五、程序代码 (给出必要注释) #include #include #include #include #include #define INFINITY 255678 /*赋初值用*/ #define MAX_VERTEX_NUM 20 /* 最大顶点个数*/ enum {DG, DN, UDG, UDN}; typedef struct ArcCell {

int adj;/*顶点关系类型,对无权图,用1(是)或0(否)表示相邻否;对带权图,则为权值*/ char *info;/*弧相关信息指针*/ }AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { char vexs[MAX_VERTEX_NUM][5];/*顶点向量*/ AdjMatrix arcs; /*邻接矩阵*/ int vexnum, arcnum;/*图的当前顶点数和弧数*/ int kind; }MGraph; void CreateDG(MGraph *G); void CreateDN(MGraph *G); void CreateUDG(MGraph *G); void CreateUDN(MGraph *G); int LocateVex(MGraph *G, char v[]); void print(MGraph *G); int main(void) { MGraph *G; G = (MGraph *)malloc(sizeof(MGraph)); printf("请选者0-有向图,1-有向网,2-无向图,3-无向网: "); scanf("%d", &G->kind); switch(G->kind) { case DG : CreateDG(G); print(G); break; case DN : CreateDN(G); print(G); break; case UDG : CreateUDG(G); print(G); break; case UDN : CreateUDN(G);

数据结构实验报告 - 答案汇总

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

专业班级学号姓名 实验1 实验题目:单链表的插入和删除 实验目的: 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 实验要求: 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 实验主要步骤: 1、分析、理解给出的示例程序。 2、调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序 的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 3、修改程序: (1)增加插入结点的功能。 (2)将建立链表的方法改为头插入法。 程序代码: #include"stdio.h" #include"string.h" #include"stdlib.h" #include"ctype.h" typedef struct node //定义结点 { char data[10]; //结点的数据域为字符串 struct node *next; //结点的指针域 }ListNode; typedef ListNode * LinkList; // 自定义LinkList单链表类型 LinkList CreatListR1(); //函数,用尾插入法建立带头结点的单链表 LinkList CreatList(void); //函数,用头插入法建立带头结点的单链表 ListNode *LocateNode(); //函数,按值查找结点 void DeleteList(); //函数,删除指定值的结点 void printlist(); //函数,打印链表中的所有值 void DeleteAll(); //函数,删除所有结点,释放内存

数据结构图实验报告

数据结构教程 上机实验报告 实验七、图算法上机实现 一、实验目的: 1.了解熟知图的定义和图的基本术语,掌握图的几种存储结构。 2.掌握邻接矩阵和邻接表定义及特点,并通过实例解析掌握邻接 矩阵和邻接表的类型定义。 3.掌握图的遍历的定义、复杂性分析及应用,并掌握图的遍历方 法及其基本思想。 二、实验内容: 1.建立无向图的邻接矩阵 2.图的深度优先搜索 3.图的广度优先搜索 三、实验步骤及结果: 1.建立无向图的邻接矩阵: 1)源代码: #include "" #include "" #define MAXSIZE 30 typedef struct

{ char vertex[MAXSIZE]; ertex=i; irstedge=NULL; irstedge; irstedge=p; p=(EdgeNode*)malloc(sizeof(EdgeNode)); p->adjvex=i; irstedge; irstedge=p; } } int visited[MAXSIZE]; ertex); irstedge;

ertex=i; irstedge=NULL; irstedge;irstedge=p; p=(EdgeNode *)malloc(sizeof(EdgeNode)); p->adjvex=i; irstedge; irstedge=p; } } typedef struct node { int data; struct node *next; }QNode; ertex); irstedge;ertex); //输出这个邻接边结点的顶点信息 visited[p->adjvex]=1; //置该邻接边结点为访问过标志 In_LQueue(Q,p->adjvex); //将该邻接边结点送人队Q }

相关文档
最新文档