C语言数据结构实验报告.docx

上传人:b****4 文档编号:5465684 上传时间:2022-12-16 格式:DOCX 页数:49 大小:703.87KB
下载 相关 举报
C语言数据结构实验报告.docx_第1页
第1页 / 共49页
C语言数据结构实验报告.docx_第2页
第2页 / 共49页
C语言数据结构实验报告.docx_第3页
第3页 / 共49页
C语言数据结构实验报告.docx_第4页
第4页 / 共49页
C语言数据结构实验报告.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

C语言数据结构实验报告.docx

《C语言数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《C语言数据结构实验报告.docx(49页珍藏版)》请在冰豆网上搜索。

C语言数据结构实验报告.docx

C语言数据结构实验报告

 

江西科技师范学院

实验报告

 

课程:

数据结构

 

系别:

数计学院

 

班级:

09计算机

(1)班

 

学号:

张抗

 

姓名:

20091592

 

 

 

 

一实验目的

二实验原理

三实验设备

里面所有的实验的代码都在VC++上调试通过,可以直接复制运行。

我的QQ是:

691386092。

有其它问题的或者想要实验的代码的可以联系我。

四实验内容

五实验代码

六实验结果

 

1.实验一:

C语言编程

2.实验二:

顺序存储

3.实验三:

链式存储

4.实验四:

模式匹配算法运用

5.实验五:

特殊矩阵

6.实验六:

内排序

7.实验七:

内排序

8.实验八:

图的遍历

9.实验九:

检索

10.

11.

12.

13.

14.

15.

 

 

每次实验课必须带上此本子,以便教师检查预习情况和记录实验原始数据。

实验时必须遵守实验规则。

用正确的理论指导实践必须人人亲自动手实验,但反

对盲目乱动,更不能无故损坏设备。

这是一份重要的不可多得的自我学习资料,它将记录着你在大学生涯中的学习和学

习成果。

请你保留下来,若干年后再翻阅仍将感到十分新鲜,记忆犹新。

它将推动你在

人生奋斗的道路上永往直前!

 

实验一C语言编程

实验名称:

实验一C语言编程

实验目的:

复习C语言程序设计,回顾C语言结构数据及指针数据的应用。

实验原理:

C语言结构化程序设计思想,结构数据类型,指针数据类型。

实验设备:

电脑,TURBOC2.0/WIN-TC/VISUALC++

实验内容:

求两个复数相加之和。

实验代码:

#include

structcomp//定义复数的类型结构

{floatx;

floaty;

};

structcompa,b,sum,jian1,mul1;

intz;

voidmain()

{voidcreat(structcomp*c);//声明所用到的函数

voidoutput(structcompa);

structcompadd(structcompk,structcomph);

structcompjian(structcompk,structcomph);

structcompmul(structcompk,structcomph);

creat(&a);output(a);

creat(&b);output(a);

sum=add(a,b);

printf("sum=");

output(sum);

jian1=jian(a,b);

printf("jian=");

output(jian1);

mul1=mul(a,b);

printf("mul=");

output(mul1);

getch();

}

voidcreat(structcomp*c)//输入

