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