//图的十字链表 表示法 (有向图)
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 10
#define ERROR 0
#define OK 0
typedef int Status;//有向图
typedef struct ArcBox{
int tailvex,headvex; //弧尾 弧头 (起点 终点)
struct ArcBox *hlink,*tlink; //各种入度 各种出度
int weight; //两个点(起点 终点)之间 的权重
}ArcBox;
typedef struct VexNode{
ArcBox *fristin,*fristout; //第一个入度 第一个出度 (头结点) 为一个点服务
int data; //点的值
}VexNode;
typedef struct Graph{ //网
VexNode list[MAX_SIZE]; //图上的点
int nodenum,arc; //结点的个数(要小于MAX_SIZE哦) 要不要统计弧
}Graph,*PGraph;
Status CreateGraph(PGraph *PG)
{
int i,j,weight,k;
ArcBox *PA;
if(!((*PG)=(PGraph)malloc(sizeof(Graph)))) return ERROR;
(*PG)->arc=0;
scanf("%d",&((*PG)->nodenum));
printf("输入各点数据: ");
for(k=0;k<(*PG)->nodenum;k++)//初始化
{
(*PG)->list[k].fristin=NULL;
(*PG)->list[k].fristout=NULL;
scanf("%d",&((*PG)->list[k].data));
}
while(scanf("%d%d%d",&i,&j,&weight))//描绘图的点 i,j从零开始 起点 和 到达点
{
if(i>=(*PG)->nodenum || j>=(*PG)->nodenum) return OK;
PA=(ArcBox *)malloc(sizeof(ArcBox));
PA->tailvex=i; PA->headvex=j;
PA->hlink=(*PG)->list[j].fristin;
PA->tlink=(*PG)->list[i].fristout;
PA->weight=weight;
//(*PA)={i,j,((*PG)->list[j].fristin),((*PG)->list[i].fristout)}; //入 出 错
(*PG)->list[i].fristout=(*PG)->list[j].fristin=PA; /*头 */
(*PG)->arc++;
}
}
Status PrintEveryInOut(const PGraph G)
{
int k;
ArcBox *Pnode;
printf("出点\n");
for(k=0;k<(G)->nodenum;k++)
{
printf(" k:%d data:%d \n",k,G->list[k].data);
for(Pnode=(G)->list[k].fristout;Pnode;Pnode=Pnode->tlink)
{printf(" k:%d tail:%d head:%d weight:%d \n",k,Pnode->tailvex,Pnode->headvex,Pnode->weight);}
printf("\n");
}
printf("\n入点\n");
for(k=0;k<(G)->nodenum;k++)
{
printf(" k:%d data:%d \n",k,G->list[k].data);
for(Pnode=(G)->list[k].fristin;Pnode;Pnode=Pnode->hlink)
{printf(" k:%d tail:%d head:%d weight:%d \n",k,Pnode->tailvex,Pnode->headvex,Pnode->weight);}
printf("\n");
}
return OK;
}
Status DestoryGraph(PGraph PG)
{
int k;
ArcBox *Pnode,*Ptemp;
for(k=0;k<(PG)->nodenum;k++)
{
Pnode=(PG)->list[k].fristout;
while(Pnode)
{
Ptemp=Pnode;
Pnode=Pnode->tlink;
free(Ptemp);
}
free((PG)->list[k].fristout);
}
}
int main()
{
PGraph G;
CreateGraph(&G);
PrintEveryInOut(G);
DestoryGraph(G);
PrintEveryInOut(G);
}
图的十字链表
最新推荐文章于 2024-08-01 10:12:30 发布