7-2 邻接表存储实现有向网构建

7-2 邻接表存储实现有向网构建

编程实现:以邻接表的存储方式,创建一个有向网,顶点为字符型。

输入格式:

第一行输入顶点个数和边的个数,中间用空格分开。下一行开始依次输入顶点,空格或回车分开。接着依次输入边依附的两个顶点和权值,空格分开。

输出格式:

若数据合理,则输出对应的邻接表形式,见样例,邻接点下标与权值空格分开。若顶点个数为0,则输出"error"。若顶点个数为1,边个数不合理,则输出"error"

输入样例:

在这里给出一组输入。例如:

4 4
a b c d
a b 1
a c 1
c d 1
d a 1

输出样例:

在这里给出相应的输出。例如:

a->2 1->1 1
b
c->3 1
d->0 1

分析:

邻接表:需要三个结构体
有向网的建立时候:输入点边数,存结点,直接开始输入边依附的点v1,v2还有权值,定位v1,v2返回值不合法就是没找到,error=0(便于在主函数中判断创建过程是否有误),使用头插法,因为是有向的,所以只需要创建一个结点就好了.

#include
using namespace std;
//邻接表:顶点表、边表、邻接表
#define MVNum 100
typedef char OtherInfo;
typedef struct ArcNode//边表
{
    int adjvex;//下标
    struct ArcNode *nextarc;//指向下一个边表
    int info;//其他信息(权值,类型int)
}ArcNode;
typedef struct VNode//顶点
{
    char data;
    struct ArcNode *firstarc;
}VNode,AdjList[MVNum];
typedef struct//邻接表
{
    AdjList ver;
    int vexnum,arcnum;
}ALGraph;
int LocateVex(ALGraph G,char v)
{//在表头结点查找v
    for(int i=0;i<MVNum;i++){
        if(G.ver[i].data==v)return i;
    }
    return -1;
}
void Create(ALGraph &G,int &error)
{//创建有向网,如果有顶点输入信息有无,存放信息在error中
    cin>>G.vexnum>>G.arcnum;//输入顶点和边数
    for(int i=0;i<G.vexnum;i++)
    {
        cin>>G.ver[i].data;//输入顶点信息到表头
        G.ver[i].firstarc=NULL;//指向空
    }
    for(int k=0;k<G.arcnum;k++)
    {
        char v1,v2;//这个不要忘记写了!
        int w;//这个不要忘记写!!
        cin>>v1>>v2>>w;
        int i=LocateVex(G,v1),j=LocateVex(G,v2);
        if(i==-1||j==-1) error=0;
        else{//有向网
            struct ArcNode *p1=new ArcNode;
            p1->adjvex=j;//在i后面插入j边表,头插法
            p1->info=w;
            p1->nextarc=G.ver[i].firstarc;
            G.ver[i].firstarc=p1;
        }
    }
}
int main()
{
    ALGraph G;
    int error=1;//int error;初始化为1,否则默认为0,在Create函数中只在出现错误时修改为0,后面会出现错误
    Create(G,error);
    if(G.vexnum==0||(G.vexnum==1&&G.arcnum>1)||error==0)cout<<"error";
    else{
        for(int i=0;i<G.vexnum;++i)
        {
            cout<<G.ver[i].data;
            struct ArcNode *p=G.ver[i].firstarc;
            while(p!=NULL){
                cout<<"->"<<p->adjvex<<" "<<p->info;
                p=p->nextarc;
            }
            cout<<endl;
        }
    }
    return 0;
}

测试点:

7-2 邻接表存储实现有向网构建_第1张图片

你可能感兴趣的:(数据结构)