c語言廣度遍歷,廣度遍歷深度遍歷

本文目錄一覽:

數據結構C語言版 圖的廣度優先遍歷和深度優先遍歷 急急急 會查重

#include iostream

#include string

#include queue

using namespace std;

int FirstAdjVex(int v);

int NextAdjVex(int v, int w);

void DFS(int v); //從頂點v開始對圖做深度優先遍歷, v是頂點數組的下標

void BFS(int v); //從頂點v開始對圖做廣度優先遍歷,v是頂點數組的下標

int find(string a,int n);

int visited[10]={0};

int traver[10][10]={0};

string name[10];

int main()

{

int n,m,i,j,k;

string a,b;

//freopen(“Traver.txt”,”r”,stdin);

cinn;

cinm;

for(i=0; in; i++)

{

cina;

name[i] = a;

}

for(i=0; im;i++){

cina;

cinb;

j = find(a,n);

k = find(b,n);

traver[j][k] = 1;

traver[k][j] = 1;

}

for(i=0; in; i++){

if(visited[i] == 0)

DFS(i);

}

cout”\n”;

for(i=0; in; i++){

visited[i] = 0;

}

for(i=0; in; i++){

if(visited[i] == 0)

BFS(i);

}

cout”\n”;

return 0;

}

//尋找函數

int find(string a,int n){

int i;

for(i=0; in; i++){

if(a == name[i])

return i;

}

return -1;

}

int FirstAdjVex(int v)

{

int i;

//從編號大的鄰接點開始訪問

for (i = 9; i = 0; i–)

{

if (traver[v][i] == 1)

return i;

}

return -1;

}

int NextAdjVex(int v, int w)

{

int i;

for (i = w – 1; i = 0; i–)

{

if (traver[v][i] == 1)

return i;

}

return -1;

}

void DFS(int v)

{

int w;

//訪問頂點v(輸出頂點v的名字)

coutname[v]” “;

visited[v] = 1;

//找到頂點v的第一個鄰接點w

for (w = FirstAdjVex(v); w = 0; w = NextAdjVex(v, w))

{

//如果w沒有訪問過,對頂點w做深度優先搜索

if (visited[w] == 0)

DFS(w);

}

}

void BFS(int v) //從頂點v開始對圖做廣度優先遍歷,v是頂點數組的下標

{

int w, u;

queueint myqueue; //定義一個隊列,元素是頂點的下標

//把頂點v入隊

myqueue.push(v);

coutname[v]” “;

visited[v] = 1;

while (!myqueue.empty())

{//當隊列不為空時進入循環

//取隊頭元素

u = myqueue.front();

//隊頭元素出隊

myqueue.pop();

//把u的所有鄰接點入隊

w = FirstAdjVex(u);

while (w = 0)

{

if (visited[w] == 0)

{

//訪問w

coutname[w]” “;

visited[w] = 1;

//w入隊

myqueue.push(w);

}

w = NextAdjVex(u, w);

}

}

}

c語言圖的遍歷,鄰接表存儲,深度,廣度優先遍歷

(1) 圖的建立,按採用鄰接表作為存儲結構。

(2) 從指定頂點出發進行深度優先搜索遍歷。

(3) 從指定頂點出發進行廣度優先搜索遍歷。

#include”stdio.h”

#include”string.h”

#include”stdlib.h”

#include”math.h”

#define MAX_INT 1000

#define MAX_VERTEX_NUM 20

#define MAX_QUEUE_NUMBER 20

typedef struct ArcNode

{

int adjvex;

double adj;

struct ArcNode *nextarc;

}ArcNode;

typedef struct VexNode

{

char szName[40];

ArcNode *firstarc;

}VexNode,AdjList[MAX_VERTEX_NUM];

typedef struct

{

AdjList vexs;

int vexnum,arcnum;

}Net;

//定義隊列

typedef struct{

int *elem;

int front, rear;

}Queue;

void InitQueue(Queue Q)

{

Q.elem = new int[MAX_QUEUE_NUMBER];

Q.front = Q.rear = 0;

}

int EmptyQueue(Queue Q)

{

if(Q.front==Q.rear)

return 0;

else

return 1;

}

void DestroyQueue(Queue Q){

delete []Q.elem;

Q.front = Q.rear = 0;

}

void EnterQueue(Queue Q, int e)

{

if((Q.rear + 1)%MAX_QUEUE_NUMBER != Q.front)

Q.elem[Q.rear ] = e;

else

printf(“隊列滿!\n”);

Q.rear = (Q.rear + 1)%MAX_QUEUE_NUMBER;

}

