数据结构课程设计报告实验报告doc.docx
《数据结构课程设计报告实验报告doc.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告实验报告doc.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告实验报告doc
《数据结构》课程实验报告
专业:
指导老师:
班级:
:
学号:
完成日期:
一、实验目的
1、掌握线性表的顺序存储结构和链式存储结构;
2、熟练掌握顺序表和链表基本算法的实现;
3、掌握利用线性表数据结构解决实际问题的方法和基本技巧;
4、按照实验题目要求独立正确地完成实验容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果);
5、按时提交实验报告。
二、实验环境
计算机、C语言程序设计环境
三、实验学时
2学时,选做实验。
四、实验容
一、顺序表的基本操作实现实验
要求:
数据元素类型ElemType取整型int。
按照顺序存储结构实现如下算法(各算法边界条件和返回结果适当给出):
1创建任意整数线性表(即线性表的元素值随机在键盘上输入),长度限定在20之;
2打印(遍历)该线性表(依次打印出表中元素值);
3在线性表中查找第i个元素,并返回其值;
4在线性表中第i个元素之前插入一已知元素;
5在线性表中删除第i个元素;
6求线性表中所有元素值(整数)之和;
二、链表(带头结点)基本操作实验
要求:
数据元素类型ElemType取字符型char。
按照动态单循环链表结构实现如下算法(各算法边界条件适当给出):
1创建任意字符型有序(递增排序)单循环链表(即链表的字符元素随机在键盘上输入),长度限定在15之;
2打印(遍历)该链表(依次打印出表中元素值);
3在链表中查找第i个元素,i合法返回元素值,否则,返回FALSE;
4在链表中查找与一已知字符相同的第一个结点,有则返回TRUE,否则,返回FALSE;
5在链表中按照有序方式插入一已知字符元素;
6在线性表中删除第i个结点;
7计算链表的长度。
五、实验容一步骤:
#include
#include
#defineMAX20
typedefintElemType;
typedefstruct
{
ElemTypeelem[MAX];
intlast;
}SeqList;
voidInitList(SeqList*L)
{
L->last=-1;
}
voidPrintList(SeqList*L)
{
inti;
printf("\n现在的数据为:
");
for(i=0;i<=L->last;i++)
printf("%d",L->elem[i]);
}
voidCreatList(SeqList*L)
{
ElemTypee;
inti=0;
printf("\n输入数据(-1退出):
");
scanf("%d",&e);
while(e!
=-1)
{
if(i{
L->elem[i]=e;
L->last=i;
i++;
}
else
{
printf("\n表满!
");
}
scanf("%d",&e);
}
}
voidLocate(SeqList*L,inti,ElemTypee)
{
i=0;
while((i<=L->last)&&(L->elem[i]!
=e))
i++;
if(i<=L->last)
printf("\n%d在顺序表中第%d个位置上。
",e,i+1);
else
printf("\n没有此数!
");
}
voidInsList(SeqList*L,inti,ElemTypee)
{
intk;
if(i<1||i>L->last+2)
{
printf("\n插入位置i值不合法");
}
elseif(L->last>=MAX-1)
printf("\n表已满无法插入");
else
{
for(k=L->last;k>=i-1;k--)
L->elem[k+1]=L->elem[k];
L->elem[i-1]=e;
L->last++;
}
PrintList(L);
}
voidDelList(SeqList*L,inti,ElemType*e)
{
intk;
if(i<1||i>L->last+1)
{
printf("\n删除位置不合法!
");
}
else
{
*e=L->elem[i-1];
for(k=i;k<=L->last;k++)
L->elem[k-1]=L->elem[k];
L->last=L->last-1;
}
PrintList(L);
}
voidSumList(SeqList*L)
{
intj,sum=0;
for(j=0;j<=L->last;j++)
{
sum=sum+L->elem[j];
}
printf("所有元素之和:
%d",sum);
}
voidmenu()
{
printf("\n************************菜单*********************");
printf("\n1.创建任意整数线性表");
printf("\n2.打印(遍历)线性表");
printf("\n3.查找元素");
printf("\n4.插入元素");
printf("\n5.删除元素");
printf("\n6.所有元素之和");
printf("\n7.退出");
printf("\n***********************************************");
}
voidmain()
{
inti;
intflag=0;
ElemTypee;
SeqList*L;
L=(SeqList*)malloc(sizeof(SeqList));
InitList(L);
menu();
while(!
flag)
{
printf("\n\n请输入你的选择:
");
scanf("%d",&i);
switch(i)
{
case1:
CreatList(L);
break;
case2:
PrintList(L);
break;
case3:
printf("输入要查找的数值:
");
scanf("%d",&e);
Locate(L,i,e);
break;
case4:
printf("输入插入位置和数据值(ab):
");
scanf("%d%d",&i,&e);
InsList(L,i,e);
break;
case5:
printf("输入要删除元素的位置:
");
scanf("%d",&i);
DelList(L,i,&e);
break;
case6:
SumList(L);
break;
case7:
flag=1;
break;
}
}
}
六、实验容一测试数据与实验结果:
七、实验容二步骤:
#include
#include
#defineMAX15
#defineTURE1
#defineFALSE0
typedefcharElemType;
typedefstructNode
{
chardate;
structNode*next;
}Node,*LinkList;
voidInitList(LinkList*L)
{
*L=(LinkList)malloc(sizeof(char));
(*L)->next=NULL;
}
voidPrintfLink(LinkListL)
{
LinkListp;
p=L->next;
printf("链表为:
");
while(p!
=NULL)
{
printf("%c",p->date);
p=p->next;
}
}
voidCreate(LinkListL)
{
LinkLists,r;
charc;
intflag=1;
intn;
r=L;
printf("元素个数:
");
scanf("%d",&n);
if(n>MAX)
printf("超出限定长度!
");
else
{
printf("输入字符(以#键结束):
");
while(flag)
{
scanf("%c",&c);
if(c!
='#')
{
s=(Node*)malloc(sizeof(char));
s->date=c;
r->next=s;
r=s;
}
else
flag=0;
r->next=NULL;
}
}
}
voidOrder(LinkListL)
{
charc;
Node*r,*q,*p;
for(r=L->next;r->next!
=NULL;r=r->next)
{
p=r;
for(q=r->next;q;q=q->next)
if((q->date)<(p->date))
p=q;
if(p!
=r)
{
c=r->date;
r->date=p->date;
p->date=c;
}
}PrintfLink(L);
}
voidGet(LinkListL,inti,ElemType*e)
{
intj;Node*p;
p=L;j=-1;
while((p->next!
=NULL)&&(j
{
p=p->next;
j++;
}
*e=p->date;
if(i==j)
printf("第%d个元素为:
%c",i,*e);
else
printf("FALSE");
}
voidLocate(LinkListL,ElemTypee)
{
inti=1;
LinkListp;
p=L->next;
while(p&&p->date!
=e)
{
i=i++;
p=p->next;
}
if(!
p)
printf("FALSE\n");
else
{
printf("TRUE\n");
printf("该元素在第%d个位置!
",i-1);
}
}
voidInsList(LinkListL,inti,ElemTypee)
{
Node*p,*s;
intk=0;
p=L;
while(p!
=NULL&&k{
p=p->next;
k=k++;
}
if(!
p)
{
printf("插入位置不合理!
");
}
s=(Node*)malloc(sizeof(char));
s->date=e;
s->next=p->next;
p->next=s;
Order(L);
}
voidDelList(LinkListL,inti,ElemType*e)
{
Node*p,*r;
intj;
j=0;
p=L;
while((p->next!
=NULL)&&(j{
p=p->next;
j++;
}
if(p->next!
=NULL)
{
p->next=p->next->next;
r=p->next;
*e=r->date;
printf("删除第%d个元素:
%c\n",i,*e);
}
else
printf("删除结点的位置i不合理!
");
}
voidListLength(LinkListL)
{
Node*p;intj=0;
p=L->next;
while(p!
=NULL)
{
p=p->next;
j++;
}
printf("单链表的长度:
%d",j);
}
voidmenu()
{
printf("\n************************菜单*********************");
printf("\n1.创建任意字符型单循环链表");
printf("\n2.打印(遍历)该链表");
printf("\n3.查找第i个元素");
printf("\n4.查找与一已知字符相同的元素");
printf("\n5.插入元素");
printf("\n6.删除第i个结点");
printf("\n7.计算链表的长度");
printf("\n8.退出");
printf("\n***********************************************");
}
voidmain()
{
inti;
intflag=0;
ElemTypee;
LinkListL;
L=(LinkList)malloc(sizeof(char));
InitList(&L);
menu();
while(!
flag)
{
printf("\n\n请输入你的选择(1~8):
");
scanf("%d",&i);
switch(i)
{
case1:
Create(L);
break;
case2:
Order(L);
break;
case3:
printf("输入要查找的第i个元素:
");
scanf("%d",&i);
Get(L,i,&e);
break;
case4:
printf("输入查找的元素:
");
rewind(stdin);
scanf("%c",&e);
Locate(L,e);
break;
case5:
printf("输入插入的元素:
");
rewind(stdin);
scanf("%c",&e);
InsList(L,i,e);
break;
case6:
printf("输入要删除第几个结点:
");
scanf("%d",&i);
DelList(L,i,&e);
break;
case7:
ListLength(L);
break;
case8:
flag=1;
break;
}
}
}
八、实验容二测试数据与实验结果: