邻接矩阵和邻接表

废话不多说,直接上代码,代码有注释,不会私聊我。

邻接矩阵

#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");
	}
}

总结

很多天都没怎么学数据结构了,这几天快期末考试了,所以不得不又拿起来了。
这两个表的实现是自己完全手打的,思路和部分代码是参考学校课本的,所以说可能代码不够精简。邻接表这块显示可能不太清楚,如果大家有需要可以自己增添删改一下。

这几个周过得稀里糊涂的,完全都没有什么规划,博客也没好好写。不过怎么说呢,慢慢的,明白了一些东西,什么是虚假的,什么又是真实的。

学习,是这世界上唯一的真理吧。

愿我今后还能继续满怀希望,学习知识,了解这大千世界的奥秘吧!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值