RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
c语言队列的遍历函数 c++ 队列遍历

C语言编写程序实现图的遍历操作

楼主你好,下面是源程序!

成都创新互联不只是一家网站建设的网络公司;我们对营销、技术、服务都有自己独特见解,公司采取“创意+综合+营销”一体化的方式为您提供更专业的服务!我们经历的每一步也许不一定是最完美的,但每一步都有值得深思的意义。我们珍视每一份信任,关注我们的成都网站建设、成都网站设计质量和服务品质,在得到用户满意的同时,也能得到同行业的专业认可,能够为行业创新发展助力。未来将继续专注于技术创新,服务升级,满足企业一站式营销型网站建设需求,让再小的高端网站设计也能产生价值!

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

/* 图的深度优先遍历 */

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

#include stdlib.h

#include stdio.h

struct node /* 图顶点结构定义 */

{

int vertex; /* 顶点数据信息 */

struct node *nextnode; /* 指下一顶点的指标 */

};

typedef struct node *graph; /* 图形的结构新型态 */

struct node head[9]; /* 图形顶点数组 */

int visited[9]; /* 遍历标记数组 */

/********************根据已有的信息建立邻接表********************/

void creategraph(int node[20][2],int num)/*num指的是图的边数*/

{

graph newnode; /*指向新节点的指针定义*/

graph ptr;

int from; /* 边的起点 */

int to; /* 边的终点 */

int i;

for ( i = 0; i num; i++ ) /* 读取边线信息,插入邻接表*/

{

from = node[i][0]; /* 边线的起点 */

to = node[i][1]; /* 边线的终点 */

/* 建立新顶点 */

newnode = ( graph ) malloc(sizeof(struct node));

newnode-vertex = to; /* 建立顶点内容 */

newnode-nextnode = NULL; /* 设定指标初值 */

ptr = (head[from]); /* 顶点位置 */

while ( ptr-nextnode != NULL ) /* 遍历至链表尾 */

ptr = ptr-nextnode; /* 下一个顶点 */

ptr-nextnode = newnode; /* 插入节点 */

}

}

/********************** 图的深度优先搜寻法********************/

void dfs(int current)

{

graph ptr;

visited[current] = 1; /* 记录已遍历过 */

printf("vertex[%d]\n",current); /* 输出遍历顶点值 */

ptr = head[current].nextnode; /* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

if ( visited[ptr-vertex] == 0 ) /* 如过没遍历过 */

dfs(ptr-vertex); /* 递回遍历呼叫 */

ptr = ptr-nextnode; /* 下一个顶点 */

}

}

/****************************** 主程序******************************/

void main()

{

graph ptr;

int node[20][2] = { {1, 2}, {2, 1}, /* 边线数组 */

{1, 3}, {3, 1},

{1, 4}, {4, 1},

{2, 5}, {5, 2},

{2, 6}, {6, 2},

{3, 7}, {7, 3},

{4, 7}, {4, 4},

{5, 8}, {8, 5},

{6, 7}, {7, 6},

{7, 8}, {8, 7} };

int i;

clrscr();

for ( i = 1; i = 8; i++ ) /* 顶点数组初始化 */

{

head[i].vertex = i; /* 设定顶点值 */

head[i].nextnode = NULL; /* 指针为空 */

visited[i] = 0; /* 设定遍历初始标志 */

}

creategraph(node,20); /* 建立邻接表 */

printf("Content of the gragh's ADlist is:\n");

for ( i = 1; i = 8; i++ )

{

printf("vertex%d -",head[i].vertex); /* 顶点值 */

ptr = head[i].nextnode; /* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

printf(" %d ",ptr-vertex); /* 印出顶点内容 */

ptr = ptr-nextnode; /* 下一个顶点 */

}

printf("\n"); /* 换行 */

}

printf("\nThe end of the dfs are:\n");

dfs(1); /* 打印输出遍历过程 */

printf("\n"); /* 换行 */

puts(" Press any key to quit...");

getch();

}

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

/* 图形的广度优先搜寻法 */

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

#include stdlib.h

#include stdio.h

#define MAXQUEUE 10 /* 队列的最大容量 */

struct node /* 图的顶点结构定义 */

{

int vertex;

struct node *nextnode;

};

typedef struct node *graph; /* 图的结构指针 */

struct node head[9]; /* 图的顶点数组 */

int visited[9]; /* 遍历标记数组 */

int queue[MAXQUEUE]; /* 定义序列数组 */

int front = -1; /* 序列前端 */

int rear = -1; /* 序列后端 */

/***********************二维数组向邻接表的转化****************************/

void creategraph(int node[20][2],int num)

