#include#include #define MAXSIZE 100 typedef struct Node//边表 { int adjvex;//储存顶点对应下标 Node *next; }Node; typedef struct VerexNode//顶点表 { char data; Node *firstB; }VerexNode, AdjList[MAXSIZE]; typedef struct Mgraph//邻接表 { AdjList adjList; int vernum, edgnum; }Mgraph; void CreateGraph(Mgraph *g) { int e, j; printf("输入顶点数和边数n"); scanf_s("%d%d", &g->vernum, &g->edgnum); getchar();//消除scanf对空格和回车的影响 for (int i=0; i < g->vernum; i++) { printf("输入第%d个结点的值:", i + 1); scanf_s("%c", &g->adjList[i].data); getchar(); g->adjList[i].firstB = NULL; } for (int k = 0; k < g->edgnum; k++) { printf("请输入有关系的两个顶点:n"); scanf_s("%d%d", &e,&j); e-= 1; j -= 1; Node *s; s = (Node *)malloc(sizeof(Node));//生成新节点开辟空间 s->adjvex = j;//为邻接点域赋值 s->next=g->adjList[e].firstB;//新节点的后继就是头结点的后继 g->adjList[e].firstB = s;//头插法建立单链表 s = (Node *)malloc(sizeof(Node)); s->adjvex = e; s->next = g->adjList[j].firstB; g->adjList[j].firstB = s; } } void PintGraph(Mgraph *g) { int i; for (i = 0; i < g->vernum; i++) { printf("%c->",g->adjList[i].data); while (true)//当遍历到最后一条边为空退出循环 { if (g->adjList[i].firstB == NULL) { printf("^"); break; } printf("%d->", g->adjList[i].firstB->adjvex + 1);//输出边对应的下标 g->adjList[i].firstB = g->adjList[i].firstB->next;//继续向后遍历下一条边 } printf("n"); } } int main() { Mgraph g; CreateGraph(&g); PintGraph(&g); }