void LeaveQueue(Queue Q, int e)

{

if(Q.rear != Q.front)

e = Q.elem[Q.front];

else

printf(“隊列空!\n”);

Q.front = (Q.front+1)%MAX_QUEUE_NUMBER;

}

int LocateVex(Net ga,char *name)

{

int i;

for(i=0;iga.vexnum;i++)

if(strcmp(name,ga.vexs[i].szName)==0)

return i;

return -1;

}

void crt_net(Net ga)

{

ArcNode *p;

char name1[40],name2[40];

int i,j,k;

double w;

printf(“請輸入頂點數和弧數:”);

scanf(“%d%d”,ga.vexnum,ga.arcnum);

printf(“請依次輸入頂點名:\n”);

for(i=0;iga.vexnum;i++)

{

scanf(“%s”,ga.vexs[i].szName);

ga.vexs[i].firstarc=NULL;

}

for(k=0;kga.arcnum;k++)

{

printf(“請輸入相鄰的兩個定點和權值:”);

scanf(“%s%s%lf”,name1,name2,w);

i=LocateVex(ga,name1);

j=LocateVex(ga,name2);

p=new ArcNode;

p-adjvex=j;

p-adj=w;

p-nextarc=ga.vexs[i].firstarc;

ga.vexs[i].firstarc=p;

}

}

void DFS(Net ga,char *name,int *visited)

{

int v,w;

ArcNode *p;

v=LocateVex(ga,name);

visited[v]=1;

printf(“%s “,ga.vexs[v].szName);

p=ga.vexs[v].firstarc;

while(p!=NULL)

{

w=p-adjvex;

if(visited[w]==0)

DFS(ga,ga.vexs[w].szName,visited);

p=p-nextarc;

}

}

void DFSTravel(Net ga,char *name)

{

int v,k=0;

int visited[20];

for(v=0;vga.vexnum;v++)

visited[v]=0;

for(v=LocateVex(ga,name);k!=2;v=(v+1)%(ga.vexnum-1))

{

if(v+1==LocateVex(ga,name))

k++;

if(visited[v]==0)

DFS(ga,ga.vexs[v].szName,visited);

}

}

void BFSTravel(Net ga,char *name)

{

ArcNode *p;

int v,w,u,k=0;

Queue Q;

int visited[20];

for(v=0;vga.vexnum;v++)

visited[v]=0;

InitQueue(Q);

for(v=LocateVex(ga,name);k!=2;v=(v+1)%(ga.vexnum-1))

{

if(v+1==LocateVex(ga,name))

k++;

if(visited[v]==0)

{

visited[v]=1;

printf(“%s “,ga.vexs[v].szName);

EnterQueue(Q,v);

while(EmptyQueue(Q)!=0)

{

LeaveQueue(Q,u);

p=ga.vexs[u].firstarc;

while(p!=NULL)

{

w=p-adjvex;

if(visited[w]==0)

{

printf(“%s “,ga.vexs[w].szName);

visited[w]=1;

EnterQueue(Q,w);

}

p=p-nextarc;

}

}

}

}

}

void main()

{

char name[40];

Net ga;

crt_net(ga);

printf(“請輸入深度優先遍歷開始點的名:”);

scanf(“%s”,name);

printf(“深度優先遍歷:”);

DFSTravel(ga,name);

printf(“\n”);

printf(“請輸入廣度優先遍歷開始點的名:”);

scanf(“%s”,name);

printf(“廣度優先遍歷:”);

BFSTravel(ga,name);

printf(“\n”);

}

c語言關於圖的廣度優先遍歷

深度優先是沿著一條路走到底,走不通了或到頭了,再回溯,再搜索。而廣搜是先搜離得最近的,再慢慢搜索遠的,隊列就是按順序存,所以開頭存的近的,末尾存遠的,說白了隊列就是從近到遠保存數據的,說的不好,希望對你會點幫助。

求助大神,C語言!數據結構 怎麼用廣度遍歷解決任務分配問題,在廣度

