川师 数学院 数据结构试验报告.docx

上传人:b****1 文档编号:3507713 上传时间:2023-05-06 格式:DOCX 页数:67 大小:34.29KB
下载 相关 举报
川师 数学院 数据结构试验报告.docx_第1页
第1页 / 共67页
川师 数学院 数据结构试验报告.docx_第2页
第2页 / 共67页
川师 数学院 数据结构试验报告.docx_第3页
第3页 / 共67页
川师 数学院 数据结构试验报告.docx_第4页
第4页 / 共67页
川师 数学院 数据结构试验报告.docx_第5页
第5页 / 共67页
川师 数学院 数据结构试验报告.docx_第6页
第6页 / 共67页
川师 数学院 数据结构试验报告.docx_第7页
第7页 / 共67页
川师 数学院 数据结构试验报告.docx_第8页
第8页 / 共67页
川师 数学院 数据结构试验报告.docx_第9页
第9页 / 共67页
川师 数学院 数据结构试验报告.docx_第10页
第10页 / 共67页
川师 数学院 数据结构试验报告.docx_第11页
第11页 / 共67页
川师 数学院 数据结构试验报告.docx_第12页
第12页 / 共67页
川师 数学院 数据结构试验报告.docx_第13页
第13页 / 共67页
川师 数学院 数据结构试验报告.docx_第14页
第14页 / 共67页
川师 数学院 数据结构试验报告.docx_第15页
第15页 / 共67页
川师 数学院 数据结构试验报告.docx_第16页
第16页 / 共67页
川师 数学院 数据结构试验报告.docx_第17页
第17页 / 共67页
川师 数学院 数据结构试验报告.docx_第18页
第18页 / 共67页
川师 数学院 数据结构试验报告.docx_第19页
第19页 / 共67页
川师 数学院 数据结构试验报告.docx_第20页
第20页 / 共67页
亲,该文档总共67页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

川师 数学院 数据结构试验报告.docx

《川师 数学院 数据结构试验报告.docx》由会员分享,可在线阅读,更多相关《川师 数学院 数据结构试验报告.docx(67页珍藏版)》请在冰点文库上搜索。

川师 数学院 数据结构试验报告.docx

川师数学院数据结构试验报告

四川师范大学数学与软件科学学院

实验报告

课程名称:

数据结构(C语言版)

指导老师:

冯山

实验项目

实验名称

学时

成绩

实验一

ADT的类C描述向C程序的转换实验

2学时

实验二

线性表及其基本操作实验

2学时

实验三

栈和队列实验

6学时

实验四

字符串实验

2学时

实验五

稀疏矩阵的三元组实现实验

4学时

实验六

二叉树的基本算法实验

4学时

实验七

Huffman树与Huffman树编码算法实验

4学时

实验八

图的建立与遍历算法实验

4学时

实验九

内部排序算法实验

4学时

实验十

查找实验

2学时

班级:

2009级6班

学号:

2009060630

姓名:

总成绩:

________

实验一:

ADT的类C描述向C程序的转换实验(2学时)

实验目的:

(1)复习C语言的基本用法;

(2)学会用类C的语言对算法进行描述的方法,将类C算法转换成C源程序的方法和过程;

(3)抽象数据类型的定义和表示、实现;

(4)加深对数据的逻辑结构和物理结构之间关系的理解;

(5)初步建立起时间复杂度和空间复杂度的概念。

实验内容:

(类C算法的程序实现)

(1)输入一组数据存入数组中,并将数据元素的个数动态地由输入函数完成。

求输入数据的最大值、最小值,并通过函数参数返回所求结果;

实验准备:

1)计算机设备;2)程序调试环境的准备,如TC环境;3)实验内容的算法分析与代码设计与分析准备。

实验步骤:

1.安装TC并设置好环境,如果已安装好,可以跳过此步;

2.录入程序代码并进行调试和算法分析;

对实验内容

(1)的操作步骤:

1)用类C语言描述算法过程;2)用C语言环境实现该算法。

对实验内容

(2)的操作步骤:

1)完成算法的C实现;2)分析其时间复杂度和空间复杂度。

3.编写实验报告。

实验结果:

//动态分配数组空间

#include"stdio.h"

#include"malloc.h"

intsize,i;

int*pArray;

int*p;

voidmalloc_size()

{

pArray=(int*)malloc(size*(sizeof(int)));

}

intinput_size()

