Data_Structure/作業/unit12/dfs/dfs.cpp

128 lines
2.8 KiB
C++
Raw Normal View History

2025-01-20 21:30:53 +08:00
/* file name: dfs.c */
/* <20>ϧΪ<CFA7><CEAA>l<EFBFBD><6C>: <20>۾F<DBBE><46><EFBFBD>C<EFBFBD>P<EFBFBD>ܦV<DCA6>u<EFBFBD><75><EFBFBD>j<EFBFBD>M<EFBFBD>k(DFS)*/
#include <stdio.h>
#include <stdlib.h>
#define MAX_V 100 /*<2A>̤j<CCA4>`<60>I<EFBFBD><49>*/
#define TRUE 1
#define FALSE 0
/*<2A>w<EFBFBD>q<EFBFBD><71><EFBFBD>Ƶ<EFBFBD><C6B5>c*/
typedef struct node_tag {
int vertex;
struct node_tag *link;
} Node;
Node *adjlist[MAX_V+1]; /*<2A>ŧi<C5A7>۾F<DBBE><46><EFBFBD>C*/
int visited[MAX_V+1]; /*<2A>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD>O<EFBFBD>_<EFBFBD>w<EFBFBD><77><EFBFBD>X*/
int total_vertex;
void build_adjlist(void);
void show_adjlist(void);
void dfs(int);
Node *searchlast(Node *);
int main()
{
build_adjlist(); /*<2A>H<EFBFBD>۾F<DBBE><46><EFBFBD>C<EFBFBD><43><EFBFBD>ܹϧ<DCB9>*/
show_adjlist(); /*<2A><><EFBFBD>ܦ<EFBFBD><DCA6>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
puts("\n------Depth Fisrt Search------");
dfs(1); /*<2A>ϧΤ<CFA7><CEA4>ܦV<DCA6>u<EFBFBD><75><EFBFBD>j<EFBFBD>M<EFBFBD>A<EFBFBD>H<EFBFBD><48><EFBFBD>I1<49><31><EFBFBD>ҩl<D2A9><6C><EFBFBD>I*/
printf("\n");
return 0;
}
void build_adjlist()
{
FILE *fptr;
Node *node,*lastnode;
int vi,vj ,weight;
fptr = fopen("dfs.dat", "r");
if (fptr == NULL) {
perror("dfs.dat");
exit(0);
}
/* Ū<><C5AA><EFBFBD>`<60>I<EFBFBD>`<60><> */
fscanf(fptr, "%d", &total_vertex);
for (vi = 1; vi <= total_vertex; vi++) {
/*<2A>]<5D>w<EFBFBD>}<7D>C<EFBFBD>ΦU<CEA6><55><EFBFBD>C<EFBFBD>ҩl<D2A9><6C>*/
visited[vi] = FALSE;
adjlist[vi] = (Node *)malloc(sizeof(Node));
adjlist[vi]->vertex = vi;
adjlist[vi]->link = NULL;
}
/* Ū<><C5AA><EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD> */
for (vi = 1; vi <= total_vertex; vi++)
for (vj = 1; vj <= total_vertex; vj++) {
fscanf(fptr,"%d",&weight);
/* <20><><EFBFBD><EFBFBD><EFBFBD>ɥH<C9A5>۾F<DBBE>x<EFBFBD>}<7D><EFBFBD>x<EFBFBD>s,<2C>H1<48>N<EFBFBD><4E><EFBFBD>۾F
0 <EFBFBD>N<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۾F<EFBFBD>A<EFBFBD>N<EFBFBD>۾F<EFBFBD><EFBFBD><EFBFBD>I<EFBFBD><EFBFBD>b<EFBFBD>U<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD> */
if (weight != 0) {
node = (Node *)malloc(sizeof(Node));
node->vertex = vj;
node->link = NULL;
lastnode = searchlast(adjlist[vi]);
lastnode->link = node;
}
}
fclose(fptr);
}
/*<2A><><EFBFBD>ܦU<DCA6>۾F<DBBE><46><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
void show_adjlist()
{
int index;
Node *ptr;
puts("Head adjacency nodes");
puts("------------------------------");
for (index = 1; index <= total_vertex; index++) {
printf("V%-2d ",adjlist[index]->vertex);
ptr = adjlist[index]->link;
while (ptr != NULL) {
printf("--> V%d ",ptr->vertex);
ptr = ptr->link;
}
printf("\n");
}
}
/*<2A>ϧΤ<CFA7><CEA4>ܦV<DCA6>u<EFBFBD><75><EFBFBD>j<EFBFBD>M*/
void dfs(int v)
{
Node *ptr;
int w;
printf("V%d ",adjlist[v]->vertex);
visited[v] = TRUE; /*<2A>]<5D>wv<77><76><EFBFBD>I<EFBFBD><49><EFBFBD>w<EFBFBD><77><EFBFBD>X<EFBFBD>L*/
ptr = adjlist[v]->link; /*<2A><><EFBFBD>X<EFBFBD>۾F<DBBE><46><EFBFBD>I*/
do {
/* <20>Y<EFBFBD><59><EFBFBD>I<EFBFBD>|<7C><><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>A<EFBFBD>h<EFBFBD>H<EFBFBD><48><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD><49><EFBFBD>s<EFBFBD>ҩl<D2A9>I<EFBFBD>~<7E><>
<EFBFBD><EFBFBD><EFBFBD>ܦV<EFBFBD>u<EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>M<EFBFBD>k<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>A<EFBFBD>_<EFBFBD>h<EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><EFBFBD><EFBFBD>۾F<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҧ<EFBFBD><EFBFBD>۳s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<EFBFBD>I<EFBFBD><EFBFBD><EFBFBD>w<EFBFBD><EFBFBD><EFBFBD>X */
w = ptr->vertex;
if (!visited[w])
dfs(w);
else
ptr = ptr->link;
} while (ptr != NULL);
}
/*<2A>j<EFBFBD>M<EFBFBD><4D><EFBFBD>C<EFBFBD>̫<EFBFBD><CCAB>`<60>I<EFBFBD><49><EFBFBD><EFBFBD>*/
Node *searchlast( Node *linklist )
{
Node *ptr;
ptr = linklist;
while (ptr->link != NULL)
ptr = ptr->link;
return ptr;
}