廣度優先搜索要藉助於隊列來實現,無論圖的儲存結構是什麼。具體演算法:1將所有節點標註為未訪問狀態2從任意一個節點開始,訪問該節點(並同時標註為已訪問),訪問後將該節點入隊。3檢查隊列是否為空,若不空,出隊,檢查和這個節點有路徑並且未被訪問的節點,訪問,再入隊……(回到第二步)廣度優先類似於樹的層序遍歷具體代碼:boolvisited[MAX];//該數組用來表示是否下標為i的節點訪問過,訪問過為true,否則為falsestructAdjNode//邊表節點結構{intadj;//鄰接點的下標intweigth;//邊權值structAdjNode*pNext;};structVertexNode//頂點節點結構{chardata;//數據類型根據需求更改structAdjNode*first;//儲存第一個邊表節點};typedefstructGraph{intnumE,numV;//當前圖的頂點數和邊數structVertexNodeVer[MAX];//頂點表}Graph;voidBFSTraverse(GraphG)//G為用鄰接表儲存的圖{for(inti=0;iadj]){printf(“%c”,G.Ver[p-adj].data);//訪問visited[p-adj]=true;//標註為訪問過enQueue(q,p-adj);//入隊}p=p-pNext;//指針指向下一個鄰接點}}}}}

求大神幫寫一個c語言圖的深度優先遍歷,和廣度優先遍歷??

/*深度優先*/

#includestdio.h

#includestdlib.h

struct node/*圖的頂點結構*/

{

int vertex;

int flag;

struct node *nextnode;

};

typedef struct node *graph;

struct node vertex_node[10];

void creat_graph(int *node,int n)

{

graph newnode,p;/*定義一個新結點及指針*/

int start,end,i;

for(i=0;in;i++)

{

start=node[i*2];/*邊的起點*/

end=node[i*2+1];/*邊的終點*/

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

newnode-vertex=end;/*新結點的內容為邊終點處頂點的內容*/

newnode-nextnode=NULL;

p=(vertex_node);/*設置指針位置*/

while(p-nextnode!=NULL)

p=p-nextnode;/*尋找鏈尾*/

p-nextnode=newnode;/*在鏈尾處插入新結點*/

}

}

void dfs(int k)

{

graph p;

vertex_node[k].flag=1;/*將標誌位置1,證明該結點已訪問過*/

printf(“vertex[%d]”,k);

p=vertex_node[k].nextnode;/*指針指向下個結點*/

while(p!=NULL)

{

if(vertex_node[p-vertex].flag==0)/*判斷該結點的標誌位是否為0*/

dfs(p-vertex);/*繼續遍歷下個結點*/

p=p-nextnode;/*若已遍歷過p指向下一個結點*/

}

}

main()

{

graph p;

int node[100],i,sn,vn;

printf(“please input the number of sides:\n”);

scanf(“%d”,sn);/*輸入無向圖的邊數*/

printf(“please input the number of vertexes\n”);

scanf(“%d”,vn);

printf(“please input the vertexes which connected by the sides:\n”);

for(i=0;i4*sn;i++)

scanf(“%d”,node[i]);/*輸入每個邊所連接的兩個頂點,起始及結束位置不同,每邊輸兩次*/

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

{

vertex_node[i].vertex=i;/*將每個頂點的信息存入數組中*/

vertex_node[i].nextnode=NULL;

}

creat_graph(node,2*sn);/*調用函數創建鄰接表*/

printf(“the result is:\n”);

for(i=1;i=vn;i++)/*將鄰接表內容輸出*/

{

printf(“vertex%d:”,vertex_node[i].vertex);/*輸出頂點內容*/

p=vertex_node[i].nextnode;

while(p!=NULL)

{

printf(“-%3d”,p-vertex);/*輸出鄰接頂點的內容*/

p=p-nextnode;/*指針指向下個鄰接頂點*/

}

printf(“\n”);

}

printf(“the result of depth-first search is:\n”);

dfs(1);/*調用函數進行深度優先遍歷*/

printf(“\n”);

}

/***************************廣度優先*******************************/

#include stdio.h

#include stdlib.h

struct node

{

int vertex;

struct node *nextnode;

};

typedef struct node *graph;

struct node vertex_node[10];

#define MAXQUEUE 100

int queue[MAXQUEUE];

int front = – 1;

int rear = – 1;

int visited[10];

void creat_graph(int *node, int n)

{

graph newnode, p; /*定義一個新結點及指針*/

int start, end, i;

for (i = 0; i n; i++)

{

start = node[i *2]; /*邊的起點*/

end = node[i *2+1]; /*邊的終點*/

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

newnode-vertex = end; /*新結點的內容為邊終點處頂點的內容*/

newnode-nextnode = NULL;

p = (vertex_node); /*設置指針位置*/

while (p-nextnode != NULL)

p = p-nextnode;

/*尋找鏈尾*/

p-nextnode = newnode; /*在鏈尾處插入新結點*/

}

}

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 k) /*廣度優先搜索*/

