1.输入为整数类型
#include<stdio.h>
#include<stdlib.h>
#define MaxVertices 100
//建立边表
typedef struct node
{
int adjvex; //该边指向的结点位置
struct node* next; //指向下一条边
int info; //权重
}ArcNode;
//建立顶点表
typedef struct
{
int data;
ArcNode *first;
}VerNode;
//建立连接表
typedef struct
{
VerNode adjList[MaxVertices];//邻接表的顶点存放数组
int n, e; //顶点数,边数
}AdjList;
//生成无向邻接表
void CreateGraph1(AdjList *L)
{
int i, a, b,c;
ArcNode *s; //边表
printf_s("请输入总顶点数和总边数:\n");
scanf_s("%d%d",&L->n,&L->e);
printf_s("建立顶点表:\n");
for (i = 0; i < L->n; i++)
{
scanf_s("%d",&L->adjList[i].data);
L->adjList[i].first = NULL; //初始化当前顶点指向的边表全部为空
}
//头插法创建边表
printf_s("建立边表:\n");
for (i = 0; i < L->e; i++)
{
printf_s("请输入有连接的顶点:");
scanf_s("%d%d%d",&a,&b,&c);
a -= 1; b -= 1; //输入顶点从一开始,减去1后方便数组存储
s = (ArcNode*)malloc(sizeof(ArcNode)); //边表申请存储空间
s->adjvex = b; //边表的数据域赋值,指向边表的结点位置
s->info = c; //两个连接的权重
s->next = NULL; //尾插法
ArcNode *p ;
p = L->adjList[a].first;
if (p == NULL)
{
L->adjList[a].first = s;
}
else
{
while (p->next)
{
p = p->next;
}
p->next = s;
}
/*
s->next = L->adjList[a].first; //头插法
L->adjList[a].first = s;
*/
/*加入这部分就是无向邻接表
s = (ArcNode*)malloc(sizeof(ArcNode));
s->adjvex = a;
s->next = L->adjList[b].first;
L->adjList[b].first = s;
*/
}
}
void DisGraph1(AdjList *L)
{
int i;
for (i = 0; i < L->n; i++)
{
printf_s("%d->", i+1);
while (1)
{
if (L->adjList[i].first == NULL)
{
printf_s("^");
break;
}
printf_s("%d(%d)->",L->adjList[i].first->adjvex+1,L->adjList[i].first->info);
L->adjList[i].first = L->adjList[i].first->next;
}
printf_s("\n");
}
}
void main()
{
AdjList *L = (AdjList*)malloc(sizeof(AdjList));
CreateGraph1(L);
printf_s("TIP:()内的值是权值\n");
DisGraph1(L);
}
2.输入为字符类型
#include <stdio.h>
#include<stdlib.h>
#define MaxSize 100
//建立边表
typedef struct node{
int adjvex; //指向边表的结点
struct node *nextarc; //指向下个边表结点
int info; //权值
}ArcNode;
//建立头表
typedef struct VNode{
char data; //头结点的编号
ArcNode *firstarc; //指向头结点的第一个边表值,初始化为NULL
}VNode, AdjList[MaxSize]; //数组存储每一条路径
//建立邻接表
typedef struct{
AdjList vextices; //数组定义
int vexnum, arcnum; //边的总结点数和边数
}ALGraph;
//找到输入值在定义数组中的位置,并返回该位置
int LocateVex(ALGraph *G, char v)
{
int i;
for ( i=0; i < G->vexnum; i++)
{
if (G->vextices[i].data == v)
{
return i;
}
}
return -1;
}
void CreateUDG(ALGraph *G)
{
int i, j, k;
int c; //权值定义,不要可忽略
char v1, v2;
ArcNode *p1; //p1指向头结点连接的边结点
//ArcNode *p2; //p2指向边结点连接的头结点,有向邻接表可以省略,无向输入a->b,默认补充b->a.
printf_s("输入总顶点数和总边数:");
scanf_s("%d %d", &G->vexnum, &G->arcnum); //输入总结点数和边数
printf_s("输入各个顶点的值:");
fflush(stdin);
for (i = 0; i < G->vexnum; i++)
{
scanf_s("%c", &G->vextices[i].data); //数组的头结点初始化
G->vextices[i].firstarc = NULL;
}
for (k = 0; k < G->arcnum; k++)
{
fflush(stdin);
printf_s("输入相连的两边(请一条边一条边输入):");
v1 = getchar(); //输入两个连接点如 “a b”,scanf_s("%c %c",&v1,&v2)在Vs中V2不能读入,vc中可以三个输入直接scanf。
getchar(); //吃一个空格
v2 = getchar();
getchar();
scanf_s("%d",&c); //输入权值
i = LocateVex(G, v1); //得到输入编号在数组中对应的下标
j = LocateVex(G, v2);
//printf_s("\n%d %d %c %c\n",i,j,v1,v2);
p1 = (ArcNode *)malloc(sizeof(ArcNode));
p1->adjvex = j;
p1->info = c;
/*
p1->nextarc = NULL; //尾插法存储连接
ArcNode *p;
p = G->vextices[i].firstarc;
if (p == NULL)
{
G->vextices[i].firstarc = p1;
}
else
{
while (p->nextarc)
{
p = p->nextarc;
}
p->nextarc = p1;
}
*/
p1 = (ArcNode *)malloc(sizeof(ArcNode));//头插法存储连接
p1->adjvex = j;
p1->info = c; //权值赋值
p1->nextarc = G->vextices[i].firstarc;
G->vextices[i].firstarc = p1;
/*
p2 = (ArcNode *)malloc(sizeof(ArcNode));//有向邻接表忽略这部分
p2->adjvex = i;
p2->nextarc = G->vextices[j].firstarc;
G->vextices[j].firstarc = p2;
*/
}
}
void DisGraph(ALGraph *G)
{
int i;
ArcNode *p;
for (i = 0; i < G->vexnum; i++)
{
p = G->vextices[i].firstarc;
printf_s("%c->", G->vextices[i].data);
while (p != NULL)
{
//printf_s("%c->", G->vextices[p->adjvex].data); //无权值输入
printf_s("%c(%d)->", G->vextices[p->adjvex].data,p->info); //有权值输入
p = p->nextarc;
}
printf_s("NULL\n");
}
}
void main()
{
ALGraph *G=(ALGraph*)malloc(sizeof(ALGraph));
CreateUDG(G);
DisGraph(G);
}