{

printf("pleaseinputthesize:

\n");

printf("size=");

scanf("%d",&size);

return0;

}

intinput_data()

{

printf("pleaseinputthevalue:

\n");

for(i=0;i

{

printf("pArray[%d]=",i);

scanf("%d",&pArray[i]);

}

return*pArray;

}

intCompare()

{

intx,y,i;

x=y=p[0];

for(i=0;i

{

if(x>=p[i])x=p[i];

if(y<=p[i])y=p[i];

}

printf("min=%d\tmax=%d\n",x,y);

return0;

}

intOutput_data()

{

p=pArray;

printf("beforeofpaixu:

\n");

for(i=0;i

{

printf("%d\t",*pArray);

pArray++;

}

printf("\n");

return*pArray;

}

voidpaixu()

{

intx=0;

inti,j;

printf("laterofpaixu:

\n");

for(i=0;i

{

for(j=i+1;j

{

if(p[i]>=p[j])

{

x=p[i];p[i]=p[j];p[j]=x;

}

}

printf("%d\t",p[i]);

}

printf("\n");

}

voidmain()

{

clrscr();

input_size();

malloc_size();

input_data();

Output_data();

Compare();

paixu();

}

实验结果:

实验二线性表及其基本操作实验(2学时)

实验目的:

(1)熟练掌握线性表ADT和相关算法描述、基本程序实现结构;

(2)以线性表的基本操作为基础实现相应的程序;

(3)掌握线性表的顺序存储结构和动态存储结构之区分。

实验内容:

(类C算法的程序实现,任选其一。

具体要求参见教学实验大纲)

(1)一元多项式运算的C语言程序实现(加法必做,其它选做);

(2)有序表的合并;

(3)集合的并、交、补运算;

实验准备:

1)计算机设备;2)程序调试环境的准备,如TC环境;3)实验内容的算法分析与代码设计与分析准备。

实验步骤:

1.录入程序代码并进行调试和算法分析;

2.编写实验报告。

实验结果:

//线性链表

#include"malloc.h"

#include"stdio.h"

#defineM6

typedefstructnode

{

intdata;

structnode*next;

}*Sqlist;

voidInitlialize(Sqlist&L)

{

L=(Sqlist)malloc(sizeof(Sqlist));

L->next=NULL;

}

intGetlength(SqlistL)

{

inti=0;

Sqlistp=L->next;

while(p!

=NULL)

{

i++;p=p->next;

}

returni;

}

intGetelem(SqlistL,inti)

{

intj=1,e;

Sqlistp=L->next;

while(j

{

p=p->next;j++;

}

e=p->data;

printf("第%d个元素是:

%d\n",i,e);

return1;

}

intLocatelem(SqlistL,intx)

{

inti=0;

Sqlistp=L->next;

while(p!

=NULL&&p->data!

=x)

{

p=p->next;i++;

}

if(p==NULL)

return0;

else

{

printf("%d是第%d个元素\n",x,i);

returni;

}

}

voidCreatlistF(Sqlist&L,inta[],intn)//头插法

{

//从一个空表开始,读取字符数组a中字符生成新结点,将读取数据存放到新结点数据域,

//再将新结点插入当前链表表头、直至结束

Sqlists;

inti;

L=(Sqlist)malloc(sizeof(Sqlist));

L->next=NULL;

for(i=0;i

{

s=(Sqlist)malloc(sizeof(Sqlist));

s->data=a[i];s->next=L->next;

L->next=s;

}

}

voidCreatlistR(Sqlist&L,inta[],intn)//尾插法

{

//将新结点插到当前链表表尾,为此必须新增一个尾指针r,使其始终指向当前链表的尾结点

Sqlists,r;

inti;

L=(Sqlist)malloc(sizeof(Sqlist));

L->next=NULL;

r=L;

for(i=0;i

{

s=(Sqlist)malloc(sizeof(Sqlist));

s->data=a[i];s->next=NULL;

r->next=s;r=s;

}

}

intInselem(Sqlist&L,inti,intx)

{

//1、将所建新结点s的next域指向p的下一结点:

s->next=p->next

//2、将结点p的next域指向新结点s:

p->next=s

intj=1;

Sqlists,p=L->next;

s=(Sqlist)malloc(sizeof(Sqlist));

s->data=x;s->next=NULL;

if(i<1||i>Getlength(L))

return0;

while(j

{

p=p->next;j++;

}

printf("在第%d个位置插入数据:

%d\n",i,x);

s->next=p->next;p->next=s;

return1;

}

intDelelem(Sqlist&L,inti)

{

intj=1;

Sqlistp,q;

p=L;

if(i<1||i>Getlength(L))

return0;

while(j

{

p=p->next;j++;

}

q=p->next;

p->next=q->next;

free(q);

return1;

}

voidDisplist(SqlistL)

{

Sqlistp=L->next;

while(p!

=NULL)

{

printf("%d\t",p->data);

p=p->next;

}

printf(“\n”);

}

voidinput(int*pArray,intn)

{

printf("请输入数组数据(共含%d个元):

\n",n);

for(inti=0;i

Scanf(“%d”,&pArray[i]);

intmain(intargc,char*argv[])

{

SqlistL;

intArray[M],Select;

Initlialize(L);

do{

printf("请输入选择方法(1表示头插法,2表示尾插法,0表示结束):

\n");

scanf("%d",&Select);

switch(Select)

{

case1:

printf("按头插法建立线性表:

\n");input(Array,M);CreatlistF(L,Array,M);break;

case2:

printf("按尾插法建立线性表:

\n");input(Array,M);CreatlistR(L,Array,M);break;

}

printf("原线性表数据为:

\n");Displist(L);

Getelem(L,3);Locatelem(L,2);

Inselem(L,5,5);

printf("修改后的线性表数据为:

\n");

//Delelem(L,4);

Displist(L);

}while(Select!

=0);

return0;

}

//运行结果:

实验三栈和队列实验(6学时)

实验目的:

(1)熟练掌握栈和队列的抽象数据类型及其结构特点;

(2)实现基本的栈和队列的基本操作算法程序。

实验内容:

(类C算法的程序实现,任选其一)

(1)设计与实现基本的堆栈和队列结构下的各种操作(如堆栈的PUSH、POP等操作)(必做);

(2)以表达式计算为例,完成一个可以进行算术表达式计算功能的算法设计与实现(选做);

实验准备:

1)计算机设备;2)程序调试环境的准备,如TC环境;3)实验内容的算法分析与代码设计与分析准备。

实验步骤:

1.录入程序代码并进行调试和算法分析;2.编写实验报告。

实验结果:

(1)/*队列存储*/

#include"stdio.h"

typedefintstatus;

#defineQueueSize10

typedefstructsqqueue

{

chardata[QueueSize];

intfront,rear;

}SqQueue;

voidInitQueue(SqQueue&qu)

{

qu.front=qu.rear=0;

}

statusEnQueue(SqQueue&qu,charx)

{

if((qu.rear+1)%QueueSize==qu.front)

return0;

qu.rear=(qu.rear+1)%QueueSize;

qu.data[qu.rear]=x;

return1;

}

statusDeQueue(SqQueue&qu,char&x)

{

if(qu.rear==qu.front)

return0;

qu.front=(qu.front+1)%QueueSize;

x=qu.data[qu.front];

return1;

}

statusGetHead(SqQueuequ,char&x)

{

if(qu.rear==qu.front)

return0;

x=qu.data[(qu.front+1)%QueueSize];

return1;

}

statusQueueEmpty(SqQueuequ)

{

if(qu.rear==qu.front)

return1;

else

return0;

}

voidmain()

{

SqQueuequ;

chare;

InitQueue(qu);

printf("Queue%s\n",(QueueEmpty(qu)==1?

"Empty":

"NotEmpty"));

printf("insera\n");EnQueue(qu,'a');

printf("inserb\n");EnQueue(qu,'b');

printf("inserc\n");EnQueue(qu,'c');

printf("inserd\n");EnQueue(qu,'d');

printf("Queue%s\n",(QueueEmpty(qu)==1?

"Empty":

"NotEmpty"));

GetHead(qu,e);

printf("Queueoftopelemis:

%c\n",e);

printf("showofQueue:

\n");

while(!

QueueEmpty(qu))

{

DeQueue(qu,e);

printf("%c\t",e);

}

printf("\n");

}

实验结果:

(2)/*用栈实现对表达式的求值运算*/

#include"stdio.h"

#include"malloc.h"

#include"stdlib.h"/*数据类型转换库函数*/

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineINFEASIBLE-1

#defineOVERFLOW-2

#defineSTACK_INIT_SIZE100/*初始分配量*/

#defineSTACKINCREMENT10/*存储空间的分配增量*/

typedefintStatus;

typedefcharElemType;

typedefElemTypeOperandType;/*操作数*/

typedefcharOperatorType;

typedefstruct

{

ElemType*base;

ElemType*top;

intstacksize;

}SqStack;

StatusInitStack(SqStack&S)

{

/*构造一个空栈S*/

S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));

if(!

S.base)exit(OVERFLOW);/*存储空间失败*/

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

returnOK;

}/*InitStack*/

StatusGetTop(SqStackS)

{

/*若栈不空,则用e返回S的栈顶元素*/

ElemTypee;

if(S.top==S.base)returnERROR;

e=*(S.top-1);

returne;

}/*GetTop*/

StatusPush(SqStack&S,ElemTypee)/*插入元素e为新的栈顶元素*/

{

if(S.top-S.base>=S.stacksize)

{

/*栈满,追加存储空间*/

S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));

if(!

S.base)exit(OVERFLOW);/*存储空间失败*/

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

}

*S.top++=e;

returnOK;

}/*Push*/

StatusPop(SqStack&S,ElemType&e)/*取栈顶元素,用e返回*/

{

/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/

if(S.top==S.base)returnERROR;

e=*--S.top;

returnOK;

}/*Pop*/

charIn(charc,charOP[])/*判断字符c是否属于运算符*/

{

if(c>=35&&c<=47)

return1;

/*常见操作符(如:

'#'、'('、')'、'+'、'-'、'*'、'\'等)的ASCII码在35到47之间*/

elsereturn0;

}

charOP[8]={'+','-','*','/','(',')','#','\0'};/*定义有所要用到的操作符构成的数组OP[8]*/

intm[7][7]={1,1,2,2,2,1,1,

1,1,2,2,2,1,1,

1,1,1,1,2,1,1,

1,1,1,1,2,1,1,

2,2,2,2,2,0,-1,

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

2,2,2,2,2,-1,0};

/*各运算符间优先级别的关系*/

/*以上:

1表示‘>’;2表示‘<’;0表示‘=’;-1表示‘不存在’*/

charPrecede(chari,charj)/*比较数组OP[]中字符i与数组OP中字符j的优先权*/

{

inta,b;char*p;

for(p=OP,a=0;*p!

='\0';p++,a++)

if(*p==i)break;

for(p=OP,b=0;*p!

='\0';p++,b++)

if(*p==j)break;

if(m[a][b]==1)return'>';

elseif(m[a][b]==2)return'<';

elseif(m[a][b]==0)return'=';

elsereturn'O';

}

charOperate(chara,chartheta,charb)/*对运算数a、b按操作符theta进行二元运算*/

{

if(a>47)a=atoi(&a);/*将字符数转化为整型数*/

if(b>47)b=atoi(&b);

switch(theta)

{

case'+':

returna+b;

break;

case'-':

returna-b;

break;

case'*':

returna*b;

break;

case'/':

returna/b;

break;

}

return'1';

}

OperandTypeEvaluateExpression()/*算术表达式求值的算符优先算法*/

{

SqStackOPTR,OPND;/*设OPTR、OPND分别运算符栈和运算数栈*/

OperandTypea,b,c;OperatorTypetheta;

InitStack(OPTR);Push(OPTR,'#');

InitStack(OPND);c=getchar();

while(c!

='#'||GetTop(OPTR)!

='#')

{

if(!

In(c,OP)){Push(OPND,c);c=getchar();}

else

switch(Precede(GetTop(OPTR),c))

{

case'<':

Push(OPTR,c);c=getchar();

break;

case'=':

Pop(OPTR,c);c=getchar();

break;

case'>':

Pop(OPTR,theta);Pop(OPND,b);Pop(OPND,a);

Push(OPND,Operate(a,theta,b));

break;

}

}

returnGetTop(OPND);

}

intmain()

{

printf("(请输入运算表达式:

以#为结束符)\n");

inta;

a=(int)EvaluateExpression();

/*执行函数EvaluateExpression(),将表达式的最终值强制转换为整型,并用a返回*/

printf("%d",a);

getchar();

return0;

}

测试结果为:

①表达式中包含+、-、*的情况;

②表达式中包含()、+、-、*的情况;

③表达式中包含()、+、-、*、/的情况;

④表达式中出现负数的情况;

实验四字符串实验(2学时)

实验

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2