#include<stdlib.h>
#include<stdio.h>
#define maxs 20
typedef char vertextype;
typedef enum{dg,udg,dn,udn}graphkind;
typedef struct arcnode
{
int adivex; //该弧所指结点位置
int weight; //权重
struct arcnode *nextarc; //指向下一条弧的指针
}arcnode;
typedef struct vnode
{
vertextype data; //顶点信息
arcnode *firstarc; //指向第一条依附该顶点弧的指针
}vnode;
typedef struct
{
vnode vexs[maxs];
int arcnum,vexnum; //弧数,顶点数
enum graphkind kind;
}algraph;
algraph *creat(algraph *p)
{
int num;
int choose;
vertextype ch;
printf("输入顶点数:");
scanf("%d",&num);
if(num==0)
p=NULL;
else
{
if(!(p=(algraph*)malloc(sizeof(algraph))))
{
printf("error!\n");
exit(0);
}
while(1)
{
system("cls");
printf("图的种类\n");
printf("1.有向图\n");
printf("2.无向图\n");
printf("3.有向网\n");
printf("4.无向网\n");
printf("请输入你的选择:");
scanf("%d",&choose);
switch(choose)
{
case 1:
{
p->kind=dg;
break;
}
case 2:
{
p->kind=udg;
break;
}
case 3:
{
p->kind=dn;
break;
}
case 4:
{
p->kind=udn;
break;
}
default:
{
printf("error input!\n");
system("pause");
}
}
if(choose>=1&&choose<=4)
break;
}
ch=getchar();
if(1)
{
int i,j;
arcnode *s;
p->vexnum=num;
p->arcnum=0;
printf("输入顶点:");
for(i=0;i<num;i++)
{
scanf("%c",&p->vexs[i].data);
if(!(p->vexs[i].firstarc=(arcnode*)malloc(sizeof(arcnode)))) //为第一个依附该顶点的弧申请空间
{
printf("error!\n");
exit(0);
}
p->vexs[i].firstarc->adivex=i;
}
for(i=0;i<num;i++)
{
ch=getchar(); //读入回车,避免回车读入数据中
p->vexs[i].firstarc->nextarc=NULL;
printf("输入%c可到达的顶点:",p->vexs[i].data);
while(1)
{
ch=getchar(); //数据输入
for(j=0;j<num;j++)
if(ch==p->vexs[j].data)
{
if(!(s=(arcnode*)malloc(sizeof(arcnode))))
{
printf("error!\n");
exit(0);
}
s->adivex=j;
if(p->kind==dn||p->kind==udn)
{
ch=getchar(); //读入回车,避免回车读入权重
printf("输入%d到%d权重:",p->vexs[i].firstarc->adivex,s->adivex);
scanf("%d",&s->weight);
}
s->nextarc=p->vexs[i].firstarc->nextarc;
p->vexs[i].firstarc->nextarc=s;
}
if(ch=='\n')
break;
}
}
for(i=0;i<num;i++)
{
s=p->vexs[i].firstarc->nextarc;
while(s!=NULL)
{
p->arcnum=p->arcnum+1; //图的数量为结点数
s=s->nextarc;
}
}
if(p->kind==udg||p->kind==udn) //网弧的数量为结点数一半
{
p->arcnum=p->arcnum/2;
}
}
}
return p;
}
void show(algraph *p)
{
int i;
arcnode *s;
if(p)
{
printf("图的种类:%d\n",p->kind);
printf("图的顶点数:%d\n",p->vexnum);
printf("图的弧数:%d\n",p->arcnum);
printf("图的邻接表:\n");
for(i=0;i<p->vexnum;i++)
{
s=p->vexs[i].firstarc;
printf("%c-%d",p->vexs[i].data,s->adivex);
while(s!=NULL)
{
s=s->nextarc;
if(s!=NULL)
printf("%3d %d",s->adivex,s->weight);
}
if(s==NULL)
printf("\n");
}
}
else
printf("无此图!\n");
}
int main()
{
algraph *p,s;
p=&s;
p=creat(p);
show(p);
system("pause");
return 0;
#include<stdio.h>
#define maxs 20
typedef char vertextype;
typedef enum{dg,udg,dn,udn}graphkind;
typedef struct arcnode
{
int adivex; //该弧所指结点位置
int weight; //权重
struct arcnode *nextarc; //指向下一条弧的指针
}arcnode;
typedef struct vnode
{
vertextype data; //顶点信息
arcnode *firstarc; //指向第一条依附该顶点弧的指针
}vnode;
typedef struct
{
vnode vexs[maxs];
int arcnum,vexnum; //弧数,顶点数
enum graphkind kind;
}algraph;
algraph *creat(algraph *p)
{
int num;
int choose;
vertextype ch;
printf("输入顶点数:");
scanf("%d",&num);
if(num==0)
p=NULL;
else
{
if(!(p=(algraph*)malloc(sizeof(algraph))))
{
printf("error!\n");
exit(0);
}
while(1)
{
system("cls");
printf("图的种类\n");
printf("1.有向图\n");
printf("2.无向图\n");
printf("3.有向网\n");
printf("4.无向网\n");
printf("请输入你的选择:");
scanf("%d",&choose);
switch(choose)
{
case 1:
{
p->kind=dg;
break;
}
case 2:
{
p->kind=udg;
break;
}
case 3:
{
p->kind=dn;
break;
}
case 4:
{
p->kind=udn;
break;
}
default:
{
printf("error input!\n");
system("pause");
}
}
if(choose>=1&&choose<=4)
break;
}
ch=getchar();
if(1)
{
int i,j;
arcnode *s;
p->vexnum=num;
p->arcnum=0;
printf("输入顶点:");
for(i=0;i<num;i++)
{
scanf("%c",&p->vexs[i].data);
if(!(p->vexs[i].firstarc=(arcnode*)malloc(sizeof(arcnode)))) //为第一个依附该顶点的弧申请空间
{
printf("error!\n");
exit(0);
}
p->vexs[i].firstarc->adivex=i;
}
for(i=0;i<num;i++)
{
ch=getchar(); //读入回车,避免回车读入数据中
p->vexs[i].firstarc->nextarc=NULL;
printf("输入%c可到达的顶点:",p->vexs[i].data);
while(1)
{
ch=getchar(); //数据输入
for(j=0;j<num;j++)
if(ch==p->vexs[j].data)
{
if(!(s=(arcnode*)malloc(sizeof(arcnode))))
{
printf("error!\n");
exit(0);
}
s->adivex=j;
if(p->kind==dn||p->kind==udn)
{
ch=getchar(); //读入回车,避免回车读入权重
printf("输入%d到%d权重:",p->vexs[i].firstarc->adivex,s->adivex);
scanf("%d",&s->weight);
}
s->nextarc=p->vexs[i].firstarc->nextarc;
p->vexs[i].firstarc->nextarc=s;
}
if(ch=='\n')
break;
}
}
for(i=0;i<num;i++)
{
s=p->vexs[i].firstarc->nextarc;
while(s!=NULL)
{
p->arcnum=p->arcnum+1; //图的数量为结点数
s=s->nextarc;
}
}
if(p->kind==udg||p->kind==udn) //网弧的数量为结点数一半
{
p->arcnum=p->arcnum/2;
}
}
}
return p;
}
void show(algraph *p)
{
int i;
arcnode *s;
if(p)
{
printf("图的种类:%d\n",p->kind);
printf("图的顶点数:%d\n",p->vexnum);
printf("图的弧数:%d\n",p->arcnum);
printf("图的邻接表:\n");
for(i=0;i<p->vexnum;i++)
{
s=p->vexs[i].firstarc;
printf("%c-%d",p->vexs[i].data,s->adivex);
while(s!=NULL)
{
s=s->nextarc;
if(s!=NULL)
printf("%3d %d",s->adivex,s->weight);
}
if(s==NULL)
printf("\n");
}
}
else
printf("无此图!\n");
}
int main()
{
algraph *p,s;
p=&s;
p=creat(p);
show(p);
system("pause");
return 0;
}