废话不多说,直接上代码,代码有注释,不会私聊我。
邻接矩阵
#include "stdio.h"
#define MAXVEX 20
#define INFINITY 32767
#define Vextype char
typedef struct
{
int arcs[MAXVEX][MAXVEX]; //边弧信息
Vextype vex[MAXVEX]; //顶点信息,顶点类型根据实际情况自行定义
int vexnum; //顶点数目
int arcnum; //边数目
}AdjMatrix; //邻接矩阵
void Create(AdjMatrix * G); //创建邻接矩阵
int LocateVex(AdjMatrix * G,char v); //查找顶点横向坐标位置
void Printf(AdjMatrix *G); //打印
int main()
{
AdjMatrix G;
Create(&G);
Printf(&G);
return 0;
}
void Create(AdjMatrix * G)
{
int i,j,k,weight; //weight:权值
char vex1,vex2; //顶点
printf("请输入无向网中的顶点数和边数:\n");
scanf("%d,%d",&G->vexnum,&G->arcnum);
for(i=1;i<=G->vexnum;i++)
{
for(j=1;j<=G->vexnum;j++)
{
G->arcs[i][j]=INFINITY; //先把邻接矩阵的所有值赋为最大值
}
}
printf("请输入无向网中%d个顶点:\n",G->vexnum);
for(i=1;i<=G->vexnum;i++)
{
printf("No.%d个顶点",i);
getchar(); //清掉回车字符
scanf("%c",&G->vex[i]); //输入顶点
}
printf("请输入无向网中%d条边:\n",G->arcnum); //输入有几条边
for(k=0;k<G->arcnum;k++)
{
getchar(); //同上
printf("No.%d条边:",k+1);
vex1=getchar();
printf("<-->顶点V:");
getchar();
vex2=getchar();
printf("权值:");
scanf("%d",&weight);
i=LocateVex(G,vex1); //查找该顶点的位置
j=LocateVex(G,vex2);
G->arcs[i][j]=weight; //将权值输入到临近矩阵中
G->arcs[j][i]=weight; //如果是有向图则删除这句话
}
}
int LocateVex(AdjMatrix * G,char v)
{
int i;
for(i=1;i<=G->vexnum;i++)
{
if(G->vex[i]==v) return i; //查找
}
return 0;
}
void Printf(AdjMatrix *G)
{
int i,j;
for(i=1;i<=G->vexnum;i++)
{
for(j=1;j<=G->vexnum;j++)
{
printf("%8d",G->arcs[i][j]);
}
printf("\n");
}
}
邻接表
#include "stdio.h"
#include "stdlib.h"
#define MAXVEX 20
typedef struct ArcNode
{
int adjvex; //顶点序数
int weight; //权值
struct ArcNode *next;
}ArcNode;
typedef struct VertexNode
{
char vexdata; //顶点类型
ArcNode *head;
}VertexNode;
typedef struct
{
VertexNode vertex[MAXVEX]; //顶点所包含的信息(自我理解就是邻接表的链表)
int vexnum; //顶点数
int arcnum; //弧数
}AdjList;
void Create(AdjList *G);
void Steps(AdjList *G,int weight,char vex1,char vex2);
void Charu(AdjList *G,int i,int j,int weight);
int LocateVex(AdjList *G,char v);
void Printf(AdjList *G);
int main()
{
int i;
AdjList *G;
G=(AdjList *)malloc(sizeof(AdjList)*1);
Create(G);
Printf(G);
return 0;
}
void Create(AdjList *G) //创建
{
int i,j,k,weight;
char vex1,vex2;
printf("请输入顶点个数和边数:");
scanf("%d,%d",&G->vexnum,&G->arcnum);
printf("请输入顶点信息:\n");
for(i=1;i<=G->vexnum;i++)
{
printf("请输入第%d个顶点",i);
getchar();
scanf("%c",&G->vertex[i].vexdata);
// G->vertex[i].head=(G->vertex[i].head *)malloc(sizeof(G->vertex[i].head));
G->vertex[i].head=NULL;
printf("\n");
}
for(k=0;k<G->arcnum;k++)
{
getchar(); //同上
printf("No.%d条边:",k+1);
vex1=getchar();
printf("<-->顶点V:");
getchar();
vex2=getchar();
printf("权值:");
scanf("%d",&weight);
Steps(G,weight,vex1,vex2);
Steps(G,weight,vex2,vex1);
}
}
void Steps(AdjList *G,int weight,char vex1,char vex2) //中间·步骤
{
int i,j,l1,l2;
for(i=1;i<=G->vexnum;i++)
{
if(G->vertex[i].vexdata==vex1)
{
l1=LocateVex(G,vex1); //求出vex1的位置
l2=LocateVex(G,vex2);
printf("%d %d",l1,l2);
Charu(G,l1,l2,weight);
}
}
}
void Charu(AdjList *G,int i,int j,int weight) //核心实现
{
ArcNode *p,*q;
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->weight=weight;
p->next=NULL;
printf("OK\r\n");
if(G->vertex[i].head==NULL) //尾插法
{
G->vertex[i].head=p;
}
else
{
q=G->vertex[i].head;
while(q->next!=NULL) q=q->next;
q->next=p;
}
}
int LocateVex(AdjList * G,char v)
{
int i;
for(i=1;i<=G->vexnum;i++)
{
if(G->vertex[i].vexdata==v) return i; //查找
}
return 0;
}
void Printf(AdjList *G)
{
int i,j;
printf("OJBK\r\n");
for(i=1;i<=G->vexnum;i++)
{
while(G->vertex[i].head!=NULL)
{
printf("下标为%d 权值为%d",G->vertex[i].head->adjvex,G->vertex[i].head->weight);
G->vertex[i].head=G->vertex[i].head->next;
}
printf("\n");
}
}
总结
很多天都没怎么学数据结构了,这几天快期末考试了,所以不得不又拿起来了。
这两个表的实现是自己完全手打的,思路和部分代码是参考学校课本的,所以说可能代码不够精简。邻接表这块显示可能不太清楚,如果大家有需要可以自己增添删改一下。
这几个周过得稀里糊涂的,完全都没有什么规划,博客也没好好写。不过怎么说呢,慢慢的,明白了一些东西,什么是虚假的,什么又是真实的。
学习,是这世界上唯一的真理吧。
愿我今后还能继续满怀希望,学习知识,了解这大千世界的奥秘吧!