C语言大作业西工大
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(start<n&&start>=0)
break;
else printf("重新输入 ");
}
wLeabharlann Baiduile(1)
{
printf("第<%d>条边的终点: ",i);
fflush(stdin);
scanf("%d",&end);
if(end<n && end>=0 && end!=start) else printf("重新输入"); }
int i;
if(!Queue || !pQueue)
return;
Queue->next = NULL;
printf("\n 输出广度优先遍历次序:");
printf(" %c ",ag.vertices[start].cData);
p = ag.vertices[start].firstarc;
char cData; ArcNode* firstarc; }VNode,AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; int vexnum; int arcnum; }ALGraph; typedef struct LinkNode{ ArcNode* parc; struct LinkNode* next; }LinkNode;
{
if(!Visited[i])
printf(" %c ",ag.vertices[i].cData);
p = ag.vertices[i].firstarc;
}
if(i = ag.vexnum) break;
}
printf("\n\n");
};
void BFSTraverse(ALGraph ag,int start)
arcNodes->nextarc = pag->vertices[start].firstarc; pag->vertices[start].firstarc = arcNodes; } else{ while(p->nextarc) p = p->nextarc; p->nextarc = arcNodes; arcNodes->nextarc = NULL; } arcNodee->adjvex = start; p = pag->vertices[end].firstarc; if(!p) { arcNodee->nextarc = pag->vertices[end].firstarc; pag->vertices[end].firstarc = arcNodee; } else{ while(p->nextarc) p = p->nextarc; p->nextarc = arcNodee; arcNodee->nextarc = NULL; }
DFS(ag,choose);
i = 0; while(Visited[i]!='\0') {
last->next = pQueue;
last = last->next;
}
p = p->nextarc;
}
temp = Queue->next;
p = ag.vertices[temp->parc->adjvex].firstarc;
Queue ->next = temp->next;
}
for(i=0; i<ag.vexnum; i++)
return 1; } void DFS(ALGraph ag,int start) {
LinkNode* Stack = (LinkNode*)malloc(sizeof(LinkNode)); LinkNode* pStack = (LinkNode*)malloc(sizeof(LinkNode)); LinkNode* temp; ArcNode* p; int i; if(!pStack||!Stack)
pStack->parc = p; pStack->next = Stack->next; Stack->next = pStack; while(p && (Stack->next)) {
while(p) {
if(Visited[p->adjvex]) p=p->nextarc;
else
{
Visited[p->adjvex]=1;
int choose;
int start,end;
while(1)
{
printf("请输入图的结点个数,并回车: ");
scanf("%d",&n);
if(n<MAX_VERTEX_NUM && n>0)
break; else printf("\n 请注意结点个数不能大于 20,并且不能为 0!\n"); }
Visited[start] = 1;
while(1)
{
pQueue->parc = p;
Queue->next = pQueue;
pQueue->next = NULL;
last = pQueue;
while(p && Queue->next)
{
while(p)
{
if(!Visited[p->adjvex])
五、程序源代码及注释
#include<stdio.h> #include<malloc.h> #include<windows.h> #define MAX_VERTEX_NUM 20 typedef struct ArcNode{
int adjvex;
struct ArcNode* nextarc; }ArcNode; typedef struct VNode{
{
LinkNode* Queue = (LinkNode*)malloc(sizeof(LinkNode));
LinkNode* pQueue = (LinkNode*)malloc(sizeof(LinkNode));
LinkNode* temp;
LinkNode* last;
ArcNode* p;
int Visited[MAX_VERTEX_NUM]; int PrintCheck(ALGraph* pag) {
int i; ArcNode* p; printf("\nCheck the Graph!\n"); printf("No\tdata\tnext\tnext\t.....\n"); for(i=0; i<pag->vexnum; i++) {
三、实验原理 图的遍历是图的算法中一种非常重要的算法,通过建立图的存储结构,采用深度优先搜
索与广度优先搜索算法可以进行图的遍历; 深度优先遍历是树的先根遍历的推广,是将某一条枝上的所有节点都搜索到了之后,才
转向搜索另一条枝上的所有节点; 广度优先遍历与深度优先遍历的区别在于:广度优先遍历是以层为顺序,将某一层上的
Stack->next = pStack;
p = ag.vertices[p->adjvex].firstarc;
}
}
temp = Stack->next;
Stack->next = temp->next;
p = temp->parc->nextarc;
free(temp);
}
for(i=0; i<ag.vexnum; i++)
ag.vexnum = n;
printf("\n 初始化图的结点,输入字符并回车:\n"); for(i=0; i<ag.vexnum; i++) {
printf("No.%d = ",i); fflush(stdin); scanf("%c",&ag.vertices[i].cData); ag.vertices[i].firstarc = NULL; }
printf("%d\t%c\t",i,pag->vertices[i].cData); p = pag->vertices[i].firstarc; while(p) {
printf("%d\t",p->adjvex); p = p->nextarc; } printf("\n"); } return 1; } int CreateGraph(ALGraph* pag,int start,int end) { ArcNode* arcNodes = (ArcNode*)malloc(sizeof(ArcNode)); ArcNode* arcNodee = (ArcNode*)malloc(sizeof(ArcNode)); ArcNode* p; if(!arcNodes || !arcNodee) return 0; arcNodes->adjvex = end; p = pag->vertices[start].firstarc; if(!p) {
课程名称 实验项目
实验报告 数据结构 实现深度优先搜索与广度优先搜索算法
一、实验目的 1、通过本实验,掌握图,无向图的基本概念,掌握图的遍历; 2、掌握图的深度优先搜索(DFS)与广度优先搜索(BFS)算法。
二、实验内容 1、建立图的存储方式; 2、图的深度优先搜索算法; 3、图的广度优先搜索算法。
m = (n-2)*(n+1)/2+1;
while(1) {
printf("请输入边的数量: "); fflush(stdin); scanf("%d",&i);
if(i<=m && i>=0) break; else printf("\n 请注意边的数量不能大于%d,并且不能小于 1!\n",m); }
break;
printf("\n"); CreateGraph(&ag,start,end); } PrintCheck(&ag);
printf("\n 开始进行图的遍历!\n"); while(1) {
printf("请输入深度优先遍历的开始结点:"); fflush(stdin); scanf("%d",&choose); if(choose>=0 && choose<n) break; else printf("重新输入 "); }
printf(" %c ",ag.vertices[p->adjvex].cData);
pStack = (LinkNode*)malloc(sizeof(LinkNode));
if(!pStack)
return;
pStack->parc = p;
pStack->next = Stack->next;
ag.arcnum = i;
printf("\n 初始化图的边,结点从 0 开始计,最大为%d\n",n-1); for(i=1; i<=ag.arcnum; i++) {
while(1) {
printf("第<%d>条边的起点: ",i); fflush(stdin); scanf("%d",&start);
{
Visited[p->adjvex] = 1;
printf(" %c ",ag.vertices[p->adjvex].cData);
pQueue = (LinkNode*)malloc(sizeof(LinkNode));
if(!pQueue)
return;
pQueue->parc = p;
pQueue->next = NULL;
{
if(!Visited[i])
printf(" %c ",ag.vertices[i].cData);
p = ag.vertices[i].firstarc;
}
if(i = ag.vexnum)
break;
}
printf("\n\n");
}
void main()
{
ALGraph ag;
int i,n,m;
return; Stack->next=NULL; p=ag.vertices[start].firstarc; Visited[start]=1; printf("\n 输出深度优先遍历顺序:"); printf(" %c ",ag.vertices[start].cData); while(1) {
所有节点都搜索到了之后才向下一层搜索。
四、实验步骤 1.建立图的存储结构; 2.输入图的基本接点与信息,初始化图; 3.编写图的深度优先搜索(DFS)和广度优先搜索算法(BFS)程序; 4.采用菜单形式进行显示与选择。 5.测试数据和结果显示 (1)从键盘输入顶点数和边数; (2)输入顶点信息; (3)输入边的信息,以(a,b)的形式输入边的信息,构建一个无向图; (4)对此无向图进行深度优先搜索和广度优先搜索,并输出正确的序列。