当前位置:文档之家› 数据结构实验文档)

数据结构实验文档)

printf("输入源点v1 : ");
scanf("%d",&v1); /*输入源点V1 */
for(i=1;i<=vexnum;i++)
{
dist[i]=cost[v1][i];/*初始时,从源点V1到各顶点的最短路径为相应弧上的权*/
s[i]=0;/*初始化*/
if(cost[v1][i]<9999)
printf("\n请输入顶点数和边数(输入格式为:顶点数,边数):");
scanf("%d,%d",&vexnum,&arcnum);
for(i=1;i<=vexnum;i++)
for(j=1;j<=vexnum;j++)
cost[i][j]=9999; /*设9999代表无限大*/
for(k=1;k<=arcnum;k++)
{
printf("%d-->",p->data);
p=p->next;
}
}
思考与提高:
链栈只有一个top指针,对于链队列,为什么要设计一个头指针和一个尾指针?
实验四树及二叉树
实验目的:
1.通过实验,掌握二叉树的建立与存储
2.通过实验,掌握二叉树的遍历方法
实验内容:
1.练习二叉树的建立与存储
2.练习二叉树的遍历
{
dist[v]=dist[w]+cost[w][v]; /*修改V-S集合中各顶点的最短路径长度*/
path[v]=w; /*修改V-S集合中各ຫໍສະໝຸດ 点的最短路径*/}}
printf("源点1到其他各顶点的路径与值:\n",v1);
for(i=2;i<=vexnum;i++) /*输出从某源点到其他各顶点的最短路径*/
}
}
思考与提高:
1.判断两点是否可达。
3.练习图的拓扑排序
实验六查找
实验目的:
1.掌握查找的不同方法,并能用高级语言实现查找算法;
2.熟练掌握二叉排序树的构造和查找方法。
3.了解静态查找表及哈希表查找方法。
实验内容:
设计一个算法读入一串整数,然后构造二叉排序树,进行查找。
实验步骤:
1.从空的二叉树开始,每输入一个结点数据,就建立一个新结点插入到当前已生成的二叉排序树中。
实验一线性表
实验目的:
1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。
2.掌握线性表的顺序存储结构的定义及C语言实现。
3.掌握线性表的链式存储结构——单链表的定义及C语言实现。
4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。
5.掌握线性表在链式存储结构——单链表中的各种基本操作。
实验内容:
path[i]=v1;/*初始化,path记录当前最短路径,即顶点的直接前趋*/
}
s[v1]=1; /*将源点加入S集合中*/
for(i=1;i<=vexnum;i++)
{
min=9999; /*本例设各边上的权值均小于9999*/
for(j=1;j<=vexnum;j++) /*从S集合外找出距离源点最近的顶点w*/
{
p=q->front->next;
q->front->next=p->next;
if(p->next==NULL)
q->rear=q->front;
x=p->data;
free(p);/*释放空间*/
}
/*遍历链队列函数*/
void display(Lqueue *q)
{ while(p!=NULL) /*利用条件判断是否到队尾*/
1.定义结点结构,定义图结构。
2.存储图信息;
3.定义求某顶点到其他所有顶点最短路径的函数;
4.写出主函数。
实现提示:
int creatcost(int cost[][MAX_VEX]) /*建立图的邻接矩阵,cost数组表示图的邻接矩阵*/
{
int vexnum,arcnum,i,j,k,v1,v2,w; /*输入图的顶点数和弧数(或边数)*/
t->lchild=CreateBinTree();//建左子树
t->rchild=CreateBinTree();//建右子树
}
return t;
}
思考与提高:
1.如何用孩子兄弟表示法存储树?
2.熟悉并掌握哈夫曼树及其应用。
实验五图
实验目的:
1.掌握图的基本存储方法;
2.掌握有关图的操作算法并用高级语言实现;
实验步骤:
1.建立自己的头文件BinTree.h,内容包括二叉链表的结构描述、二叉树的建立、二叉树的先序、中序与后序遍历算法。
2.建立二叉树,并通过调用函数,输出先序遍历、中序遍历与后序遍历的结果。
实现提示:
建立二叉树的代码如下:
BinTNode *CreateBinTree() //输入二叉树的先序遍历序列,创建二叉链表
1.顺序线性表的建立、插入及删除。
2.链式线性表的建立、插入及删除。
实验步骤:
1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。
2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。
3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。
{
elemtype vec[MAXSIZE];
int len; /*顺序表的长度*/
}sequenlist;
将此结构定义放在一个头文件sqlist.h里,可避免在后面的参考程序中代码重复书写,另外在该头文件里给出顺序表的建立及常量的定义。
2.注意如何取到第i个元素,在插入过程中注意溢出情况以及数组的下标与位序(顺序表中元素的次序)的区别。
if(s[i]==1)
{
w=i;
while(w!=v1)
{
printf("%d<--",w);
w=path[w];/*通过找到前驱顶点,反向输出最短路径*/
}
printf("%d",w);
printf(" %d\n",dist[i]);
}
else
{
printf("%d<--%d",i,v1);
printf(" 9999\n"); /*不存在路径时,路径长度设为9999*/
void creat(Lqueue *q)
{
h=(Qnodetype*)malloc(sizeof(Qnodetype)); /*初始化申请空间*/
h->next=NULL;
q->front=h;
q->rear=h;
for(i=1;i<=n;i++)/*利用循环快速输入数据*/
{
scanf("%d",&x);
3.单链表的结点结构除数据域外,还含有一个指针域。用C语言描述结点结构如下:
typedef int elemtype;
typedef struct node
{
elemtype data; //数据域
struct node *next; //指针域
}linklist;
注意结点的建立方法及构造新结点时指针的变化。构造一个结点需用到C语言的标准函数malloc(),如给指针变量p分配一个结点的地址:
实现提示:
/*定义链队列*/
typedef struct Qnode
{
Datatypedata;
struct Qnode *next;
}Qnodetype;
typedef struct
{ Qnodetype *front;
Qnodetype *rear;
}Lqueue;
/*初始化并建立链队列函数*/
p=(linklist *)malloc(sizeof(linklist));该语句的功能是申请分配一个类型为linklist的结点的地址空间,并将首地址存入指针变量p中。当结点不需要时可以用标准函数free(p)释放结点存储空间,这时p为空值(NULL)。
思考与提高:
1.如果按由表尾至表头的次序输入数据元素,应如何建立顺序表。
{
BinTNode *t;
char ch;
ch=getchar();
if (ch=='0') //如果读入0,创建空树
t=NULL;
else
{
t=(BinTNode *)malloc(sizeof(BinTNode));//申请根结点*t空间
t->data=ch; //将结点数据ch放入跟结点的数据域
3.熟练掌握图的两种搜索路径的遍历方法。
实验内容:
假设以一个带权有向图表示某一区域的公交线路网,图中顶点代表一些区域中的重要场所,弧代表已有的公交线路,弧上的权表示该线路上的票价(或搭乘所需时间),试设计一个简易交通指南系统,指导前来咨询者以最低的票价或最少的时间从区域中的某一场所到达另一场所。
实验步骤:
2.在main函数里如果去掉L=&a语句,会出现什么结果?
实验二栈
实验目的:
掌握栈的顺序表示和实现
实验内容:
编写一个程序实现顺序栈的各种基本运算。
实验步骤:
相关主题