// //
// 邻接表实例 //
// //
///
#include<stdio.h>
#include<stdlib.h>
typedef struct ArcNode
{
int adjves;
//int weight;
struct ArcNode * nextarc;
}ArcNode;
typedef struct
{
int data;
ArcNode firstarc;
}AdjList;
typedef struct
{
AdjList *vertices;
int vexnum, arcnum;
}ALGraph;
ALGraph alg;
int str[100][100] = {0};
/
void initail()//初始化邻接表
{
int n = alg.vexnum;
alg.arcnum = 0;
int i;
alg.vertices = (AdjList*)malloc(n * sizeof(AdjList));
for (i = 0; i < n; i++)
{
alg.vertices[i].firstarc.nextarc = NULL;
alg.vertices[i].data = i + 1;
}
}
void insert(int i, int j)//向邻接表插入一条边
{
i--;
j--;
ArcNode *p;
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjves = j + 1;
p->nextarc = alg.vertices[i].firstarc.nextarc;//复制邻接表顶点的邻接点
alg.vertices[i].firstarc.nextarc = p;
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjves = i + 1;
p->nextarc = alg.vertices[j].firstarc.nextarc;//复制邻接表顶点的邻接点
alg.vertices[j].firstarc.nextarc = p;
alg.arcnum++;//边数加一
}
void printAlg()//打印邻接表
{
int i;
ArcNode *p;
for (i = 0; i < alg.vexnum; i++)
{
printf("%d:\t", i + 1);
p = alg.vertices[i].firstarc.nextarc;
while (p != NULL)
{
printf("%d\t", p->adjves);
p = p->nextarc;
}
printf("\n");
}
}
void DfsTraverseALG(int i)//深优遍历
{
int j, n = alg.vexnum;
int *visit = (int*)malloc(alg.vexnum * sizeof(int));
i--;
for (j = 0; j < alg.vexnum; j++)
{
visit[j] = 0;
}
for (j = 0; j < alg.vexnum; j++)
{
if (visit[j] == 0)
{
DfsALG(i, visit);
}
}
printf("\n");
printMgraph();//
free(visit);
}
void DfsALG(int i, int *visit)//深优遍历主体
{
ArcNode *p;
int j;
visit[i] = 1;
printf("%d\t", alg.vertices[i].data);
p = alg.vertices[i].firstarc.nextarc;
while (p != NULL)
{
j = p->adjves - 1;
str[i][j] = 1;
if (visit[j] == 0)
{
DfsALG(j, visit);
}
p = p->nextarc;
}
}
void printMgraph()//打印矩阵
{
int i, j;
printf("Mgraph:\n");
for (i = 0; i < alg.vexnum; i++)
{
for (j = 0; j < alg.vexnum; j++)
{
printf("%d ", str[i][j]);
}
printf("\n");
}
}
int Arcs(int i)//求某个顶点的度
{
int j = 0;
ArcNode *p = alg.vertices[i].firstarc.nextarc;
while (p != NULL)
{
j++;
p = p->nextarc;
}
return j;
}
bool isArc(int i, int j)//某两个点是否相连
{
ArcNode *p = alg.vertices[i].firstarc.nextarc;
while (p != NULL)
{
if (p->adjves == j)
{
return true;
}
p = p->nextarc;
}
return false;
}
int getArcnumOfGraph()//获得图的边数
{
return alg.arcnum;
}
int main()
{
int i, j, k;
scanf("%d", &(alg.vexnum));
initail();
while (1)
{
printf("->");
scanf("%d%d", &i, &j);//按题意输入的点序号都大于0
if (i == 0 && j == 0)
{
break;
}
insert( i, j);
}
printAlg();
printf("DfsTraverseALG:\n");
DfsTraverseALG(1);
printf("请输入你的操作类型:\n");
printf("退出 0\n");
printf("图的边数 1\n");
printf("任何两个顶点是否相连 2\n");
printf("求一个顶点的度是多少 3\n");
while (1)
{
scanf("%d", &k);
if (k == 0)
{
break;
}
else if (k == 1)
{
printf("图的边数为:%d\n", getArcnumOfGraph());
}
else if (k == 2)
{
printf("请输入两个顶点的位置!\n");
scanf("%d%d", &i, &j);
if (isArc(i - 1, j))
{
printf("顶点%d与顶点%d相连!\n", i, j);
}
else
{
printf("顶点%d与顶点%d不相连!\n", i, j);
}
}
else if (k == 3)
{
printf("请输入顶点:\n");
scanf("%d", &i);
printf("顶点%d的度为:%d\n",i, Arcs(i - 1));
}
else
{
printf("输入错误,请重新输入\n");
}
}
system("pause");
return 0;
}
转载于:https://www.cnblogs.com/Soul-ice-ACM/articles/2121451.html