數(shù)據(jù)結(jié)構(gòu):非遞歸dfs算法

字號:

都說現(xiàn)今內(nèi)存不值錢了,哈,也就不考慮空間復(fù)雜度的問題了,弄了倆輔助數(shù)組,覺得解這題還是挺容易的,就是不知道有沒有BUG。
    問題描述:
    假設(shè)圖G采用鄰接表存儲,中國自學(xué)編程網(wǎng),www.zxbc.cn ,編寫一個實現(xiàn)連通圖G的深度優(yōu)先遍歷(從頂點v出發(fā))的非遞歸算法。
    算法思路:
    就是深度優(yōu)先的思路。同樣是一個visited[]數(shù)組,標記已訪問過的頂點。又用了一個_vertex[]數(shù)組,用于存放頂點。
    算法實現(xiàn):
    #include
    #include
    #include
    #define MAXSIZE 100
    typedef char InfoType;
    typedef char vertex;
    typedef struct ANode //定義弧類型
    {
    int adjvex;
    struct ANode *nextarc;
    InfoType Info;
    }ArcNode;
    typedef struct //定義頂點類型
    {
    vertex data;
    ArcNode *fistarc;
    }VertexNode;
    typedef struct //定義圖類型
    {
    VertexNode adjlist[MAXSIZE]; //鄰接表
    int n,e;
    }ALGraph;
    void CreateALGraph(ALGraph *&g,int array[][MAXSIZE],int k) //傳遞一個鄰接矩陣創(chuàng)建圖
    {
    g=(ALGraph *)malloc(sizeof(ALGraph));
    for(int i=0;i    g->adjlist[i].fistarc=NULL;
    int cnt=0;
    ArcNode *p;
    for(i=0;i    for(int j=0;j    if(array[i][j]!=0)
    {
    cnt++;
    p=(ArcNode *)malloc(sizeof(ArcNode));
    p->adjvex=j;
    p->nextarc=g->adjlist[i].fistarc;
    g->adjlist[i].fistarc=p;
    }
    g->n=k;g->e=cnt;
    }
    void dfs(ALGraph *g,int v,int visited[],int _vertex[]) //dfs()
    {
    int _v,i=0; //_v為初始頂點v的鄰接點
    ArcNode *p;
    _vertex[0]=v; //保存頂點的數(shù)組
    visited[v]=1; //標記頂點是否已訪問的數(shù)組
    p=g->adjlist[v].fistarc; //p為頂點v的第一條邊
    while(p!=NULL)
    {
    _v=p->adjvex;
    if(visited[_v]==0) //如果該頂點未訪問過
    {
    i++;
    _vertex[i]=_v;
    visited[_v]=1;
    p=g->adjlist[_v].fistarc; //從下一個未訪問過的頂點開始深度優(yōu)先遍歷
    }
    else //否則找下一個相領(lǐng)頂點
    p=p->nextarc;
    }
    for(int j=0;j<=i;j++) //打印出_vertex數(shù)組中的內(nèi)容,即連通圖的所有頂點
    printf(\"%d \",_vertex[j]);
    printf(\"\\n\");
    }
    int main() //主函數(shù)調(diào)用
    {
    int graph_array[ ][MAXSIZE]={
    {0,1,0,1,1},
    {1,0,1,1,0},
    {0,1,0,1,1},
    {1,1,1,0,1},
    {1,0,1,1,0}
    };
    ALGraph *g;
    CreateALGraph(g,graph_array,5);
    int visited[MAXSIZE]={0};
    int _vertex[MAXSIZE]={0};
    dfs(g,2,visited,_vertex);
    return 0;
    }
    輸出:
    2 4 3 1 0