邻接表

183 阅读1分钟
#include "iostream"
#include "iomanip"
#include "algorithm"
#define maxsize 10
using namespace std;
int visited[]={0};
struct arc_node   //边表
{
    int adjvex;    //邻接点下标
    arc_node*next_arc;  //指向下一条弧节点
};
 struct vertex_node     //存储顶点信息(顶点表)
{
    char vertex;    //顶点信息
    arc_node*first_arc;    //指向的第一条弧
};
//struct ALGgraph
//{
//    int vertexnum;
//    int acenum;
//    vertexnode adjlist[maxsize];
//};
class graph
{
private:
    vertex_node adjlist[maxsize]; //顶点表
    int vertexnum;
    int arcnum;
public:
    //创建一个图
    graph(int m,int n,char a[])
    //adjlist[]---顶点数据信息,vertexnum(m)---顶点个数,arcnum(n)---边的个数
    {
        arc_node*s=NULL;
        vertexnum=m;
        arcnum=n;
        //建立顶点表
        for(int i=0;i<vertexnum;i++)
        {
            adjlist[i].vertex=a[i];
            adjlist->first_arc=NULL;
            //将顶点信息存储在顶点表中,将该顶点边表的头指针初始化为NULL;
        }
        //边表
        int k,h;
        for(int j=0;j<arcnum;j++)// 依次输入边的信息并存储在边表中
        {
            //k,h是边所依附的两个顶点的编号
            cin>>k>>h; //逐个输入k:顶点下标
            //h:邻接点的编号
            arc_node *s=new arc_node ;//生成边表结点 s
            s->adjvex=h;  //邻接点的编号为h
            s->next_arc=adjlist[k].first_arc;//将结点 s 插入到第k个边表的表头
            //头插法
            adjlist[k].first_arc=s;
        }

    }
    //销毁图
    ~graph()
    {
        arc_node*p=NULL;
        arc_node*q=NULL;
        for(int i=0;i<vertexnum;i++)
        {
            p=adjlist[i].first_arc;
            q=adjlist[i].first_arc;
            //由于p,q现在都指向第一条弧,
            // 故先将p向后挪动一个,到第二个位置,
            // 然后删去q(也就是第一个弧),
            // 再令q=p(此时是第二个弧),
            // 二者交错一直循环,直至完全销毁图
            while(p!=NULL)
            {
                p=p->next_arc;
                free(q);
                q=p;
            }

        }
    }
    //深度优先遍历
    void DFS(int v)// 输入顶点的编号
    {
    cout<<"v"<<adjlist[v].vertex<<" ";//访问顶点 v
    visited[v]=1;//访问标志数组visited[n](记录访问的次数)
    arc_node *p=NULL;
    p=adjlist[v].first_arc;
        while (p!=NULL)
        {

            if(visited[p->adjvex]==0)
            {
                DFS(p->adjvex);
            }
            p=p->next_arc;
        }

    }
//    void DFS(int v)
//    {
//        int Stack[100];
//        int top =-1;
//        cout<<'v'<<v+1<<' ';
//        visited[v]  = 1;
//        Stack[++top] = v;//入栈
//        arc_node *p=NULL;
//        p=adjlist[v].first_arc;
//        while(top!=-1)
//        {
//            int i;
//            for (i=0;i<vertexnum;i++)
//                if ( p->adjvex==1&& visited[i]==0)
//                {
//                    v = i;
//                    Stack[++top] = v;//入栈
//                    cout<<'v'<<v+1<<' ';
//                    visited[v]  = 1;
//                    break;
//                }
//
//            if (i==vertexnum)
//            { top--;
//                v = Stack[top];}//出栈
//        }
//    }
    //广度优先遍历
    void BFS(int v)
    {
    arc_node*p=NULL;
    int Q[maxsize];
    int front =-1;
    int rear=-1;
    cout<<adjlist[v].vertex;
    visited[v]=1;
    Q[++rear]=v;
        while (front!=rear)
        {
            int i=Q[++front];
            p=adjlist[i].first_arc;
            while(p!=NULL)
            {
                int j=p->adjvex;
                if(visited[j]==0)
                {
                    cout<<adjlist[j].vertex;
                    visited[j]=1;
                    Q[++rear]=j;
                }
                p=p->next_arc;
            }
        }
    }
    void print_pic()
    {
        for(int i=0;i<vertexnum;i++)
        {
            cout<<"v"<<adjlist[i].vertex<<" ";
        }
        cout<<endl;

    }
};
int main()
{
    char a='0',b='1',c='2',d='3',e='4';
    char arr[]={a,b,c,d,e};
    graph g(5,7,arr);
    g.print_pic();
    g.DFS(1);
    g.BFS(1);
    g.~graph();
}