編程里的遍歷
圖的遍歷是指按某條搜索路徑訪問圖中每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。圖的遍歷有深度遍歷演算法和廣度遍歷演算法,最近阿傑做了關於圖的遍歷的演算法,下面是圖的遍歷深度優先的演算法(C語言程序):
#include<stdio.h>
#include<malloc.h>
#define MaxVertexNum 5
#define m 5
#define TRUE 1
#define NULL 0
typedef struct node
{
int adjvex;
struct node *next;
}JD;
typedef struct EdgeNode
{
int vexdata;
JD *firstarc;
}TD;
typedef struct
{
TD ag[m];
int n;
}ALGRAPH;
void DFS(ALGRAPH *G,int i)
{
JD *p;
int visited[80];
printf("visit vertex:%d->",G->ag[i].vexdata);
visited[i]=1;
p=G->ag[i].firstarc;
while(p)
{
if (!visited[p->adjvex])
DFS(G,p->adjvex);
p=p->next;
}
}
void creat(ALGRAPH *G)
{
int i,m1,j;
JD *p,*p1;
printf("please input the number of graph\n");
scanf("%d",&G->n);
for(i=0;i<G->n;i++)
{
printf("please input the info of node %d",i);
scanf("%d",&G->ag[i].vexdata);
printf("please input the number of arcs which adj to %d",i);
scanf("%d",&m1);
printf("please input the adjvex position of the first arc\n");
p=(JD *)malloc(sizeof(JD));
scanf("%d",&p->adjvex);
p->next=NULL;
G->ag[i].firstarc=p;
p1=p;
for(j=2 ;j<=m1;j++)
{
printf("please input the position of the next arc vexdata\n");
p=(JD *)malloc(sizeof(JD));
scanf("%d",&p->adjvex);
p->next=NULL;
p1->next=p;
p1=p;
}
}
}
int visited[MaxVertexNum];
void DFSTraverse(ALGRAPH *G)
{
int i;
for(i=0;i<G->n;i++)
visited[i]=0;
for(i=0;i<G->n;i++)
if(!visited[i])
DFS(G,i);
}
int main()
{
ALGRAPH *G;
printf("下面以臨接表存儲一個圖;\n");
creat(G);
printf("下面以深度優先遍歷該圖 \n");
DFSTraverse(G);
getchar();
}
Ⅱ C語言編程 圖的創建與遍歷
在C語言編程中,圖的創建和遍歷:
#include<stdio.h>
#define N 20
#define TRUE 1
#define FALSE 0
int visited[N];
typedef struct /*隊列的定義*/
{
int data[N];
int front,rear;
}queue;
typedef struct /*圖的鄰接矩陣*/
{
int vexnum,arcnum;
char vexs[N];
int arcs[N][N];
}
graph;
void createGraph(graph *g); /*建立一個無向圖的鄰接矩陣*/
void dfs(int i,graph *g); /*從第i個頂點出發深度優先搜索*/
void tdfs(graph *g); /*深度優先搜索整個圖*/
void bfs(int k,graph *g); /*從第k個頂點廣度優先搜索*/
void tbfs(graph *g); /*廣度優先搜索整個圖*/
void init_visit(); /*初始化訪問標識數組*/
void createGraph(graph *g) /*建立一個無向圖的鄰接矩陣*/
{ int i,j;
char v;
g->vexnum=0;
g->arcnum=0;
i=0;
printf("輸入頂點序列(以#結束):
");
while((v=getchar())!='#')
{
g->vexs[i]=v; /*讀入頂點信息*/
i++;
}
g->vexnum=i; /*頂點數目*/
for(i=0;i<g->vexnum;i++) /*鄰接矩陣初始化*/
for(j=0;j<g->vexnum;j++)
g->arcs[i][j]=0;
printf("輸入邊的信息:
");
scanf("%d,%d",&i,&j); /*讀入邊i,j*/
while(i!=-1) /*讀入i,j為-1時結束*/
{
g->arcs[i][j]=1;
g->arcs[j][i]=1;
scanf("%d,%d",&i,&j);
}
}
void dfs(int i,graph *g) /*從第i個頂點出發深度優先搜索*/
{
int j;
printf("%c",g->vexs[i]);
visited[i]=TRUE;
for(j=0;j<g->vexnum;j++)
if((g->arcs[i][j]==1)&&(!visited[j]))
dfs(j,g);
}
void tdfs(graph *g) /*深度優先搜索整個圖*/
{
int i;
printf("
從頂點%C開始深度優先搜索序列:",g->vexs[0]);
for(i=0;i<g->vexnum;i++)
if(visited[i]!=TRUE)
dfs(i,g);
}
void bfs(int k,graph *g) /*從第k個頂點廣度優先搜索*/
{
int i,j;
queue qlist,*q;
q=&qlist;
q->rear=0;
q->front=0;
printf("%c",g->vexs[k]);
visited[k]=TRUE;
q->data[q->rear]=k;
q->rear=(q->rear+1)%N;
while(q->rear!=q->front)
{
i=q->data[q->front];
q->front=(q->front+1)%N;
for(j=0;j<g->vexnum;j++)
if((g->arcs[i][j]==1)&&(!visited[j]))
{
printf("%c",g->vexs[j]);
visited[j]=TRUE;
q->data[q->rear]=j;
q->rear=(q->rear+1)%N;
}
}
}
void tbfs(graph *g) /*廣度優先搜索整個圖*/
{
int i;
printf("
從頂點%C開始廣度優先搜索序列:",g->vexs[0]);
for(i=0;i<g->vexnum;i++)
if(visited[i]!=TRUE)
bfs(i,g);
printf("
");
}
void init_visit() /*初始化訪問標識數組*/
{
int i;
for(i=0;i<N;i++)
visited[i]=FALSE;
}
int main()
{
graph ga;
int i,j;
createGraph(&ga);
printf("無向圖的鄰接矩陣:
");
for(i=0;i<ga.vexnum;i++)
{
for(j=0;j<ga.vexnum;j++)
printf("%3d",ga.arcs[i][j]);
printf("
");
}
init_visit();
tdfs(&ga);
init_visit();
tbfs(&ga);
return 0;
}
Ⅲ 求教c語言中的遍歷是如何在編程上實現的
如果有這么一顆樹,按先序遍歷是應該這樣輸入ABD##E##CF###; (#代表返回上一級)
Ⅳ 編程中編寫循環的技巧
以python為例談談編寫循環的技巧,for循環包含了常見的計數器式循環。由於通常for循環比while循環更容易寫,也執行得更快,所以for循環一般是你遍歷序列或其他可迭代對象時的首選。事實上,作為一條通用法則,你應該克制在Python中使用計數方式的誘惑——Python提供的迭代工具,能幫你把像C這樣低級語言中循環集合體的工作自動化。
不過,有些情況下你還是需要以更為特定的方式進行迭代。例如,如果你需要在列表中每隔一個元素或每隔兩個元素進行訪問,或是要同時修改列表呢?如果在同一個for循環內,並行遍歷一個以上的序列呢?如果你也需要進行索引呢?
你總是可以用while循環和手動索引運算來編寫這些獨特的循環,但是python提供了一套內置函數,可以幫你在for循環內定製迭代:
·內置函數range (Python 0.X及之後版本可用)返回一系列連續增加的整數,可作為
for中的索引。
內置函數zip (Python 2.0及之後版本可用)返回一系列並行元素的元組,可用於在for中內遍歷多個序列。
內置函數enumerate (Python 2.3及之後版本可用)同時生成可迭代對象中元素的值和索引,因而我們不必再手動計數。
內置函數map (Python 1.0及之後版本可用)在Python 2.X中與zip有著相似的效果,但是在3.X中 map 的這一角色被移除了。
因為for循環可能會比基於while的計數器循環運行得更快,所以藉助這些工具並盡可能地使用for循環,會讓你受益匪淺。讓我們在常見的使用場景下,依次看一看這些內置函數吧。我們將會看到,它們的用法在Python 2.X和3.X中稍有不同,同時它們中的一些要比其他的更加有效。
Ⅳ 在計算機編程中,遍歷目錄是什麼意思
現在我們考的教師資格證在應聘教師的時候是不是真的有用?
Ⅵ C語言的遍歷演算法
思路1:
寫出所有24種4個數的排列,存到一個數組里,假如數組是P[24][4];
那麼可以
for (i = 0; i < 24; i++)
for (j = 0; j < 24; j++)
for (k = 0; k < 24; k++)
三層循環,P[i],P[j],P[k]分別是矩陣的三個列
思路2:
利用dfs遞歸枚舉
int used[3][4];/*這個數組存放三個列中0~3這四個數是否已在這一列中出現過,需要提前清零*/
int mat[3][4];/*要枚舉的矩陣*/
void dfs(int col, int row)/*col表示現在已經搜索到哪一列(從0開始編號),row表示這一列已經填了幾行*/
{
int i;
if (col == 2 && row == 4)
{
....../*運行到這里的時候,mat就是枚舉到的一個矩陣*/
return;
}
if (row == 4)
{row = 0; col++;}
for (i = 0; i < 4; i++)
if (!used[col][i])
{
used[col][i] = 1;
mat[col][row] = i;
dfs(col, row + 1);
used[col][i] = 0;
}
return;
}
調用的時候調用dfs(0,0)
Ⅶ 計算機編程演算法!遍歷一遍!
#include<stdio.h>
intn,ans=0,i,x;
intmain(){
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
ans^=x;
}
printf("%d",ans);
return0;
}
^= 表示 ans = ans ^ x ;
^是異或
如 3^5 =
011
^101
=110
=6
異或滿足:
A^B = B^A
(A^B)^C = A^(B^C)
A^A = 0
A^0 = A
所以你把輸入的數全部異或起來,相同的數自己變為0,剩下一個孤零零的數