{

graph p;

enqueue(k); /*元素入隊*/

visited[k] = 1;

printf(“vertex[%d]”, k);

while (front != rear)

/*判斷是否對空*/

{

k = dequeue(); /*元素出隊*/

p = vertex_node[k].nextnode;

while (p != NULL)

{

if (visited[p-vertex] == 0)

/*判斷其是否被訪問過*/

{

enqueue(p-vertex);

visited[p-vertex] = 1; /*訪問過的元素置1*/

printf(“vertex[%d]”, p-vertex);

}

p = p-nextnode; /*訪問下一個元素*/

}

}

}

main()

{

graph p;

int node[100], i, sn, vn;

printf(“please input the number of sides:\n”);

scanf(“%d”, sn); /*輸入無向圖的邊數*/

printf(“please input the number of vertexes\n”);

scanf(“%d”, vn);

printf(“please input the vertexes which connected by the sides:\n”);

for (i = 0; i 4 *sn; i++)

scanf(“%d”, node[i]);

/*輸入每個邊所連接的兩個頂點,起始及結束位置不同,每邊輸兩次*/

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

{

vertex_node[i].vertex = i; /*將每個頂點的信息存入數組中*/

vertex_node[i].nextnode = NULL;

}

creat_graph(node, 2 *sn); /*調用函數創建鄰接表*/

printf(“the result is:\n”);

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

/*將鄰接表內容輸出*/

{

printf(“vertex%d:”, vertex_node[i].vertex); /*輸出頂點內容*/

p = vertex_node[i].nextnode;

while (p != NULL)

{

printf(“-%3d”, p-vertex); /*輸出鄰接頂點的內容*/

p = p-nextnode; /*指針指向下個鄰接頂點*/

}

printf(“\n”);

}

printf(“the result of breadth-first search is:\n”);

bfs(1); /*調用函數進行深度優先遍歷*/

printf(“\n”);

}

圖的深度/廣度優先遍歷C語言程序

這是我們老師給我們上數據結構課的課件

#include “stdio.h”

typedef int datatype; /*假定線性表元素的類型為整型*/

#define maxsize 1024 /*假定線性表的最大長度為1024*/

# define n 100 /* 圖的頂點最大個數 */

typedef char VEXTYPE; /* 頂點的數據類型 */

typedef float ADJTYPE; /* 權值類型 */

typedef struct

{ VEXTYPE vexs[n] ; /* 頂點信息數組 */

ADJTYPE arcs[n][n] ; /* 邊權數組 */

int num ; /* 頂點的實際個數 */

}GRAPH;

/***********************1。置空圖**********************/

void GraphInit(GRAPH *L)

{

L-num=0;

}

/***********************2。求結點數**********************/

int GraphVexs(GRAPH *L)

{

return(L-num);

}

/***********************3。創建圖**********************/

void GraphCreate(GRAPH *L)

{

int i,j;

GraphInit(L);

printf(“請輸入頂點數目:”);

scanf(“%d”,L-num);

printf(“請輸入各頂點的信息(單個符號):”);

for(i=0;iL-num;i++)

{

fflush(stdin);

scanf(“%c”,L-vexs[i]);

}

printf(“請輸入邊權矩陣的信息:”);

for(i=0;iL-num;i++)

{

for(j=0;jL-num;j++)

{

scanf(“%f”,L-arcs[i][j]);

}

}

printf(“圖已經創建完畢!”);

}

/***********************4。圖的輸出**********************/

void GraphOut(GRAPH L)

{

int i,j;

printf(“\n圖的頂點數目為:%d”,L.num);

printf(“\n圖的各頂點的信息為:\n”);

for(i=0;iL.num;i++)

printf(“%c “,L.vexs[i]);

printf(“\n圖的邊權矩陣的信息為:\n”);

for(i=0;iL.num;i++)

{

for(j=0;jL.num;j++)

{

printf(“%6.2f “,L.arcs[i][j]);

}

printf(“\n”);

}

printf(“圖已經輸出完畢!”);

}

/***********************5。圖的深度周遊**********************/

void DFS(GRAPH g,int qidian,int mark[])

//從第qidian個點出發深度優先周遊圖g中能訪問的各個頂點

{

int v1;

mark[qidian]=1;

printf(“%c “,g.vexs[qidian]);

for(v1=0;v1g.num;v1++)

{

if(g.arcs[qidian][v1]!=0mark[v1]==0)

DFS(g,v1,mark);

}

}

/***********************6。圖的深度周遊**********************/

