#includde<iostream> #include<cstdio> #include<cstdio> using namespace std; const int manx=100; struct ArcNode//边结点 { int adjvex;//有向边的另一个邻接点的序号 ArcNode *nextarc;//指向下一个边结点的指针 }; struct VNode//顶点 { int data;//顶点信息 ArcNode *head1;//出边表表头指针 ArcNode *head2;//入边表表头指针 }; struct LGraph//图的邻接表存储结构 { VNode vertexs[maxn];//顶点数组 int vexnum,arcnum;//顶点数和边数 }; LGraph lg;//图(邻接表存储) void CreateLG()//构造有向图G,顶点编号从0开始 { ArcNode *pi;//用来构造边链表的边结点指针 int v1,v2;//有向边的两个顶点 for(int i=0;i<lg.vernum;i++)//初始化表头指针 lg.vertexs[i].head1=lg.vertexs[i].head2=NULL; for(int i=0;i<lg.arcnum;i++) { scanf("%d%d",&v1,&v2);//输入一条边的起点和终点 v1--;v2--;//顶点下标,顶点从1计数 pi=new ArcNode;//假定空间足够 pi->adjvex=v2; pi->nextarc=lg.vertexs[v1].head1;//插入出边表 lg.vertexs[v1].head1=pi;//更新 pi=new ArcNode;//假定空间足够 pi->adjvex=v1; pi->nextarc=lg.vertexs[v2].head2;//插入入边表 lg.vertexs[v2].head2=pi;//更新 } } void DeletLG() { ArcNode *pi; for(int i=0;i<lg.vexnum;i++) { pi=lg.vertexs[i].head1; while(pi!=NULL)//释放第i个顶点出边表各结点的空间 { lg.vertexs[i].head1=pi->nextarc; delete pi; pi=lg.vertexs[i].head1; } pi=lg.vertexs[i].head2; while(pi!=NULL)//释放第i个顶点入边表各结点的空间 { lg.vertexs[i].head2=pi->nextarc; delete pi; pi=lg.vertexs[i].head2; } } } int main() { int od,id;//顶点的入度和出度 ArcNode *pi;//遍历边链表的指针 while(1) { lg.vexnum=lg.arcnum=0; scanf("%d%d",&lg.vexnum,&lg.arcnum); if(lg.vexnum==0) break;//输入数据结束 CreateLG(); for(int i=0;i<lg.vexnum;i++)//统计出度 { od=0; pi=lg.vertexs[i].head1; while(pi!=NULL) { od++; pi=pi->nextarc; } if(i==0) printf("%d",od); else printf(" %d",od); } printf("\n"); for(int i=0;i<lg.vexnum;i++)//统计入度 { id=0; pi=lg.vertexs[i].head2; while(pi!=NULL) { id++; pi=pi->nextarc; } if(i==0) printf("%d",id); else printf(" %d",id); } printf("\n"); DeleteLG(); } return 0; }
对着书敲了一遍。。。。
究竟是我抛弃了历史,还是历史遗弃了我。