{floatc1,c2;

printf("pleaseentertherecord:

");scanf("%f",&c1);

printf("pleaseentertheimage:

");scanf("%f",&c2);

c->x=c1;c->y=c2;

}

voidoutput(structcompa)//输出

{printf("%f+%fi\n\n",a.x,a.y);

}

structcompadd(structcompk,structcomph)//相加

{structcompc;

c.x=k.x+h.x;

c.y=k.y+h.y;

return(c);

}

structcompjian(structcompk,structcomph)//相减

{structcompc;

c.x=k.x-h.x;

c.y=k.y-h.y;

return(c);

}

structcompmul(structcompk,structcomph)//相乘

{structcompc;

c.x=k.x*h.x-k.y*h.y;

c.y=h.x*k.y+k.x*h.y;

return(c);

}

实验结果:

实验心得:

计算机事实上只能完成较简单的运算,不能完成较复杂的运算。

但人们往往根据一些基本的法则和定理,通过转化,可以通过这些基本的加减乘除运算完成复杂的科学计算。

这就像本实验,通过简单的加法和乘法对复数的实部和虚部分别计算,然后用特殊的方法将结果表示出来,完成了两个复数的各种运算。

使会用者感觉就好像是直接进行了复数的运算。

实验二顺序存储

实验名称:

实验二顺序存储

实验目的:

掌握线性表顺序存储结构的描述,学会针对顺序存储线性表的基本操作。

实验原理:

C语言结构化程序设计思想,结构体及数组的应用。

实验设备:

电脑,TURBOC2.0/WIN-TC/VISUALC++

实验内容:

线性表的顺序存储表示及基本操作。

实验代码:

#include

#include

#defineMAXSIZE20

typedefintElemType;//定义所需的类型

typedefstruct

{ElemTypea[MAXSIZE];

intlength;

}SqList;

SqLista,b,c;//定义所需的类型并声明所用到的函数

voidcreat_list(SqList*L);

voidout_list(SqListL);

voidinsert_sq(SqList*L,inti,ElemTypee);

ElemTypedelete_sq(SqList*L,inti);

intlocat_sq(SqListL,ElemTypee);

voidmain()

{inti,k,loc;ElemTypee,x;charch;//供用户选择所需的操作

do{

printf("*********************主菜单*********************");

printf("\n1.createlist");

printf("\n2.inserteattheipositionelement");

printf("\n3.deleteipositionelementandreturnit");

printf("\n4.findtheelementandreturnit");

printf("\n5.endtheprogram");

printf("\n请输入您的选择(以输入5表结束:

)");

scanf("%d",&k);

switch(k)

{

case1:

{creat_list(&a);out_list(a);

}break;

case2:

{printf("\ni,e=?

");scanf("%d,%d",&i,&e);

insert_sq(&a,i,e);out_list(a);

}break;

case3:

{printf("\npleaseenterthei:

");scanf("%d",&i);

x=delete_sq(&a,i);out_list(a);

}break;

case4:

{printf("\ne=?

");scanf("%d",&e);

loc=locat_sq(a,e);

if(loc==-1)printf("\nnotfind%d",loc);

elseprintf("havefound,positionat%d",loc);

}break;

}

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

}while(k!

=5);

printf("\nGoodBye!

!

");

printf("\nentertheenter,return\n");ch=getchar();

}

voidcreat_list(SqList*L)//生成顺序表

{inti;

printf("\npleaseenterthelength:

n=");

scanf("%d",&(L->length));

for(i=1;i<=L->length;i++)

{printf("data%d=",i);

scanf("%d",&L->a[i]);

}

}

voidout_list(SqListL)//输出所生成的顺序表

{inti;

for(i=1;i<=L.length;i++)

printf("%6d",L.a[i]);

}

voidinsert_sq(SqList*L,inti,ElemTypee)//在i位置,插入元素e

{intj;

if(L->length==MAXSIZE)printf("\nERROR!

!

!

overflow!

");

else

if(i<1||i>L->length)printf("\nerrori");

else

for(j=L->length;j>=i;j--)

L->a[j+1]=L->a[j];

L->a[i]=e;

L->length++;

}

ElemTypedelete_sq(SqList*L,inti)//删除第i个元素,并返回它的值

{ElemTypex;intj;

if(L->length==0)printf("\nERROR!

!

!

thelistisempty!

");

else

if(i>L->length)printf("\nERROR!

!

!

overflow!

");

else

for(j=i;j>=L->length;j++)

L->a[j]=L->a[j+1];

L->length--;

}

intlocat_sq(SqListL,ElemTypee)//查找值为e的元素,并返回它的位置

{inti=1;

while(i<=L.length)

if(i<=L.length)return(i);

elsereturn(-1);

}

实验结果:

实验心得:

在做插入删除等操作时要注意先后顺序,要明确是先行动在进行插入删除等操作,还是先进行插入删除等。

注意不要使元素被元素被其它元素覆盖而得不到所需的结果。

要注意增加程序的重复使用性,使程序一次就能完成各种操作,尽量使程序的使用者自己选择所需的操作。

要尽量完善自己的代码,经过不断的测试找出其中考虑不足的地方。

实验三链式存储

实验名称:

实验三链式存储

实验目的:

掌握线性表链式存储结构的描述,学会针对链式存储线性表的基本操作。

实验原理:

C语言结构化程序设计思想,结构体及指针的应用。

实验设备:

电脑,TURBOC2.0/WIN-TC/VISUALC++

实验内容:

线性表的链式存储表示及基本操作。

实验代码:

#include

#include

#defineNULL0

typedefintDataType;

typedefstructLNode/*定义结点*/

{DataTypedata;

structLNode*next;

}LNode,*LinkList;

LinkListL;

LinkListcreat_List();/*声明所用到的函数*/

voidout_List(LinkListL);

voidinsert_List(LinkListL,inti,DataTypee);

DataTypedelete_LinkList(LinkListL,inti);

intlocat_LinkList(LinkListL,DataTypee);

voidmain()

{inti,k,loc;DataTypee,x;charch;

do

{printf("*********************主菜单*********************");

printf("\n1.建立线性链表");

printf("\n2.在i位置插入元素e");

printf("\n3.删除第i个元素,返回其值");

printf("\n4.查找值为e的元素");

printf("\n5.结束程序运行");

printf("\n请输入您的选择(1,2,3,4,5)");

scanf("%d",&k);

switch(k)

{case1:

{L=creat_List();

out_List(L);

}break;

case2:

{printf("\npleaseentertheiande:

");

scanf("%d%d",&i,&e);

insert_List(L,i,e);

out_List(L);

}break;

case3:

{printf("\npleaseenterthelocationiyouwanttodelete:

i=");

scanf("%d",&i);

x=delete_LinkList(L,i-1);

if(x!

=-1)

out_List(L);

if(x!

=-1)printf("\ntheelementatthe%dlocation:

x=%d\n",i,x);

}break;

case4:

{printf("\npleaseentertheelementeyouwanttofind:

");

scanf("%d",&e);loc=locat_LinkList(L,e);

if(loc==-1)printf("\ncannotfind");

elseprintf("\nhavefound,theelementisat:

location=%d",loc);

}break;

}

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

}while(k>=1&&k<5);

printf("\nGOODBYE!

!

!

\n");

}

LinkListcreat_List()/*产生线性表*/

{LinkListhead,p,s;DataTypex;

head=(LinkList)malloc(sizeof(LNode));

head->data=0;

head->next=NULL;

p=head;

printf("pleaseenterthedata(endby-1000):

");

scanf("%d",&x);

while(x!

=-1000)

{s=(LinkList)malloc(sizeof(LNode));

s->data=x;

s->next=NULL;

p->next=s;

p=s;

printf("pleaseenterthedata(-1000toend):

");

scanf("%d",&x);

}

return(head);

}

voidout_List(LinkListL)/*输出线性表*/

{LinkListp;

p=L->next;

while(p!

=NULL)

{printf("%6d",p->data);

p=p->next;

}

}

 

voidinsert_List(LinkListL,inti,DataTypee)//在i位置插入元素e

{LinkLists,p;intj;

p=L;j=0;/*找第i-1个结点*/

while(p!

=NULL&&j

{p=p->next;j++;}

if(p==NULL||j>i-1)

printf("\niERROR!

!

");

else

{s=(LinkList)malloc(sizeof(LNode));

s->data=e;

s->next=p->next;

p->next=s;

}

}

DataTypedelete_LinkList(LinkListL,inti)//删除在i位置的元素

{LinkListp,q;intj=0;DataTypex;

p=L;

while(p!

=NULL&&j<=i-1)

{p=p->next;j++;}

if(p==NULL)

{printf("ERROR!

!

!

");

return(-1);

}

else

{q=p->next;x=q->data;

p->next=q->next;

free(q);

return(x);

}

}

intlocat_LinkList(LinkListL,DataTypee)//查找值为e的元素

{LinkListp;intj=1;

p=L->next;

while(p!

=NULL&&p->data!

=e)

{p=p->next;j=j+1;}

if(p!

=NULL)returnj;

elsereturn-1;

}

实验结果:

实验心得:

链式存储插入和删除操作比较方便,不需要大量移到数据,而不能随机的输出任一个元素,只能通过从头开始找到所需要的该元素。

但一定要注意在建立和插入时一定要先申请地址空间。

并且在删除减少元素时要记得将空间释放掉。

如果可以的话要尽量使运行界面简单,并且让使用者很容易就知道怎么用。

实验四模式匹配算法应用

实验名称:

实验四模式匹配算法应用

实验目的:

掌握字符串存储结构的描述,学会字符串的模式匹配算法的应用。

实验原理:

C语言结构化程序设计思想,结构体及指针和字符数组的应用。

实验设备:

电脑,TURBOC2.0/WIN-TC/VISUALC++

实验内容:

1、朴素模式匹配算法

2、快速模式匹配算法

实验代码:

#include

#include

#defineMAXSIZE100

intIndex_BF(charS[],charT[],intpos);

intKMP(char*Text,char*Pattern,intpos);

voidmain()

{intk,pos,n;

chars11[MAXSIZE];

chars22[MAXSIZE];

do

{

printf("*********************主菜单*********************");

printf("\n1.输入待匹配的两个字符串");

printf("\n2.模式匹配的朴素算法进行匹配");

printf("\n3.模式匹配的KMP算法进行匹配");

printf("\n4.结束程序");

printf("\n请输入您的选择(以输入10表结束:

)");

scanf("%d",&k);

switch(k)

{

case1:

{

printf("pleaseinputtheMAINLYstring:

");

scanf("%s",s11);

printf("pleaseinputtheMODEstring:

");

scanf("%s",s22);

printf("pleaseenterthepositionyouwanttostart:

");

scanf("%d",&pos);break;

}

case2:

{n=Index_BF(s11,s22,pos);

if(n!

=-1)printf("normalmode:

havefound,attheposition:

%d.",n);

elseprintf("normalmode:

haveNOTfound!

!

!

");

break;

}

case3:

{n=KMP(s11,s22,pos);

if(n!

=-1)printf("KMP:

havefound,attheposition:

%d.",n);

elseprintf("KMP:

haveNOTfound!

!

!

");

break;

}

case4:

{printf("感谢使用,GOODBYE!

!

!

\n");break;}

}

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

}while(k!

=4);

}

intIndex_BF(charS[],charT[],intpos)//模式匹配的朴素算法

{

inti=pos,j=0;

while(S[i+j]!

='\0'&&T[j]!

='\0')

if(S[i+j]==T[j])

j++;//继续比较后一字符

else

{

i++;j=0;

}

if(T[j]=='\0')

returni;//匹配成功返回下标

else

return-1;

}

voidgetNext(constchar*pattern,intnext[])//用于求next[j]的值

{

next[0]=-1;

intk=-1,j=0;

while(pattern[j]!

='\0')

{

if(

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

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1