河南自考数据结构实验报告Word格式.docx

上传人:b****6 文档编号:21684498 上传时间:2023-01-31 格式:DOCX 页数:22 大小:21.17KB
下载 相关 举报
河南自考数据结构实验报告Word格式.docx_第1页
第1页 / 共22页
河南自考数据结构实验报告Word格式.docx_第2页
第2页 / 共22页
河南自考数据结构实验报告Word格式.docx_第3页
第3页 / 共22页
河南自考数据结构实验报告Word格式.docx_第4页
第4页 / 共22页
河南自考数据结构实验报告Word格式.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

河南自考数据结构实验报告Word格式.docx

《河南自考数据结构实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《河南自考数据结构实验报告Word格式.docx(22页珍藏版)》请在冰豆网上搜索。

河南自考数据结构实验报告Word格式.docx

测试数据建立时:

N=5(red,green,yellow,blue,black)

插入时:

orange(在第五个节点之后插入)

删除时:

blue

(一)、实验目的:

(二)、程序清单

/*******************LinkList******************************/

#include"

stdio.h"

stdlib.h"

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"

);

2.单链表的插入\n"

3.单链表的删除\n"

请选择:

"

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);

next=s;

r=s;

}

returnhead;

/*******************遍历*******************/

voidTraveL(Listnode*head)

