数据结构 实验报告 全.docx
《数据结构 实验报告 全.docx》由会员分享,可在线阅读,更多相关《数据结构 实验报告 全.docx(13页珍藏版)》请在冰豆网上搜索。
![数据结构 实验报告 全.docx](https://file1.bdocx.com/fileroot1/2022-11/28/35583e94-e0bd-4ef6-b47b-01d1edcee092/35583e94-e0bd-4ef6-b47b-01d1edcee0921.gif)
数据结构实验报告全
河南省高等教育自学考试
实验报告册
计算机及应用专业(本科段)
《数据结构》
姓名准考证号所属地市
实验地点实验日期
实验总成绩指导教师签名
实验单位(实验室)意见:
主考院校审核意见:
河南科技大学自学考试办公室
二零一零年三月
实验一单链表的操作
【需求分析】
掌握线性表在链式存储结构下各种算法的实现。
●功能
1.建立一个数据域存放的是字符串的单链表;
2.输入一个指定的字符串,插入到单链表的指定位置;
3.删除单链表中指定的字符串;
4.遍历单链表。
●输入要求
输入n个字符串(长度小于6),建立含有n个结点的单链表,要求输入的字符串不重复。
●测试数据
建立时:
n=5
redgreenyellowblueblack
插入时:
orange(在第5个结点之后插入)
删除时:
blue
【概要设计】
1.设定结点的类型定义:
typedefstructnode{
chardata[8];
structnode*next;
}Listnode;
2.设定头指针变量:
Listnode*head;
3.本程序包括六个函数:
1main()
设计用户界面和菜单,并调用其它五个函数。
2Listnode*CreateL()
输入N个字符串,动态建立一个带头结点的单链表,并返回头结点的地址指针。
3voidTravelL(Listnode*head)
遍历带头结点的单链表,输出每个结点的值。
4Listnode*GetNode(Listnode*head,inti)
在带头结点的单链表中查找第I个元素,若找到,则返回该结点的存储位置,即地址指针;否则返回NULL。
5voidInsertL(Listnode*head,charx[],inti)
在带头结点的单链表的第I个位置之后插入一个字符串x
6voidDeleteL(Listnode*head,inti)
删除带头结点的单链表的第I个元素的函数。
【详细设计】
/*******************LinkList******************************/
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#defineN5
typedefstructnode{
chardata[8];
structnode*next;
}Listnode;
/*******函数调用说明*******/
Listnode*CreateL();
Listnode*Getnode();
voidTraveL();
voidInsertL();
voidDeleteL();
/*******************主函数************************/
main()
{intk,j;
Listnode*head,*p;
printf(“建立单链表:
\n”);
head=CreateL();
do{
printf(”0.退出\n”);
printf("1.遍历单链表\n");
printf("2.单链表的插入\n");
printf("3.单链表的删除\n");
printf("请选择:
");
scanf(“%d”,&k);
switch(k)
{case0:
exit(0);
case1:
TravelL(head);break;
case2:
InsertL(head);break;
case3:
DeleteL(head);
}
}while
(1);
}
/*******************建立********************/
Listnode*CreateL()
{intj;
Listnode*head,*s,*r;
head=(Listnode*)malloc(sizeof(Listnode));
r=head;r->next=NULL;
printf(“\n请输入%d个字符串:
”,N);
for(j=1;j<=N;j++)
{printf(“字符串%d:
“,j);
s=(Listnode*)malloc(sizeof(Listnode));
scanf(“%s”,s->data);
r->next=s;
r=s;
}
r->next=NULL;
returnhead;
}
/*******************遍历*******************/
voidTraveL(Listnode*head)
{Listnode*p;
p=head->next;;
while(p)
{printf("%s",p->data);
p=p->next;
}
}
/********************插入******************/
voidInsertL(Listnode*head)
{charch[8];
intk;
Listnode*p,*s;
printf(“\n输入要插入的字符串:
”);
scnaf(“%s”,ch);;
printf(“\n输入要插入的位置:
”);
scanf(“%d”,&k);
p=Getnode(head,k-1);
if(p==NULL)
{printf("positionerror!
");exit(0);}
s=(Listnode*)malloc(sizeof(Listnode));
strcpy(s->data,ch);
s->next=p->next;
p->next=s;
}
/********************删除******************/
voidDeleteL(Listnode*head)
{charch[8];
Listnode*p,*q;
printf(“\n输入要删除的字符串:
”);
scnaf(“%s”,ch);;
printf(“\n查找它之前的位置:
”);
p=head;
whiel(p->next)
{q=p->next;
if(!
strcmp(q->data,ch))break;
p=q;
}
if(p->next){p->next=q->next;
free(q);
}
elseprintf(“notfound”);
}
/******************查找*****************/
Listnode*Getnode(Listnode*head,inti)
{intj;
Listnode*p;
p=head;j=0;
while(p->next&&j
{p=p->next;
j++;
}
if(i==j)
returnp;
else
returnNULL;
}
/*************************************************************/
【实验报告】
学生可以根据上述程序在机器上调试运行,并结合自己上机过程中遇到的问题和解决方法的体会,提交实验报告,并写出调试分析过程、程序使用方法和测试结果。
实验二数据结构实验二图的深度优先遍历和广度优先遍历
#include
#defineMaxVerNum50
structedgenode
{
intendver;
intinform;
edgenode*edgenext;
};
structvexnode
{
charvertex;
edgenode*edgelink;
};
structGraph
{
vexnodeadjlists[MaxVerNum];
intvexnum;
intarcnum;
};
//队列的定义及相关函数的实现
structQueueNode
{
intnData;
QueueNode*next;
};
structQueueList
{
QueueNode*front;
QueueNode*rear;
};
voidEnQueue(QueueList*Q,inte)
{
QueueNode*q=newQueueNode;
q->nData=e;
q->next=NULL;
if(Q==NULL)
return;
if(Q->rear==NULL)
Q->front=Q->rear=q;
else
{
Q->rear->next=q;
Q->rear=Q->rear->next;
}
}
voidDeQueue(QueueList*Q,int*e)
{
if(Q==NULL)
return;
if(Q->front==Q->rear)
{
*e=Q->front->nData;
Q->front=Q->rear=NULL;
}
else
{
*e=Q->front->nData;
Q->front=Q->front->next;
}
}
//创建图
voidCreatAdjList(Graph*G)
{
inti,j,k;
edgenode*p1;
edgenode*p2;
cout<<"请输入顶点数和边数:
"<cin>>G->vexnum>>G->arcnum;
cout<<"开始输入顶点表:
"<for(i=0;ivexnum;i++)
{
cin>>G->adjlists[i].vertex;
G->adjlists[i].edgelink=NULL;
}
cout<<"开始输入边表信息:
"<for(k=0;karcnum;k++)
{
cout<<"请输入边对应的顶点:
";
cin>>i>>j;
p1=newedgenode;
p1->endver=j;
p1->edgenext=G->adjlists[i].edgelink;
G->adjlists[i].edgelink=p1;
p2=newedgenode;
p2->endver=i;
p2->edgenext=G->adjlists[j].edgelink;
G->adjlists[j].edgelink=p2;
//因为是无向图,所以有两次建立边表的过程
}
}
//-------------------------------------------------------------深度优先遍历
voidDFS(Graph*G,inti,intvisit[])
{
cout<adjlists[i].vertex<<"";
visit[i]=1;
edgenode*p=newedgenode;
p=G->adjlists[i].edgelink;
if(G->adjlists[i].edgelink&&!
visit[p->endver])
{
DFS(G,p->endver,visit);
}
}
voidDFStraversal(Graph*G,charc)//深度优先遍历
{
cout<<"该图的深度优先遍历结果为:
"<intvisit[MaxVerNum];
for(inti=0;ivexnum;i++)
{
visit[i]=0;//全部初始化为0,即未访问状态
}
intm;
for(i=0;ivexnum;i++)
{
if(G->adjlists[i].vertex==c)//根据字符查找序号
{
m=i;
DFS(G,i,visit);
break;
}
}
//继续访问未被访问的结点
for(i=0;ivexnum;i++)
{
if(visit[i]==0)
DFS(G,i,visit);
}
cout<}
//-------------------------------------------------------------广度优先遍历
voidBFS(Graph*G,intv,intvisit[])
{
QueueList*Q=newQueueList;
Q->front=Q->rear=NULL;
EnQueue(Q,v);
while(Q->rear!
=NULL)
{
inte=0;
DeQueue(Q,&e);
cout<adjlists[e].vertex<<"";
visit[e]=1;
edgenode*p=newedgenode;
p=G->adjlists[e].edgelink;
if(p)
{
intm=p->endver;
if(m==0)
{
EnQueue(Q,m);
while(visit[m]==0)
{
p=p->edgenext;
if(p==NULL)
break;
m=p->endver;
EnQueue(Q,m);
}
}
}
}
}
voidBFStraversal(Graph*G,charc)
{
cout<<"该图的广度优先遍历结果为:
"<intvisited[MaxVerNum];
for(inti=0;ivexnum;i++)
{
visited[i]=0;
}
intm;
for(i=0;ivexnum;i++)
{
if(G->adjlists[i].vertex==c)
{
m=i;
BFS(G,i,visited);
break;
}
}
//继续访问未被访问的结点
for(i=0;ivexnum;i++)
{
if(visited[i]==0)
BFS(G,i,visited);
}
cout<}
voidmain()
{
Graph*G=newGraph;
CreatAdjList(G);
charch;
cout<<"请输入开始遍历的顶点:
";
cin>>ch;
DFStraversal(G,ch);
BFStraversal(G,ch);
}