示例#1
0
//Function use: G中删除弧<v,w>,若是无向,还删除<w,v>
Status DeleteArc(MGraph *pG, VertexType v, VertexType w)
{
	int nSeqV;
	int nSeqW;
	nSeqV = LocateVex(*pG, v);
	nSeqW = LocateVex(*pG, w);
	if (nSeqV < 0 || nSeqW < 0)
	{
		return ERROR;
	}
	else
	{
		if (DN == (*pG).kind || AN == (*pG).kind)
		{
			(*pG).arcs[nSeqV][nSeqW].adj = INFINITY;
		}
		else
		{
			(*pG).arcs[nSeqV][nSeqW].adj = 0;
		}
		if (NULL != (*pG).arcs[nSeqV][nSeqW].info)
		{
			free((*pG).arcs[nSeqV][nSeqW].info);
			(*pG).arcs[nSeqV][nSeqW].info = NULL;
		}
		if (AG == (*pG).kind || AN == (*pG).kind)
		{
			(*pG).arcs[nSeqW][nSeqV].adj = (*pG).arcs[nSeqV][nSeqW].adj;
			(*pG).arcs[nSeqW][nSeqV].info = NULL;
		}
		(*pG).arcnum--;
	}

	return OK;
}
void CreateUDN(MGraph &G)
{
	int i, j, k, IncInfo;
	VRType w;
	VertexType v1, v2;

	printf("请输入无向网G的顶点数,边数,边是否含相关信息(是:1 否:0):");
	scanf("%d,%d,%d", &G.vexnum, &G.arcnum, &IncInfo);
	printf("请输入%d个顶点的值(名称<%d个字符):\n", G.vexnum, MAX_NAME);
	for (i = 0; i < G.vexnum; ++i)
		Input(G.vexs[i]);
	for (i = 0; i < G.vexnum; ++i)
		for (j = 0; j < G.vexnum; ++j) {
			G.arcs[i][j].adj = INFINITY;
			G.arcs[i][j].info = NULL;
		}
	printf("请输入%d条边的顶点1 顶点2 权值:\n", G.arcnum);
	for (k = 0; k < G.arcnum; ++k) {
		scanf("%s%s%d%*c", v1.name, v2.name, &w);
		i = LocateVex(G, v1);
		j = LocateVex(G, v2);
		G.arcs[i][j].adj = w;
		if (IncInfo)
			InputArc(G.arcs[i][j].info);

		G.arcs[j][i] = G.arcs[i][j];
	}
	G.kind = UDN;
}
示例#3
0
Status CreateDG(MGraph *G){
	int IncInfo;
	printf("输入顶点数, 弧数, 其他信息\n");
	scanf("%d %d %d", &(*G).vexnum, &(*G).arcnum, &IncInfo);

	int i, j, k;
	printf("输入顶点\n");
	for(i = 0; i < (*G).vexnum; i++){
		getchar();
		scanf("%c", &(*G).vexs[i]);
	}

	for(i = 0; i < (*G).vexnum; i++){
		for(j = 0; j < (*G).vexnum; j++){
			(*G).arcs[i][j].adj = 0;
			(*G).arcs[i][j].info = NULL;
		}
	}

	VertexType v1, v2;
	int w;
	printf("输入弧的初始点和终端点\n");
	for(k = 0; k < (*G).arcnum; k++){
		getchar();
		scanf("%c %c", &v1, &v2);
		// printf("%c %c %d\n", v1, v2);
		i = LocateVex((*G), v1);
		j = LocateVex((*G), v2);
		// printf("%d %d %d\n", i, j, w);
		(*G).arcs[i][j].adj = 1;
		if(IncInfo){
			// Input(*(*G).arcs[i][j].info);
		}
	}
}
示例#4
0
 Status InsertArc(OLGraph *G,VertexType v,VertexType w)
 { /* 初始条件: 有向图G存在,v和w是G中两个顶点 */
   /* 操作结果: 在G中增添弧<v,w> */
   int i,j;
   int IncInfo;
   char str[MAX_Info];
   ArcBox *p;
   i=LocateVex(*G,v); /* 弧尾的序号 */
   j=LocateVex(*G,w); /* 弧头的序号 */
   if(i<0||j<0)
     return ERROR;
   p=(ArcBox *)malloc(sizeof(ArcBox)); /* 生成新结点 */
   p->tailvex=i; /* 给新结点赋值 */
   p->headvex=j;
   p->hlink=(*G). xlist[j].firstin; /* 插在入弧和出弧的链头 */
   p->tlink=(*G). xlist[i].firstout;
   (*G). xlist[j].firstin=(*G). xlist[i].firstout=p;
   (*G). arcnum++; /* 弧数加1 */
   printf("要插入的弧是否含有其它信息(是: 1,否: 0): ");
   scanf("%d",&IncInfo);
   if(IncInfo)
   {
     printf("请输入该弧的相关信息(<%d个字符): ",MAX_Info);
     scanf("%s",str);
     p->info=(InfoType *)malloc((strlen(str)+1)*sizeof(InfoType));
     strcpy(p->info,str);
   }
   else
     p->info=NULL;
   return OK;
 }