{Listnode*p;

p=head->

next;

;

while(p)

{printf("

%s"

p->

p=p->

/********************插入******************/

voidInsertL(Listnode*head)

{charch[8];

intk;

Listnode*p,*s;

printf(“\n输入要插入的字符串:

”);

scnaf(“%s”,ch);

printf(“\n输入要插入的位置:

p=Getnode(head,k-1);

if(p==NULL)

positionerror!

s=(Listnode*)malloc(sizeof(Listnode));

strcpy(s->

data,ch);

s->

next=p->

p->

/********************删除******************/

voidDeleteL(Listnode*head)

Listnode*p,*q;

printf(“\n输入要删除的字符串:

printf(“\n查找它之前的位置:

p=head;

whiel(p->

next)

{q=p->

if(!

strcmp(q->

data,ch))break;

p=q;

if(p->

next){p->

next=q->

free(q);

elseprintf(“notfound”);

/******************查找*****************/

Listnode*Getnode(Listnode*head,inti)

Listnode*p;

p=head;

j=0;

while(p->

next&

&

i)

{p=p->

j++;

if(i==j)

returnp;

else

returnNULL;

/*************************************************************/

(三)、实验中出现的问题及解决的方法

要细心查看。

实验二图的遍历操作

一、实验学时:

二、实验目的:

采用邻接矩阵存储方式的无向图的深度优先遍历和广度优先遍历算法的实现。

三、实验原理:

图的基本运算

四、实验设备:

本实验在586以上的微机上进行,运行环境为TurboC.

●建立一个顶点信息是字符的无向图;

●输出深度优先遍历的结果;

●输出广度优先遍历的结果;

先输入顶点数和边数,然后输入顶点信息以及每条边对应的两个顶点的序号。

测试数据:

68

ABCDEF

11

03

4

12

14

23

34

45

45

六、选做内容:

编写一个路径遍历算法,求出从北京到哈尔滨途中不经过郑州的所有简单路径,测试数据为教科书中图7.33,起点为北京。

七、图的遍历操作

(一)、实验目的

#include<

iostream.h>

#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;

if(Q==NULL)

return;

if(Q->

rear==NULL)

Q->

front=Q->

rear=q;

{

rear->

next=q;

rear=Q->

voidDeQueue(QueueList*Q,int*e)

if(Q==NULL)

if(Q->

front==Q->

rear)

*e=Q->

front->

nData;

rear=NULL;

//创建图

voidCreatAdjList(Graph*G)

inti,j,k;

edgenode*p1;

edgenode*p2;

cout<

<

请输入顶点数和边数:

endl;

cin>

>

G->

vexnum>

arcnum;

开始输入顶点表:

for(i=0;

i<

vexnum;

i++)

cin>

adjlists[i].vertex;

G->

adjlists[i].edgelink=NULL;

开始输入边表信息:

for(k=0;

k<

k++)

cout<

请输入边<

Vi,Vj>

对应的顶点:

i>

j;

p1=newedgenode;

p1->

endver=j;

edgenext=G->

adjlists[i].edgelink;

adjlists[i].edgelink=p1;

p2=newedgenode;

p2->

endver=i;

adjlists[j].edgelink;

adjlists[j].edgelink=p2;

//因为是无向图,所以有两次建立边表的过程

//-------------------------------------------------------------深度优先遍历

voidDFS(Graph*G,inti,intvisit[])

adjlists[i].vertex<

"

visit[i]=1;

edgenode*p=newedgenode;

p=G->

if(G->

adjlists[i].edgelink&

!

visit[p->

endver])

{

DFS(G,p->

endver,visit);

voidDFStraversal(Graph*G,charc)//深度优先遍历

该图的深度优先遍历结果为:

intvisit[MaxVerNum];

for(inti=0;

visit[i]=0;

//全部初始化为0,即未访问状态

intm;

if(G->

adjlists[i].vertex==c)//根据字符查找序号

{

m=i;

DFS(G,i,visit);

break;

}

//继续访问未被访问的结点

for(i=0;

if(visit[i]==0)

//-------------------------------------------------------------广度优先遍历

voidBFS(Graph*G,intv,intvisit[])

QueueList*Q=newQueueList;

Q->

EnQueue(Q,v);

while(Q->

rear!

=NULL)

inte=0;

DeQueue(Q,&

e);

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->

EnQueue(Q,m);

}

}

voidBFStraversal(Graph*G,charc)

该图的广度优先遍历结果为:

intvisited[MaxVerNum];

for(inti=0;

visited[i]=0;

adjlists[i].vertex==c)

BFS(G,i,visited);

if(visited[i]==0)

voidmain()

Graph*G=newGraph;

CreatAdjList(G);

charch;

请输入开始遍历的顶点:

ch;

DFStraversal(G,ch);

BFStraversal(G,ch);

(三)、实验中出现的问题及解决方法

6

实验三数据查找

二、实验目的:

掌握在线性表上进行顺序查找、二分查找的算法实现以及在二叉排序树上的查找算法的实现。

数据查找的方式。

●随机输入若干整数建立一个线性表,查找指定节点的位置;

●按升序输入若干整数建立一个有序表查找指定节点的位置;

●随机输入若干整数建立一个二叉排序树,查找指定节点的位置;

先输入表中结点的个数N,然后输入N整数。

(略)

六、数据查找

掌握在线性表上进行顺序查找、二分查找的算法实现以及在二叉排序树上的查找算法的实现。

intTSearch(SSTableST,intkey){

//在有序表ST中折半查找其关键字等于key的数据元素。

//若找到,则函数值为该元素在表中的位置,否则为0。

intlow,high,mid;

low=1;

high=ST.length;

//置区间初值

while(low<

=high){

mid=(low+high)/2;

if(key==ST.elem[mid].key)returnmid;

//找到待查元素

elseif(key<

ST.elem[mid].key)high=mid-1;

//key小于mid所对应的k值时

//继续在前半区间进行查找

elselow=mid+1;

//继续在后半区间进行查找

}return0;

//顺序表中不存在待查元素

}//Search_Bin

voidmain()

{SSTableT;

intkey,i=1;

intpostion;

intn=1;

//记录输入的关键字个数

printf("

如果不想输入,则输入0,当此数的位置为0时,查找不到该数。

\n"

请输入第%d个数:

n);

scanf("

%d"

&

key);

while(key!

=0)

{n++;

T.elem[i++].key=key;

请输入第%d个数,大于%d\n"

n,T.elem[i-1].key);

T.length=i;

}printf("

请输入要查的数:

postion=Search_Bin(T,key);

此数的位置是:

%d\n"

postion);

(三)、实验中出现的问题及解决方法:

随机输入若干整数建立一个二叉排序树,查找指定节点的位置。

二叉树查找代码容易出错。

实验四排序

掌握对一批记录进行排序的各种算法,包括直接插入排序法、冒泡排序法、直接选择排序法和快速排序法。

排序的方式。

●随机输入若干整数,按直接插入排序法排序并输出;

●输入若干整数,按冒泡排序法排序并输出;

●随机输入若干整数,按直接选择排序法排序并输出;

任意输入N整数。

六、选做题目:

对快速排序、希尔排序、堆排序进行比较。

掌握对一批记录进行排序的各种算法,包括直接插入排序法、冒泡排序法、直接选择排序法和快速排序法。

stdio.h>

stdlib.h>

time.h>

#defineM20

/*****把排序之前的数输入到指定文件夹中*****/

Voidwritefile1(int*a,intn)

{FILE*fp;

inti;

charfilename[10];

请输入要输出的文件名称(包括后缀名):

gets(filename);

if((fp=fopen(filename,"

w"

))==NULL)

fprintf("

不能打开文件!

排序之前:

*****\n"

for(i=1;

=n;

%3d"

a[i]);

/*****把用各种排序方法排序后的数输入到指定文件夹中*****/

voidwritefile2(int*a,intn)

{FILE*fp;

排序之后:

a[0]=-1;

voidcreate(int*a,int*b,int*n)

{inti,;

srand((unsigned)time(NULL));

n;

{a[i]=rand();

b[i]=a[i];

%8d"

}}

/***1*****插入排序**********/

voidinsertsort(int*a,intn)

{inti,j;

for(i=2;

{a[0]=a[i];

for(j=i-1;

a[0]<

a[j];

j--)

a[j+1]=a[j];

a[j+1]=a[0];

voidxiersort(int*a,intn)

{intd[3]={5,3,1};

inti,j,k=0

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

当前位置:首页 > 高等教育 > 工学

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

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