图的基本操作 (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--;
}

猜你喜欢

转载自www.cnblogs.com/qy00/p/12952836.html