void GraphDFS(GRAPH g)

//深度優先周遊圖g中能訪問的各個頂點

{

int qidian,v,v1,mark[maxsize];

printf(“\n深度周遊:”);

printf(“\n請輸入起點的下標:”);

scanf(“%d”,qidian);

for(v=0;vg.num;v++)

{

mark[v]=0;

}

for(v=qidian;vg.num+qidian;v++)

{

//printf(“v=%d “,v);

v1=v%g.num;

if(mark[v1]==0)

DFS(g,v1,mark);

}

}

typedef int DATATYPE; //隊列元素的數據類型

typedef struct

{

DATATYPE data[maxsize]; //隊中元素

int front,rear; //隊頭元素下標、隊尾元素後面位置的下標

} SEQQUEUE;

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

void QueueInit(SEQQUEUE *sq)

//將順序循環隊列sq置空(初始化)

{

sq-front=0;

sq-rear=0;

}

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

int QueueIsEmpty(SEQQUEUE sq)

//如果順序循環隊列sq為空,成功返回1,否則返回0

{

if (sq.rear==sq.front)

return(1);

else

return(0);

}

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

int QueueFront(SEQQUEUE sq,DATATYPE *e)

//將順序循環隊列sq的隊頭元素保存到e所指地址,成功返回1,失敗返回0

{

if (QueueIsEmpty(sq))

{ printf(“queue is empty!\n”);return 0;}

else

{ *e=sq.data[(sq.front)]; return 1;}

}

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

int QueueIn (SEQQUEUE *sq,DATATYPE x)

//將元素x入隊列sq的隊尾,成功返回1,失敗返回0

{

if (sq-front==(sq-rear+1)%maxsize)

{

printf(“queue is full!\n”);

return 0;

}

else

{

sq-data[sq-rear]=x;

sq-rear=(sq-rear+1)%maxsize;

return(1);

}

}

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

int QueueOut(SEQQUEUE *sq)

//將隊列sq隊首元素出隊列,成功返回1,失敗返回0

{

if (QueueIsEmpty(*sq))

{

printf(“queue is empty!\n”);

return 0;

}

else

{

sq-front=(sq-front+1)%maxsize;

return 1;

}

}

/***********************7。圖的廣度周遊**********************/

void BFS(GRAPH g,int v,int mark[])

//從v出發廣度優先周遊圖g中能訪問的各個頂點

{

int v1,v2;

SEQQUEUE q;

QueueInit(q);

QueueIn(q,v);

mark[v]=1;

printf(“%c “,g.vexs[v]);

while(QueueIsEmpty(q)==0)

{

QueueFront(q,v1);

QueueOut(q);

for(v2=0;v2g.num;v2++)

{

if(g.arcs[v1][v2]!=0mark[v2]==0)

{

QueueIn(q,v2);

mark[v2]=1;

printf(“%c “,g.vexs[v2]);

}

}

}

}

/***********************8。圖的廣度周遊**********************/

void GraphBFS(GRAPH g)

//深度優先周遊圖g中能訪問的各個頂點

{

int qidian,v,v1,mark[maxsize];

printf(“\n廣度周遊:”);

printf(“\n請輸入起點的下標:”);

scanf(“%d”,qidian);

for(v=0;vg.num;v++)

{

mark[v]=0;

}

for(v=qidian;vg.num+qidian;v++)

{

v1=v%g.num;

if(mark[v1]==0)

BFS(g,v1,mark);

}

}

/***********************主函數**********************/

void main()

{

GRAPH tu;

GraphCreate(tu);

GraphOut(tu);

GraphDFS(tu);

GraphBFS(tu);

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/248725.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:29
下一篇 2024-12-12 13:29

相關推薦

  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python遍歷集合中的元素

    本文將從多個方面詳細闡述Python遍歷集合中的元素方法。 一、for循環遍歷集合 Python中,使用for循環可以遍歷集合中的每個元素,代碼如下: my_set = {1, 2…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Python如何遍歷字典中的key和value

    本文將詳細講解Python中如何遍歷字典中的key和value,包括多種遍歷方式以及在遍歷過程中的一些應用場景。 一、遍歷字典中的key和value 在Python中,字典是一種無…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • 深度查詢宴會的文化起源

    深度查詢宴會,是指通過對一種文化或主題的深度挖掘和探究,為參與者提供一次全方位的、深度體驗式的文化品嘗和交流活動。本文將從多個方面探討深度查詢宴會的文化起源。 一、宴會文化的起源 …

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28

發表回復

登錄後才能評論