{

graph newnode; /* 顶点指针 */

graph ptr;

int from; /* 边起点 */

int to; /* 边终点 */

int i;

for ( i = 0; i num; i++ ) /* 第i条边的信息处理 */

{

from = node[i][0]; /* 边的起点 */

to = node[i][1]; /* 边的终点 */

/* 建立新顶点 */

newnode = ( graph ) malloc(sizeof(struct node));

newnode-vertex = to; /* 顶点内容 */

newnode-nextnode = NULL; /* 设定指针初值 */

ptr = (head[from]); /* 顶点位置 */

while ( ptr-nextnode != NULL ) /* 遍历至链表尾 */

ptr = ptr-nextnode; /* 下一个顶点 */

ptr-nextnode = newnode; /* 插入第i个节点的链表尾部 */

}

}

/************************ 数值入队列************************************/

int enqueue(int value)

{

if ( rear = MAXQUEUE ) /* 检查伫列是否全满 */

return -1; /* 无法存入 */

rear++; /* 后端指标往前移 */

queue[rear] = value; /* 存入伫列 */

}

/************************* 数值出队列*********************************/

int dequeue()

{

if ( front == rear ) /* 队列是否为空 */

return -1; /* 为空,无法取出 */

front++; /* 前端指标往前移 */

return queue[front]; /* 从队列中取出信息 */

}

/*********************** 图形的广度优先遍历************************/

void bfs(int current)

{

graph ptr;

/* 处理第一个顶点 */

enqueue(current); /* 将顶点存入队列 */

visited[current] = 1; /* 已遍历过记录标志置疑1*/

printf(" Vertex[%d]\n",current); /* 打印输出遍历顶点值 */

while ( front != rear ) /* 队列是否为空 */

{

current = dequeue(); /* 将顶点从队列列取出 */

ptr = head[current].nextnode; /* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

if ( visited[ptr-vertex] == 0 ) /*顶点没有遍历过*/

{

enqueue(ptr-vertex); /* 奖定点放入队列 */

visited[ptr-vertex] = 1; /* 置遍历标记为1 */

printf(" Vertex[%d]\n",ptr-vertex);/* 印出遍历顶点值 */

}

ptr = ptr-nextnode; /* 下一个顶点 */

}

}

}

/*********************** 主程序 ************************************/

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

void main()

{

graph ptr;

int node[20][2] = { {1, 2}, {2, 1}, /* 边信息数组 */

{6, 3}, {3, 6},

{2, 4}, {4, 2},

{1, 5}, {5, 1},

{3, 7}, {7, 3},

{1, 7}, {7, 1},

{4, 8}, {8, 4},

{5, 8}, {8, 5},

{2, 8}, {8, 2},

{7, 8}, {8, 7} };

int i;

clrscr();

puts("This is an example of Width Preferred Traverse of Gragh.\n");

for ( i = 1; i = 8; i++ ) /*顶点结构数组初始化*/

{

head[i].vertex = i;

head[i].nextnode = NULL;

visited[i] = 0;

}

creategraph(node,20); /* 图信息转换,邻接表的建立 */

printf("The content of the graph's allist is:\n");

for ( i = 1; i = 8; i++ )

{

printf(" vertex%d =",head[i].vertex); /* 顶点值 */

ptr = head[i].nextnode; /* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

printf(" %d ",ptr-vertex); /* 打印输出顶点内容 */

ptr = ptr-nextnode; /* 下一个顶点 */

}

printf("\n"); /* 换行 */

}

printf("The contents of BFS are:\n");

bfs(1); /* 打印输出遍历过程 */

printf("\n"); /* 换行 */

puts(" Press any key to quit...");

getch();

}

c语言队列问题

楼主你好!

你的问题很简单!

printf("出队元素并且输出该元素\n");

DeQueue(Q,e);

printf("出队元素为:%c\n",e);

找到上面这段代码了吗?问题出在DeQueue(Q,e);你自己看看你怎么定义的DeQueue函数的,它返回的是SeqQueue类型,所以应该改为Q=DeQueue(Q,e);这样就对了!

希望我的回答对你有帮助!

望采纳!谢谢!

C语言循环队列

很简单啊,用一个数组,和2个指针就可以做到这一点,注意,一定要控制好指针,防止写的东西覆盖了没有发送的东西。

一个指针控制写,一个控制输出。如果走到尾巴 ,就把它移动到数组的0号元素。如果写的郭快,赶上了输出指针就不可以写。或则进行互斥处理,方法太多。不过写起来浪费时间。


新闻名称:c语言队列的遍历函数 c++ 队列遍历
链接地址:http://scyingshan.cn/article/hgppcj.html