C語言實現常用數據結構——圖


#include<stdio.h>
#include<stdlib.h>
#define SIZE 20
#define LENGTH(a)  (sizeof(a)/sizeof(a[0]))
/*
 * 用鏈表存弧信息,一個存弧指向的頂點位置,第二存指向下條弧的指針,這樣就將一個頂點指向的所有弧串起來
 */
typedef struct enode {
    int v_index;
    struct enode *next_edge;
} enode;

/*
 * 在頂點存頂點名稱和第一條依附頂點的弧
 */
typedef struct vnode {
    char data;
    enode *first_edge;
} vnode;

/*
 * 用數組存頂點,並加上頂點數和邊數共同組成一個圖
 */
typedef struct graph {
    int v_num;
    int e_num;
    vnode vs[SIZE];
} graph;


/*
 * 返回ch在matrix矩陣中的位置
 */
static int get_position(graph g, char ch) {
    int i;
    for(i=0; i<g.v_num; i++) {
        if(g.vs[i].data==ch) {
            return i;
        }
    }
    return -1;
}

/*
 * 將enode鏈接到list的末尾
 */
static void link_last(enode *list, enode *node) {
    enode *p = list;

    while(p->next_edge) {
        p = p->next_edge;
    }
    p->next_edge = node;
}

/*
 * 創建圖
 */
graph *create_graph() {
    char c1,c2;
    char nodes[]= {'A','B','C','D','E','F','G'};
    char edges[][2] = {
        {'A', 'C'},
        {'A', 'D'},
        {'A', 'F'},
        {'B', 'C'},
        {'C', 'D'},
        {'E', 'G'},
        {'F', 'G'},
        {'D', 'G'},
        {'D', 'B'}
    };
    int v_len=LENGTH(nodes);
    int e_len=LENGTH(edges);
    int i,p1,p2;
    enode *enode1,*enode2;
    graph *pg;
    /*初始化並分配空間給圖指針*/
    if ((pg=(graph*)malloc(sizeof(graph))) == NULL ) {
        return NULL;
    }
    memset(pg, 0, sizeof(graph));
    pg->v_num = v_len;
    pg->e_num = e_len;
    
    /*初始化所有頂點*/
    for(i=0; i<pg->v_num; i++) {
        pg->vs[i].data = nodes[i];
        pg->vs[i].first_edge = NULL;
    }

    /*初始化所有邊,無向圖的邊為兩個頂點共有,按指向頂點來定義可以算兩條邊,因此要掛在兩個頂點的鄰接表后面*/
    for(i=0; i<pg->e_num; i++) {
        /*獲取頂點名*/
        c1 = edges[i][0];
        c2 = edges[i][1];
        /*獲取頂點在數組中的位置*/
        p1 = get_position(*pg, c1);
        p2 = get_position(*pg, c2);
        
        enode1 = (enode*)malloc(sizeof(enode));
        enode1->v_index = p2;
        /*若邊所依附的頂點尚無第一條邊,則將這條邊賦給頂點的first_edge,否則加在頂點的邊鏈表的最末尾*/
        if(pg->vs[p1].first_edge == NULL) {
            pg->vs[p1].first_edge = enode1;
        } else {
            link_last(pg->vs[p1].first_edge, enode1);
        }
        
        enode2 = (enode*)malloc(sizeof(enode));
        enode2->v_index = p1;
        if(pg->vs[p2].first_edge == NULL) {
            pg->vs[p2].first_edge = enode2;
        } else {
            link_last(pg->vs[p2].first_edge, enode2);
        }
    }

    return pg;
}

/*
 * 打印鄰接表圖
 */
void print_graph(graph g)
{
    int i,j,k;
    enode *node;

    printf("List Graph:\n");
    for (i = 0; i < g.v_num; i++)
    {
        printf("%d(%c): ", i, g.vs[i].data);
        node = g.vs[i].first_edge;
        while (node != NULL)
        {
            printf("%d(%c) ", node->v_index, g.vs[node->v_index].data);
            node = node->next_edge;
        }
        printf("\n");
    }
}

main() {
    /*創建圖,並打印圖*/
    graph *pg = create_graph();
    print_graph(*pg);
}
List Graph:
0(A): 2(C) 3(D) 5(F) 
1(B): 2(C) 3(D) 
2(C): 0(A) 1(B) 3(D) 
3(D): 0(A) 2(C) 6(G) 1(B) 
4(E): 6(G) 
5(F): 0(A) 6(G) 
6(G): 4(E) 5(F) 3(D)

 


免責聲明!

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



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