本代码实现了无向网的邻接表,但是没有实现无向网的遍历
本代码在Arch linux EndevrousOS 中经过测试
对于有向网,需要增加权重;对于无向图,只需要删除权重即可。对于有向图,需要修改邻接表中元素的域。
代码小白,如有疏漏,错误,请指出,感激不尽!
#include "stdio.h"
#include "stdlib.h"
#define MAXVERTEX 10
typedef struct __EdgeNode
{
int adjvertex;
struct __EdgeNode* next;
int weight;
} EdgeNode;
typedef struct __ALNode
{
char name;
EdgeNode* first;
}ALNode;
typedef struct __ALGraph
{
ALNode Vertex[MAXVERTEX];
int Edges,Vertices;
}ALGraph;
int Locate_vertex(ALGraph * G, char v);
void scanf_remove_newline_Char(ALGraph * G, char *arg);
void Create_unALGraph_unweighted(ALGraph* G)
{
printf("Please input the number of vertices:");
scanf("%d",&G->Vertices);
printf("Please input the number of edges:");
scanf("%d",&G->Edges);
printf("输入各顶点的名字:\n");
for(int i = 0; i < G->Vertices; i++)
{
printf("%d",G->Vertices);
scanf_remove_newline_Char(G,&G->Vertex[i].name);
G->Vertex[i].first = NULL;
}
char v1,v2;
int index_v1, index_v2;
for(int i = 0; i< G->Edges; i++)
{
printf("边%d的顶点是哪两个?", i + 1);
scanf_remove_newline_Char(G, &v1);
printf("继续输入:\n");
scanf_remove_newline_Char(G,&v2);
index_v1 = Locate_vertex(G, v1);
index_v2 = Locate_vertex(G, v2);
EdgeNode* pnew1 = (EdgeNode*)malloc(sizeof(EdgeNode));
pnew1->adjvertex = index_v2;
pnew1->next = G->Vertex[index_v1].first;
G->Vertex[index_v1].first = pnew1;
EdgeNode* pnew2 = (EdgeNode*)malloc(sizeof(EdgeNode));
pnew2->adjvertex = index_v1;
pnew2->next = G->Vertex[index_v2].first;
G->Vertex[index_v2].first = pnew2;
}
}
void scanf_remove_newline_Char(ALGraph * G, char*arg)
{
(*arg) == getchar();
while(getchar() != '\n')
continue;
}
int Locate_vertex(ALGraph *G, char v)
{
int index;
for(int i = 0; i < MAXVERTEX; i++)
{
if(G->Vertex[i].name == v)
return index = v;
}
}
int main()
{
ALGraph G;
Create_unALGraph_unweighted(&G);
}