void CreateDG(MGraph &G)
{
	int i, j, k, IncInfo;
	VertexType v1, v2;

	printf("请输入有向图G的顶点数,弧数,弧是否含相关信息(是:1 否:0):");
	scanf("%d,%d,%d", &G.vexnum, &G.arcnum, &IncInfo);
	printf("请输入%d个顶点的值(名称<%d个字符):\n", G.vexnum, MAX_NAME);
	for (i = 0; i < G.vexnum; ++i)
		Input(G.vexs[i]);
	for (i = 0; i < G.vexnum; ++i)
		for (j = 0; j < G.vexnum; ++j) {
			G.arcs[i][j].adj = 0;
			G.arcs[i][j].info = NULL;
		}
	printf("请输入%d条弧的弧尾 弧头:\n", G.arcnum);
	for (k = 0; k < G.arcnum; ++k) {
		scanf("%s%s%*c", v1.name, v2.name);
		i = LocateVex(G, v1);
		j = LocateVex(G, v2);
		G.arcs[i][j].adj = 1;
		if (IncInfo)
			InputArc(G.arcs[i][j].info);
	}
	G.kind = DG;
}
示例#6
0
Status CreateDG(OLGraph &G) {  // 算法7.3
  // 采用十字链表存储表示,构造有向图G(G.kind=DG)。
  //scanf(&G.vexnum, &G.arcnum, &IncInfo);  
  int i,j,k;
  char v1,v2;
  int IncInfo=0;
  struct ArcBox *p;
  scanfInit();  // 输入初始化
  scanf(&G.vexnum, &G.arcnum, &IncInfo);  // 自定义输入函数
  for (i=0; i<G.vexnum; ++i) {            // 构造表头向量
    scanf(&G.xlist[i].data);              // 输入顶点值
    G.xlist[i].firstin = G.xlist[i].firstout = NULL;  // 初始化指针
  }
  for (k=0; k<G.arcnum; ++k) {  // 输入各弧并构造十字链表
    scanf(&v1, &v2);            // 输入一条弧的始点和终点
    i=LocateVex(G, v1);  j=LocateVex(G, v2); // 确定v1和v2在G中位置
		
    p=(ArcBox *) malloc (sizeof (ArcBox));     // 假定有足够空间
       // *p = {i, j, G.xlist[j].firstin, G.xlist[i].firstout, NULL} 
       // {tailvex, headvex, hlink, tlink, info}
    p->tailvex=i;
    p->headvex=j;
    p->hlink=G.xlist[j].firstin;
    p->tlink=G.xlist[j].firstout;
    G.xlist[j].firstin = G.xlist[i].firstout = p; 
        // 完成在入弧和出弧链头的插入
    //if (IncInfo) Input(*p->info); // 输入弧含有相关信息,此略!!!
  }
  return OK;
} // CreateDG
示例#7
0
文件: 1-105.c 项目: Jzhi/C-repository
Status InsertArc(AMLGraph *G,VertexType v,VertexType w)
{ /* 初始条件: 无向图G存在,v和W是G中两个顶点 */
  /* 操作结果: 在G中增添弧<v,w> */
  int i,j,l,IncInfo;
  char s[MAX_INFO];
  EBox *p;
  i=LocateVex(*G,v); /* 一端 */
  j=LocateVex(*G,w); /* 另一端 */
  if(i<0||j<0)
    return ERROR;
  p=(EBox*)malloc(sizeof(EBox));
  p->mark=unvisited;
  p->ivex=i;
  p->jvex=j;
  p->info=NULL;
  p->ilink=(*G).adjmulist[i].firstedge; /* 插在表头 */
  (*G).adjmulist[i].firstedge=p;
  p->jlink=(*G).adjmulist[j].firstedge; /* 插在表头 */
  (*G).adjmulist[j].firstedge=p;
  printf("该边是否有相关信息(1:有 0:无): ");
  scanf("%d%*c",&IncInfo); /* 吃掉回车符 */
  if(IncInfo) /* 边有相关信息 */
  {
    printf("请输入该边的相关信息(<%d个字符):",MAX_INFO);
    gets(s);
    l=strlen(s);
    if(l)
    {
      p->info=(char*)malloc((l+1)*sizeof(char));
      strcpy(p->info,s);
    }
  }
  (*G).edgenum++;
  return OK;
}
示例#8
0
Status CreateUDN(MGraph &G) {//  算法 7.2
  // 采用数组(邻接矩阵)表示法,构造无向网G。
  int i,j,k,w; 
  VertexType  v1,v2; 
  printf("G.vexnum :" );  scanf("%d",&G.vexnum);
  printf("G.arcnum :");   scanf("%d",&G.arcnum);   
  getchar();  /*** 加上此句getchar()!!! ***/
  // scanf("%d,%d,%d",&G.vexnum, &G.arcnum, &IncInfo);      
  for (i=0; i<G.vexnum; i++ ) { 
    printf("G.vexs[%d] : ",i);
    scanf("%c",&G.vexs[i]); 
    getchar();
  } // 构造顶点向量
  for (i=0; i<G.vexnum; ++i )  // 初始化邻接矩阵
    for (j=0; j<G.vexnum; ++j ) {
      G.arcs[i][j].adj = INFINITY; //{adj,info}
      G.arcs[i][j].info= NULL;
    }
  for (k=0; k<G.arcnum; ++k ) {  // 构造邻接矩阵
    printf("v1 (char) : ");  scanf("%c", &v1);getchar();
    printf("v2 (char) : ");  scanf("%c", &v2);getchar();
    printf("w (int) : " );   scanf("%d", &w); getchar();   
                             // 输入一条边依附的顶点及权值
    i = LocateVex(G, v1);  j = LocateVex(G, v2);    
          // 确定v1和v2在G中位置
    G.arcs[i][j].adj = w;                // 弧<v1,v2>的权值
    // if (IncInfo) scanf(G.arcs[i][j].info); // 输入弧含有相关信息
    G.arcs[j][i].adj = G.arcs[i][j].adj; // 置<v1,v2>的对称弧<v2,v1>
  }
  return OK;
} // CreateUDN
示例#9
0
Status CreateUDN(MGraph &G)//无向网
{
	int IncInfo;
	int i,j,k;
	int v1,v2;
	int w;//权重
	printf("请输入当前顶点数和弧度数:");

	scanf("%d%d",&G.vexnum,&G.arcnum);//如果IncInfo,表示弧没有信息
//	scanf("%d",&IncInfo);

	printf("请依次输入顶点:\n");
	for(i=0;i<G.vexnum;i++)
		scanf("%d",&G.vexs[i]); //构造顶点向量矩阵

	for(i=0;i<G.vexnum;i++)//初始化邻接矩阵
		for(j=0;j<G.vexnum;j++)
		{
			G.arcs[i][j].adj=0;
			G.arcs[i][j].info=NULL;
		}

	printf("请输入两个邻接点及其权重\n");
	for(k=0;k<G.arcnum;k++)//根据弧度数输入顶点
	{
		scanf("%d%d%d",&v1,&v2,&w);
		i=LocateVex(G,v1);
		j=LocateVex(G,v2);
		G.arcs[i][j].adj=w;//给v1和v2赋上权重
		G.arcs[j][i].adj=w;
//		if(IncInfo)
//			scanf("%c",&(*(G.arcs[i][j].info)));
	}
	return OK;
}//CreateUDN
示例#10
0
/**
 * 建立有向图十字链表
 */
