圖的基本操作 (c語言)


圖的基本操作:創建 刪除 遍歷 

創建:鄰接矩陣和鄰接表 十字鏈表 下面代碼是鄰接矩陣的定義和鄰接表的創建

遍歷:深度優先遍歷(一條路走到黑) 廣度優先遍歷(樹的層次遍歷)

具體代碼:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<conio.h>
int visited[20] = {0};//標記深度優先遍歷訪問過的節點 訪問過1 未訪問0
//鄰階矩陣存儲
struct pic {
    int picture[20][20];//假設此圖最大頂點數為20
    char data[20];//存放數據的頂點
    int e, top;//邊的數量 頂點的數量

};
//鄰階表存儲
struct anode
{
    int array;//數組元素的下標(對應邊的元素)
    struct anode* next;
};
struct node {
    char dat;//數據元素區域
    struct anode* link;
};
struct arc {
    struct node data[100];
    int e, top;
};
struct arc t;
void create_pir();//無向圖
void deep_b();//深度優先遍歷(主函數)
void deep_b1(int i);//遞歸函數
int find_fristnode(int i);//尋找第一個領節點
int next_node(int i, int w);//相對於i的下一個元素
void BFS(int i);//廣度優先遍歷
//廣度遍歷需用隊操作 定義一個隊列
struct queue {
    int a[20];//對中的元素    
    int top, base;
};
void chu_queue();
void enter_queue(int i);
void del_queue(int i);
struct queue  q;
int main()
{
    create_pir();
    BFS(0);
    return 0;
}
void create_pir()
{
    printf("請輸入頂點的數量和邊的數量:\n");
    scanf("%d %d", &t.top, &t.e);
    int i,s,d;
    printf("請輸入頂點的數據:\n");
    for (i = 0; i < t.top; i++)
    {
        t.data[i].link = NULL;
        std::cin>>t.data[i].dat;
    }
    for (i = 0; i < t.e; i++)
    {
        printf("請輸入對應的兩邊頂點的下標:\n");
        scanf("%d %d", &s, &d);
        //如果為有向圖 輸入以s為狐尾的節點 開辟一次空間就可
        struct anode* p;
        p = (struct anode*)malloc(sizeof(struct anode));
        p->array = d;
        p->next = t.data[s].link;
        t.data[s].link = p;
            p = (struct anode*)malloc(sizeof(struct anode));
            p->array = s;
            p->next = t.data[d].link;
            t.data[d].link = p;
    }
    }
void deep_b()
{

    int i;
    for (i = 0; i < t.top; i++)
    {
        if (visited[i] == 0)
        {
            //沒有等於0 深度優先遍歷
            deep_b1(i);
        }
    }
}
void deep_b1(int i)
{
    int a;//遍歷的結束條件
    int w;//記錄第一個鄰接結點元素的下標
    //假設鄰接表存儲
    printf("%c ", t.data[i].dat);
    visited[i] = 1;
    //如果是矩陣或者十字鏈表則執行相應操作
    //下面內容可根據圖的存儲構造函數 
    if (t.data[i].link != NULL)
    {
        w = t.data[i].link->array;
    }
    else
    {
        w = -1;
    }
    
    
    
    if (visited[w] == 0)
    {
        deep_b1(w);
    }
    else
    {
        return;
    }
        //條件不成立就尋找下一個領接點
    

}
void BFS(int i)
{
    int w;
    printf("%c ", t.data[i].dat);
    visited[i] = 1;
    chu_queue();
    enter_queue(i);
    while (q.top!=q.base)
    {
        del_queue(i);
        w = find_fristnode(i);
        while (w != -1)
        {
            if (visited[w] == 0) {
                printf("%c ", t.data[w].dat);
                enter_queue(w);
            }
            w = next_node(i,w);
        }
    }
}
void chu_queue()
{
    q.top = 0;
    q.base = 0;
}
int find_fristnode(int i)
{
    if (t.data[i].link != NULL)
    {
        return t.data[i].link->array;
    }
    else
    {
        return -1;
    }
}
int next_node(int i, int w)
{
    struct anode *p;
    p = t.data[i].link;
    while (p)
    {
        if (p->array != w&& p->array!=i)
        {
            return p->array;
        }
        p = p->next;
    }
    return -1;
}
void enter_queue(int i)
{
    q.a[q.top] = i;
    q.top++;
}
void del_queue(int i)
{
    q.top--;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM