#include<stdio.h>node
#include<stdlib.h>数组
#define Max 20 //设定图的最大顶点数指针
typedef char vertexType; //定义顶点的类型code
//typedef int edgeType;//定义边上的权重类型索引
#define edgeType int队列
//定义边的结构体内存
typedef struct EdgeNode_g {element
int adjVex;//存储邻接点的顶点下标,指的是数组的下标 edgeType weight;//存储边上的权值 struct EdgeNode_g *next; //指向下一个邻接点
}EdgeNode;get
//定义顶点的结构体it
typedef struct VerTex_g {
vertexType data;//存储顶点的信息 EdgeNode *firstNode;
}HeadList;
//定义图的相关结构体
typedef struct Graph_g {
HeadList headList[Max];//定义头结点数组变量 int number_vertex;//定义顶点的个数 int number_edge;//定义边的个数
}Graph;
//建立图
void createGraph(Graph *p) {
int i; int vertex; printf("请输入顶点数:"); scanf("%d", &vertex); p->number_vertex = vertex; printf("接下来进行输入顶点的相关信息\n"); char c; for (i = 0; i < p->number_vertex; i++) { printf("请输入第%d个顶点的信息:", i); getchar(); c=getchar();//过滤掉回车符 p->headList[i].data = c; p->headList[i].firstNode = NULL; } int edge; //edge1表示边1,edge2表示边2,w表示边上的权重 int edge1, edge2, w; printf("接下来进行边的相关信息填充\n"); printf("请输入边的个数:"); scanf("%d", &edge); p->number_edge = edge; EdgeNode *e; //注意我这里输入的顶点1,顶点2的值-1,表明顶点的索引 for (i = 0; i < p->number_edge; i++) { printf("输入顶点1,顶点2,权重w:"); scanf("%d%d%d", &edge1, &edge2, &w); e = (EdgeNode *)malloc(sizeof(EdgeNode)); e->adjVex = edge2 - 1; e->weight = w; e->next = p->headList[edge1-1].firstNode; p->headList[edge1-1].firstNode = e; e = (EdgeNode *)malloc(sizeof(EdgeNode)); e->adjVex = edge1 - 1; e->weight = w; e->next = p->headList[edge2-1].firstNode; p->headList[edge2-1].firstNode = e; }
}
void display(Graph *head) {
EdgeNode *temp; for (int i = 0; i < head->number_vertex; i++) { temp = head->headList[i].firstNode; printf("%c", head->headList[i].data); //注意判断条件哈 while (temp!= NULL) { printf("->%d",temp->adjVex); temp = temp->next; } printf("\n"); }
} //DFS遍历(用邻接表表示图)
//x表明顶点点所在的下标
bool visited[Max];
//若是图连通能够用这个就够啦
void DFS(Graph *head,int x) {
if (visited[x] != true) { printf("%3c", head->headList[x].data); } visited[x] = true; int i; EdgeNode *e = head->headList[x].firstNode; while (e!=NULL) { i = e->adjVex; if (visited[i] == false) { DFS(head, i); } e = e->next; }
}
//若是图不连通,就须要再加上下面的
void DFS_extend(Graph *head) {
for (int i = 0; i < head->number_vertex; i++) DFS(head, i);
}
//定义队列的目的主要为了在广度优先遍历过程当中使用队列
//定义队列的相关实现
typedef int elementType;
typedef struct q_node {
elementType data; q_node *next;
}Node;
typedef struct Link_Node {
struct q_node *rear; struct q_node *front;
} L_node;
L_node* init1() {
L_node *p = (L_node *)malloc(sizeof(L_node)); if (p == NULL) { printf("内存满了\n"); return NULL; } p->rear = p->front = NULL; return p;
}
void push_queue(L_node *p, elementType x) {
//新建个节点存储数据 Node *temp = (Node *)malloc(sizeof(Node)); if (temp == NULL) { printf("内存满了\n"); return; } temp->data = x; temp->next = NULL; //判断下队列是否无元素 if (p->rear == NULL) { p->rear = temp; p->front = temp; } //若是非空,就把元素插入到队尾指针的后面 p->rear->next = temp; //要把队尾指针指向新建立的节点 p->rear = temp;
} elementType pop_queue(L_node * p) {
Node * temp = p->front; elementType value; if (p->front == NULL) { printf("队列已经空了\n"); return -1; } //判断下若是队列只有一个元素 if (p->front == p->rear) { value = p->front->data; p->front = NULL; p->rear = NULL; free(temp); return value; } value = p->front->data; p->front = temp->next; free(temp); return value;
} bool visited1[Max]; int reter[Max];
//若是图是连通的,这样就够了
void BFS(Graph *head,int x,L_node *queue) {
if (visited1[x] == false) { push_queue(queue, x); visited1[x] = true; } int t; EdgeNode *e; int j; while (queue->front!=NULL) { t = pop_queue(queue); printf("%3c", head->headList[t].data); e = head->headList[t].firstNode; while (e!= NULL) { j = e->adjVex; if (visited1[j] == false) { push_queue(queue, j); visited1[j] = true; } e = e->next; } }
} //若是图不连通,就用下面的
void BFS_extend(Graph *g) { L_node * queue=init1(); for (int i = 0; i < g->number_vertex; i++) {
BFS(g, i,queue); }
} int main() {
Graph head; createGraph(&head); display(&head); DFS_extend(&head); printf("\n"); BFS_extend(&head); printf("\n"); system("pause"); return 0;
}