Status CreateDG(OLGraph &G)
{
	int i = 0,j = 0,k = 0;
	VertexType v1, v2;
	ArcBox *p;
	int IncInfo = 0;
	printf("输入顶点数、弧数、弧信息标志(空格分隔):\n");
	scanf("%d %d %d", &G.vexnum, &G.arcnum, &IncInfo);  //IncInfo为0则不含其他信息
	getchar();  //接收最后的换行符
	printf("输入%d个表头结点向量:\n", G.vexnum);
	for (i = 0; i < G.vexnum; ++i)
	{
		scanf("%c", &G.xlist[i].data); //输入顶点值
		G.xlist[i].firstin = NULL;   //初始化指针
		G.xlist[i].firstout = NULL;
	}
	getchar();
	for (k = 0; k < G.arcnum; ++k)  //输入各弧并构造十字链表
	{
		printf("输入一条弧的起点和终点:\n");
		scanf("%c %c", &v1, &v2);   //输入一条弧的始点和终点
		getchar();
		i = LocateVex(G, v1);
		j = LocateVex(G, v2);
		p = (ArcBox*)malloc(sizeof(ArcBox));
		if (!p)
			return OVERFLOW;
		*p = { i, j, G.xlist[j].firstin, G.xlist[i].firstout, NULL };
		G.xlist[i].firstout = G.xlist[j].firstin = p;
		if (IncInfo)
			Input(p->info);  //若弧含相关信息,输入
	}

	return OK;
}
示例#11
0
//利用邻接多重表存储结构,构造无向图G
void CreateGraph (struct Graph *G)
{
    int VertexInfo;//是否含顶点信息
    int EdgeInfo;//是否含边信息
    int i, j, k;
    char s[MAX_INFO];
    struct VertexType a, b;
    struct EdgeTyle *p;

    prinf("请输入无向图G的顶点个数,顶点是否含其他信息(是:1,否:0):");
    scanf("%d%d",G->vexnum, &VertexInfo);
    printf("请输入%d个顶点的值\n",G->vexnum);
    for (i = 0; i < G->vexnum; i++)
    {
        scanf("%s", &G->adjmulist[i].data.name);
        G->adjmulist[i].firstedge = NULL;
        //顶点其他信息
        if (VertexInfo)
        {
            printf("输入该顶点其他信息:\n");
            scanf("%s",s);
            int length = strlen(s);
            if (length)
            {
                G->adjmulist[i].data.info = (char *) malloc ((length + 1) * sizeof (char));
                strcpy(G->adjmulist[i].data.info, s);
            }//end if
        }//end if
    }//end for
    printf("请输入边的条数,边是否含其他信息(是:1,否0):");
    scanf("%d%d",G->edgenum, &EdgeInfo);
    printf("输入每条边的两个端点以及该边的长度,空格分割\n");
    for (k = 0; k < G->edgenum; k++)
    {
        scanf("%s%s",a.name, b.name);
        i = LocateVex(&G, a);
        j = LocateVex(&G, b);
        p = (struct EdgeTyle *) malloc (sizeof(struct EdgeTyle));
        p->ivex = i;
        p->jvex = j;
        p->info = NULL;
        p->ilink = G->adjmulist[i].firstedge;//插在表头
        G->adjmulist[i].firstedge = p;
        p->jlink = G->adjmulist[j].firstedge;//插在表头
        G->adjmulist[j].firstedge = p;
        scanf("%d",&p->length);
        if (EdgeInfo)
        {
            printf("输该边其他信息:\n");
            scanf("%s",s);
            int length = strlen(s);
            if (length)
            {
                p->info = (char *) malloc ((length + 1) * sizeof (char));
                strcpy(p->info, s);
            }
        }//end if
    }//end for
}
示例#12
0
void InsertArc(MGraph &G,VertexType v,VertexType w)//在G图中添加<v,w>序列
{
	int i,j;//获取w和v在矩阵当中的位置
	i=LocateVex(G,v);
	j=LocateVex(G,w);
	G.arcs[i][j].adj=1;
	G.arcs[j][i].adj=1;//对称弧
}
示例#13
0
Status NextAdjVex(MGraph G,VertexType v,VertexType w)//返回w的的下一个邻接顶点
{
	int i=LocateVex(G,v);
	int k=LocateVex(G,w);
	for(int j=k;j<G.vexnum;j++)
		if(G.arcs[i][j].adj==1&&j>k)
			return G.vexs[j];
	return ERROR;
}
/*
* @description:创建无向图
* @more:分几步来做
	1.确定顶点数/弧数
	2.确定各个顶点的值
	3.初始化邻接矩阵
	4.确定邻接矩阵
*/
Status CreateUDG(MGraph *G) {
	int i,j,k,infoflag,len;
	char c;
	//设置一个暂存区和一个临时指针
	char str[MAX_INFO];
	char *info;

	VertexType v1,v2;

	len = 0;

	//确定顶点数/弧数
	printf("please enter vexnum, arcnum is info(1 or 0):");
	scanf("%d,%d,%d",&(*G).vexnum,&(*G).arcnum,&infoflag);

	//确定各个顶点的值
	printf("the value of each vertex:");
	for(i = 0;i < (*G).vexnum ; i++)
		scanf("%d,",&(*G).vexs[i]);
	
	//初始化邻接矩阵
	for(i = 0; i < (*G).vexnum; i++) 
		for(j = 0;j < (*G).vexnum ; j++) {
			(*G).arcs[i][j].adj = 0;	//无向图
			(*G).arcs[i][j].info = NULL;
		}


	//确定邻接矩阵
	printf("please %d heads and %d tails:\n",(*G).vexnum,(*G).arcnum);
	for(k = 0; k < (*G).arcnum; k++) {
		scanf("%d,%d",&v1,&v2);
		
		i = LocateVex(*G,v1);
		j = LocateVex(*G,v2);

		if(i >= 0 && j >= 0)
			(*G).arcs[i][j].adj = (*G).arcs[j][i].adj = 1;	//无向图,对称矩阵
		//如果顶点有附带信息,则输入并申请空间
		if(infoflag) {
			printf("please enter the info:");
			while( (c = getchar()) != '#')
				str[len++] = c;

			info = (char *) malloc(len * sizeof(char));
			str[len] = '\0';

			strcpy(info,str);

			(*G).arcs[i][j].info = (*G).arcs[j][i].info = info;
		}
	}

	(*G).kind = UDG;

	return OK;
}
示例#15
0
文件: 1-107.c 项目: Jzhi/C-repository
Status CreateGraph(ALGraph *G)
{ /* 采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造4种图) */
  int i,j,k;
  int w; /* 权值 */
  VertexType va,vb;
  ArcNode *p;
  printf("请输入图的类型(有向图:0,有向网:1,无向图:2,无向网:3): ");
  scanf("%d",&(*G).kind);
  printf("请输入图的顶点数,边数: ");
  scanf("%d,%d",&(*G).vexnum,&(*G).arcnum);
  printf("请输入%d个顶点的值(<%d个字符):\n",(*G).vexnum,MAX_NAME);
  for(i=0;i<(*G).vexnum;++i) /* 构造顶点向量 */
  {
    scanf("%s",(*G).vertices[i].data);
    (*G).vertices[i].firstarc=NULL;
  }
  if((*G).kind==1||(*G).kind==3) /* 网 */
    printf("请顺序输入每条弧(边)的权值、弧尾和弧头(以空格作为间隔):\n");
  else /* 图 */
    printf("请顺序输入每条弧(边)的弧尾和弧头(以空格作为间隔):\n");
  for(k=0;k<(*G).arcnum;++k) /* 构造表结点链表 */
  {
    if((*G).kind==1||(*G).kind==3) /* 网 */
      scanf("%d%s%s",&w,va,vb);
    else /* 图 */
      scanf("%s%s",va,vb);
    i=LocateVex(*G,va); /* 弧尾 */
    j=LocateVex(*G,vb); /* 弧头 */
    p=(ArcNode*)malloc(sizeof(ArcNode));
    p->adjvex=j;
    if((*G).kind==1||(*G).kind==3) /* 网 */
    {
      p->info=(int *)malloc(sizeof(int));
      *(p->info)=w;
    }
    else
      p->info=NULL; /* 图 */
    p->nextarc=(*G).vertices[i].firstarc; /* 插在表头 */
    (*G).vertices[i].firstarc=p;
    if((*G).kind>=2) /* 无向图或网,产生第二个表结点 */
    {
      p=(ArcNode*)malloc(sizeof(ArcNode));
      p->adjvex=i;
      if((*G).kind==3) /* 无向网 */
      {
        p->info=(int*)malloc(sizeof(int));
        *(p->info)=w;
      }
      else
        p->info=NULL; /* 无向图 */
      p->nextarc=(*G).vertices[j].firstarc; /* 插在表头 */
      (*G).vertices[j].firstarc=p;
    }
  }
  return OK;
}
示例#16
0
void CreateGraph(ALGraph *G)
{ /* 采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造4种图) */
	int i,j,k;
	int w; /* 权值 */
	VertexType va,vb;
	ArcNode *p;
	//printf("Enter the type of map:(0~3): ");
	scanf("%d",&(*G).kind);
	//printf("Enter Vertex number,Arc number: ");
	scanf("%d%d",&(*G).vexnum,&(*G).arcnum);
	//printf("Enter %d Vertex :\n",(*G).vexnum);
	for(i=0;i<(*G).vexnum;++i) /* 构造顶点向量 */
	{
		scanf("%s",(*G).vertices[i].data);
		(*G).vertices[i].firstarc=NULL;
	}
	//if((*G).kind==1||(*G).kind==3) /* 网 */
	//	printf("Enter order every arc weight,head and tail (Takes the gap by the blank space ):\n");
	//else /* 图 */
	//	printf("Enter order every arc head and tail (Takes the gap by the blank space ):\n");
	for(k=0;k<(*G).arcnum;++k) /* 构造表结点链表 */
	{
		if((*G).kind==1||(*G).kind==3) /* 网 */
		scanf("%d%s%s",&w,va,vb);
		else /* 图 */
		scanf("%s%s",va,vb);
		i=LocateVex(*G,va); /* 弧尾 */
		j=LocateVex(*G,vb); /* 弧头 */
		p=(ArcNode*)malloc(sizeof(ArcNode));
		p->adjvex=j;
		if((*G).kind==1||(*G).kind==3) /* 网 */
		{
			p->info=(int *)malloc(sizeof(int));
			*(p->info)=w;
		}
		else
		p->info=NULL; /* 图 */
		p->nextarc=(*G).vertices[i].firstarc; /* 插在表头 */
		(*G).vertices[i].firstarc=p;
		if((*G).kind>=2) /* 无向图或网,产生第二个表结点 */
		{
			p=(ArcNode*)malloc(sizeof(ArcNode));
			p->adjvex=i;
			if((*G).kind==3) /* 无向网 */
			{
				p->info=(int*)malloc(sizeof(int));
				*(p->info)=w;
			}
			else
			p->info=NULL; /* 无向图 */
			p->nextarc=(*G).vertices[j].firstarc; /* 插在表头 */
			(*G).vertices[j].firstarc=p;
		}
	}
}
示例#17
0
void DeleteArc(MGraph &G,VertexType v,VertexType w)
{
    //删除弧<v,w>,若G是无向的则还需删除对称弧<w,v>
    int i,j;
    G.vexnum-=2;
    G.arcnum-=1;
    i=LocateVex(G,v);
    j=LocateVex(G,w);
    G.arcs[i][j].adj=0;
    G.arcs[j][i].adj=0;

}
Status CreateUDN(MGraph *G) {
	int i,j,k,len,infoflag,w;
	VertexType v1,v2;

	char str[MAX_INFO];
	char *info;
	char c;

	//确定顶点数/弧数
	printf("please enter vexnum , arcnum and is info(1 or 0):");
	scanf("%d,%d,%d",&(*G).vexnum,&(*G).arcnum,&infoflag);

	//确定各个顶点的值
	printf("the value of each vertex:");
	for(i = 0;i < (*G).vexnum ; i++)
		scanf("%d,",&(*G).vexs[i]);
	
	//初始化邻接矩阵
	for(i = 0; i < (*G).vexnum; i++) 
		for(j = 0;j < (*G).vexnum ; j++) {
			(*G).arcs[i][j].adj = INFINITY;	//无向网
			(*G).arcs[i][j].info = NULL;
		}


	//确定邻接矩阵
	printf("please heads,tails and weights:\n");
	for(k = 0; k < (*G).arcnum; k++) {
		scanf("%d,%d,%d",&v1,&v2,&w);
		
		i = LocateVex(*G,v1);
		j = LocateVex(*G,v2);

		if(i >= 0 && j >= 0)
			(*G).arcs[i][j].adj = (*G).arcs[j][i].adj = w;	//无向网

		//如果顶点有附带信息,则输入并申请空间
		if(infoflag) {
			printf("please enter the info:");
			while( (c = getchar()) != '#')
				str[len++] = c;

			info = (char *) malloc(len * sizeof(char));
			strcpy(info,str);

			(*G).arcs[i][j].info = info;
		}
	}

	(*G).kind = UDN;

	return OK;
}
示例#19
0
Status CreateGraph(ALGraph &G){
    //G.kind---- 0:DG 1:DN 2:UDG 3:UDN
    scanf("%d%d%d\n",&G.vexnum,&G.arcnum,&G.kind);
    if(G.kind > 3 || G.kind < 0){
        Error(" Incorrect graph kind input. the legal number must between 0 and 3.");
        return ERROR;
    }
    int i,j,k;
    EdgeType weight;
    ArcNode *pi,*pj;
    VertexType sv,ev;
    for(i = 0; i < G.vexnum; i++) { //Construct vertex nodes.Input vertex data and init adjlist head pointer.
        scanf("%c\n", &G.vertices[i].data); 
        G.vertices[i].firstarc = NULL;
        G.vertices[i].visited = 0;  //set unvisited
    }//for
    for(k = 0; k < G.arcnum; k++) { //Construct arc.Input head and tail of an edge.
        scanf("%c %c\n",&sv,&ev); 
        // locate index of sv and ev
        i = LocateVex(G,sv);
        j = LocateVex(G,ev);
        pi = (ArcNode *)malloc(sizeof(ArcNode));
        if(!pi){
            Error("out of space");
            return ERROR;
        }//if
        pi->adjvex = j;  
        // edge's weight info
        if(G.kind == DN || G.kind == UDN) {
            scanf("%d\n",&weight);
        }
        else 
            weight = 0;
        //Head insert to construct vertices[i]'s adjlist.
        pi->weight = weight;
        pi->nextarc = G.vertices[i].firstarc;
        G.vertices[i].firstarc = pi;
        if(G.kind == UDG || G.kind == UDN) {
            //Construct vertices[j]'s adjlist in the light of symmetry in UDG/UDN.
            pj = (ArcNode *)malloc(sizeof(ArcNode));
            if(!pj){
            Error("out of space");
            return ERROR;
            }//if
            pj->adjvex = i;
            pj->weight = weight;
            pj->nextarc = G.vertices[j].firstarc;
            G.vertices[j].firstarc = pj;
        }//if
    }//for
    return OK;
}//CreateGraph 
示例#20
0
void DeleteArc(MGraph &G,VertexType v,VertexType w)
{
	//删除弧<v,w>,若G是无向的则还需删除对称弧<w,v>
	int i,j;
	G.vexnum-=2;
	G.arcnum-=1;
	i=LocateVex(G,v);
	j=LocateVex(G,w);
	G.arcs[i][j].adj=0;
	if(G.kind==UDN||G.kind==UDG)//如果是无向图或者无向网,删除对称偶序
		G.arcs[j][i].adj=0;

}
示例#21
0
void DFS(MGraph G,VertexType v)
{
	VertexType w;
	int i=LocateVex(G,v);
	if(!Visited[i])
	{
		Visited[i]=TRUE;
		Visit(v);
	}
	for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
		if(!Visited[LocateVex(G,w)])
			DFS(G,w);
}
示例#22
0
Status CreateUDG(ALGrapth *G){
	int IncInfo;
	printf("输入顶点数, 弧数, 其他信息\n");
	scanf("%d %d %d", &(*G).vexnum, &(*G).arcnum, &IncInfo);

	int i, j, k;
	printf("输入顶点\n");
	for(i = 0; i < (*G).vexnum; i++){
		getchar();
		scanf("%c", &(*G).vertices[i].data);
		(*G).vertices[i].firstarc = NULL;
	}
	// for(i = 0; i < (*G).vexnum; i++){
	// 	printf("%c\n", (*G).vertices[i].data);
	// }

	VertexType v1, v2;
	int w;
	printf("输入弧的初始点和终端点\n");
	for(k = 0; k < (2 * (*G).arcnum); k++){
		getchar();
		scanf("%c %c", &v1, &v2);
		// printf("%c %c %d\n", v1, v2);
		i = LocateVex((*G), v1);
		j = LocateVex((*G), v2);
		// printf("%d %d\n", i, j);

		ArcNode *an;
		an = (ArcNode*)malloc(sizeof(ArcNode));
		an->adjvex = j;
		an->nextarc = NULL;
		// printf("test1\n");

		if((*G).vertices[i].firstarc){
			ArcNode *last = (*G).vertices[i].firstarc;
			// printf("test2\n");
			while(last->nextarc) last = last->nextarc;
			// printf("test3\n");

			last->nextarc = an;
			// printf("test4\n");
		}else{
			(*G).vertices[i].firstarc = an;
		}

		if(IncInfo){
			// Input(*(*G).arcs[i][j].info);
		}
	}

}
示例#23
0
文件: AMLGraph.c 项目: wherego/C
Status CreateUDG( AMLGraph *G )
{
 int k , l ;
 int i , j ;
 int IncInfo ;
 InfoType str[ MAX_INFO ] ;
 EBox *p ;
 VertexType va , vb ;

 printf( "Input the number of vex,arc and wether exist information(0 means no):" ) ;
 scanf( "%d%d%d%*c" , &( *G ).vexnum , &( *G ).edgenum , &IncInfo ) ;  //IncInfo为0 则各弧不含有其他信息

 printf( "Please input the vector of the vex:\n" ) ;
 for( k = 0 ; k < ( *G ).vexnum ; ++ k )         //构造顶点值
 {
  scanf( "%s" , &( *G ).adjmulist[ k ].data ) ;
  ( *G ).adjmulist[ k ].firstedge = NULL ;       //初始化指针
 }

 printf( "Please input the edge of AMLGraph:\n" ) ;
 for( k = 0 ; k < ( *G ).edgenum ; ++ k )        //出入弧并构造十字链表
 {
  scanf( "%s%s" , va , vb ) ;
  i = LocateVex( *G , va ) ;           //va<----->vb
  j = LocateVex( *G , vb ) ;

  p = ( EBox *)malloc( sizeof( EBox ) ) ;
  p->mark = unvisited ;   //Take care!
  p->ivex = i ;
  p->jvex = j ;
  p->info = NULL ;
  p->ilink = ( *G ).adjmulist[ i ].firstedge ;
  ( *G ).adjmulist[ i ].firstedge = p ;
  p->jlink = ( *G ).adjmulist[ j ].firstedge ;
  ( *G ).adjmulist[ j ].firstedge = p ;

  if( IncInfo )
  {
   printf( "Please input the information about this arc( %d char ):" , MAX_INFO ) ;
   scanf( "%s" , str ) ;
   l = strlen( str ) ;
   if( l )
   {
    p->info = ( char * )malloc( ( l + 1 ) * sizeof( char ) ) ; //( l + 1 )
    strcpy( p->info , str ) ;
   }
  }
 }//for k
 return OK ;
}
示例#24
0
int NextAdjVex(MGraph G, VertexType v, VertexType w)
{/* 初始条件: 图G存在,v是G中某个顶点,w是v的邻接顶点 */
   /* 操作结果: 返回v的(相对于w的)下一个邻接顶点的序号, */
   /*           若w是v的最后一个邻接顶点,则返回-1 */
	int i, j = 0, k1, k2;
	k1 = LocateVex(G, v);
	k2 = LocateVex(G, w);
	if (G.kind == DN || G.kind == AN) j = INFINITY;
	for (i = k2 + 1; i < G.vexnum; i++) {
		if (G.arcs[k1][i].adj != j) {
			return i;
		}
	}
	return -1;
}
示例#25
0
//Function use: 邻接矩阵表示法,构造有向网G
Status CreateDN(MGraph *pG)
{
	int i;
	int j;
	int k;
	VRType nWeight;
	int nLength;
	boolean bInfo;
	InfoType s[MAX_INFO];
	InfoType *info;
	VertexType va;
	VertexType vb;
	printf("请输入有向网G的顶点数,弧数,弧是否其它信息(是:1,否:0):");
	scanf("%d%d%d", &(*pG).vexnum, &(*pG).arcnum, &bInfo);
	printf("请输入%d个顶点的值(<%d个字符):\n", (*pG).vexnum, MAX_NAME);
	//构造顶点向量
	for (i = 0; i < (*pG).vexnum; i++)
	{
		scanf("%s", (*pG).vexs[i]);
	}
	//初始化邻接矩阵
	memset((*pG).arcs, INFINITY, (*pG).vexnum * (*pG).vexnum\
			* sizeof(ArcCell));
	//构造有向网
	printf("请输入%d条弧的弧尾 弧头 权值(空格隔开):", (*pG).arcnum);
	for (k = 0; k < (*pG).arcnum; k++)
	{
		scanf("%s%s%d%*c", va, vb, &nWeight);
		i = LocateVex((*pG), va);
		j = LocateVex((*pG), vb);
		(*pG).arcs[i][j].adj = nWeight;
		if (bInfo)
		{
			printf("请输入该弧的相关信息(<%d个字符):", MAX_INFO);
			fgets(s, MAX_INFO, stdin);
			nLength = strlen(s);
			if (0 != nLength)
			{
				info = (char *)malloc((nLength + 1) * sizeof(char));
				strcpy(info, s);
				(*pG).arcs[i][j].info = info;
			}
		}
	}
	(*pG).kind = DN;

	return OK;
}
示例#26
0
//Function use: 在G中增加弧<v,w>, 若是无向的,另增加<w,v>
Status InsertArc(MGraph *pG, VertexType v, VertexType w)
{
	int i;
	int nLength;
	InfoType *info;
	InfoType s[MAX_INFO];
	int nSeqV = LocateVex(*pG, v);
	int nSeqW = LocateVex(*pG, w);
	if (nSeqV < 0 || nSeqW < 0)
	{
		perror("No such Vertex!\n");
		return ERROR;
	}
	else
	{
		(*pG).arcnum++;
		if (DN == (*pG).kind || AN == (*pG).kind)
		{
			printf("请输入此弧或边的权值:");
			scanf("%d", &(*pG).arcs[nSeqV][nSeqW].adj);
		}
		else
		{
			(*pG).arcs[nSeqV][nSeqW].adj = 1;
		}
		printf("是否有相关信息?(0:无 1:有):");
		scanf("%d%*c", &i);
		if (1 == i)
		{
			printf("请输入相关信息:");
			fgets(s, MAX_INFO, stdin);
			nLength = strlen(s);
			if (0 != nLength)
			{
				info = (InfoType*)malloc((nLength + 1) * sizeof(InfoType));
				strcpy(info, s);
				(*pG).arcs[nSeqV][nSeqW].info = info;
			}
		}
		if ((*pG).kind > 1)		//无向
		{
			(*pG).arcs[nSeqW][nSeqV].adj = (*pG).arcs[nSeqV][nSeqW].adj;
			(*pG).arcs[nSeqW][nSeqV].info = (*pG).arcs[nSeqV][nSeqW].info;
		}
	}

	return OK;
}
示例#27
0
//Function use: 邻接矩阵构造无向网
Status CreateAN(MGraph *pG)
{
	int i;
	int j;
	int k;
	VRType nWeight;
	InfoType s[MAX_INFO];
	VertexType va;	//顶点1和顶点2
	VertexType vb;
	boolean bInfo;	//是否有相关信息
	int nLength;	//相关信息长度
	printf("请输入无向网的顶点数 边数 边是否有相关信息:");
	scanf("%d%d%d", &(*pG).vexnum, &(*pG).arcnum, &bInfo);
	//构造顶点向量
	printf("请输入%d个顶点值:", (*pG).vexnum);
	for (i = 0; i < (*pG).vexnum; i++)
	{
		scanf("%s%*c", (*pG).vexs[i]);
	}
	//初始化邻接矩阵
	memset((*pG).arcs, INFINITY, (*pG).vexnum * (*pG).vexnum\
			* sizeof(ArcCell));
	//构造边
	printf("请输入顶点1 顶点2 权值:");
	for (k = 0; k < (*pG).arcnum; k++)
	{
		scanf("%s%s%d%*c", va, vb, &nWeight);
		i = LocateVex(*pG, va);
		j = LocateVex(*pG, vb);
		(*pG).arcs[i][j].adj = nWeight;
		if (bInfo)
		{
			printf("请输入该边的相关信息:");
			fgets(s, MAX_INFO, stdin);
			nLength = strlen(s);
			if (0 != nLength)
			{
				(*pG).arcs[i][j].info = (InfoType*)malloc(\
						(nLength + 1) * sizeof(InfoType));
				strcpy((*pG).arcs[i][j].info, s);
				(*pG).arcs[j][i].info = (*pG).arcs[i][j].info;
			}
		}
	}
	(*pG).kind = AN;

	return OK;
}
示例#28
0
文件: AMLGraph.c 项目: wherego/C
Status FirstAdjVex( AMLGraph G , VertexType u )        //返回u的第一个邻接点
{
 int k ;
 EBox *p ;

 k = LocateVex( G , u ) ;
 if( k < 0 )
  exit( OVERFLOW ) ;

 p = G.adjmulist[ k ].firstedge ;
 if( p )
 {
  if( p->ivex == k )
  {
  // puts( G.adjmulist[ p->jvex ].data ) ;
   return p->jvex ;
  }
  else     //p->jvex == k
  {
  // puts( G.adjmulist[ p->ivex ].data ) ;
   return  p->ivex ;
  }
 }
 return EOF ;
}
Status DijShortPath(ALGraph graph, int v, int path[][MAXVEX + 1], int *dist) {
	int index;
	int index2;
	int i, j, k;
	int mindist;
	int distance;
	int final[MAXVEX];

	if (graph.vexnum == 0)
		return ERROR;
	if ((index = LocateVex(graph, v)) == -1)
		return ERROR;
	if (path == NULL || dist == NULL)
		return ERROR;

	for (i = 0; i < graph.vexnum; i++) {
		final[i] = false;
		dist[i] = Distance(graph, index, i);
		path[i][0] = 0;
		if (dist[i] != MAXINT) {
			path[i][0]++;
			path[i][1] = v;
		}
	}
	path[index][0] = 1;						//path的存储结构为path[0]=length表示点的个数
	path[index][1] = v;						//接下来length个元素为顶点
	final[index] = true;
示例#30
0
void MiniSpanTree_PRIM (MGraph G,VertexType u)
{
	/*用普利姆算法从第u个顶点出发构造网G 的最小生成树T,输出T的各条边。
	* 记录从顶点集U到V-U的代价最小的边的辅助数组定义:
	* struct
	  {
			VertexType adjvex;
			VRtype lowcost;
	 }closedge[MAX_VERTEX_NUM];
	*/
	k = LocateVex ( G , u );
	for (j= 0 ;j<G.vexnum; j++)   //辅助数组初始化
	{
		if (j!=k)
			closedge[j] = {u,G.arcs[k][j].adj};//{adjvex,lowcost}
	}
	closedge[k].lowcost = 0 ;           //初始,U={u}
	for( i=1; i<G.vexnum ;i++)          //选择其余G.vexnum -1 个顶点
	{
		k = minimum(closedge);                               //求出T的下个结点:第k结点
		
		/*此时 closedge[k].lowcost = MIN{ closedge[Vi].lowcost|closedge[Vi].lowcost>0,Vi∈V-U}
		*/
		printf(closedge[k].adjvex,G.vexs[k]);               //输出生成树的边
		closedge[k].lowcost = 0;                           //第k条边并入U集
		for ( j=0;j<G.vexnum ;j++)
		{
			if ( G.arcs[k][j].adj < closedge[j].lowcost)    //新顶点并入U后重新选择最小边
			closedge[j] = {G.vex[k],G.arcs[k][j].adj};
		}
	}
}