临接表

2邻接表

  • 邻接表的C语言描述

  • 基本运算的算法——建立无向网的邻接表、求图中与顶点i邻接的第一个顶点、求图中顶点i相对于顶点j的下一个邻接点、若图G中存在顶点u,则返回该顶点在图中的位置、图的广度优先遍历、图的深度优先遍历2.

 

#include<iostream>
#include<string.h>
#include<cstdio>
using namespace std;
class linjiebiao
{
public:
    struct Node
    {
        int data;
        Node * next;
        int flag;
        Node ():next(NULL) {}
        Node (int a,int b):data(a),flag(b),next(NULL) {}
    };
    Node * ljbsz;
    Node * cur;
    int *visit;
    int maxsize;
    linjiebiao(int tem = 10)
    {
        maxsize = tem;
        ljbsz = new Node[maxsize];
        for(int i = 0 ; i < maxsize ; i++)
        {
            //ljbsz[i].data = i;
            ljbsz[i].flag = 0;
        }
        cur = ljbsz;
        visit = new int[maxsize];
        memset(visit , 0 , sizeof(int)*maxsize);
    }
    void creat()
    {

        for(int i = 0 ; i < maxsize ; i++)
        {
            cout<<"please input "<<i<<" point"<<endl;
            cur = ljbsz+i;
            //freopen("in.cpp","r",stdin);
            while(1)
            {
                int tem;
                cin>>tem;
                if(tem==-1)
                {
                    cur -> next = NULL;
                    break;
                }
                else
                {
                    Node * temnode = new Node(tem,1);
                    cur -> next = temnode;
                    cur = cur -> next;
                }
            }
        }
    }
    void print()
    {
        for(int i = 0 ; i < maxsize ; i++)
        {
            cur = &ljbsz[i];
            cur = cur -> next;
            while(cur!= NULL)
            {
                if(cur -> flag==1)cout<<cur->data<<" ";
                cur = cur -> next;
            }
            cout<<endl;
        }
    }
    void chazhaodian(int a)//求图中与顶点i邻接的第一个顶点
    {
        cout<<ljbsz[a-1].next -> data<<endl;
    }
    void chazhaoweizhi(int a)//若图G中存在顶点u,则返回该顶点在图中的位置
    {
        cur = &ljbsz[a];
        cur = cur -> next;
        cout<<"yu "<<a<<" xiang lin de dian you:"<<endl;
        while(cur != NULL)
        {
            cout<<cur->data<<" ";
            cur = cur -> next;
        }
        cur = ljbsz;
    }
    void dfs(Node * tem)
    {
        while(tem)
        {
            if(tem->flag == 1)
            {
                if(!visit[tem->data])
                {
                    cout << tem->data << " ";
                    visit[tem->data] = 1;
                    dfs(ljbsz+tem->data);
                }
            }
            tem = tem->next;
        }
    }
    void bfs()
    {
        cout<<"begining bfs!!!!!!!!!!!!!!!!!!!!!!!"<<endl;
        int temsz[maxsize+1];
        int Front;
        int rear;
        memset( visit , 0 , sizeof(int)*maxsize);
        temsz[0] = 0;
        Front = temsz[0];
        rear = Front + 1;
        visit[0] = 1;
        while(Front != rear)
        {

            cur = ljbsz[temsz[Front]].next;
            while ( cur != NULL )
            {
                if(visit[cur->data]==0)
                {
                    temsz[rear++] = cur -> data;
                    visit[cur->data] = 1;
                }
                cur = cur -> next;
            }
            cout<<temsz[Front]<<" ";
            Front ++;
        }
    }

};
int main()
{
    int j = 5;
    linjiebiao duskcl(j);
    duskcl.creat();
    int tem = 2;
    cout<<"求图中与顶点2邻接的第一个顶点"<<endl;
    duskcl.chazhaodian(2);
    cout<<endl;
    cout<<"若图G中存在顶点2,则返回该顶点在图中的位置"<<endl;
    duskcl.chazhaoweizhi(tem);
    cout<<endl;
    cout<<"图的深度优先遍历"<<endl;
    duskcl.cur = &duskcl.ljbsz[0];
    duskcl.dfs(duskcl.ljbsz);
    cout<<endl;
    cout<<"图的广度优先遍历"<<endl;
    duskcl.bfs();
}

  

 

  

 

posted @ 2014-06-29 22:05  DuskL  阅读(398)  评论(0编辑  收藏  举报