69,369
社区成员
发帖
与我相关
我的任务
分享
#ifndef InitEnv_H
#define InitEnv_H
typedef char DataType;
#define MaxSize 50
#define MaxVertices 50
#define MaxEdges 500
#define MaxWeight 10000
#define MaxQueueSize 50
#endif
#ifndef SeqList_H
#define SeqList_H
#include "InitEnv.h"
typedef struct{
DataType list[MaxSize];
int size;
}SeqList;
extern void ListInitiate(SeqList *L); //初始化顺序表L
extern int ListLength(SeqList L);//返回顺序表L的当前数据元素个数
extern int ListInsert(SeqList *L,int i,DataType x);//往顺序表中第i个位置插入数值x
//插入成功返回1,失败返回0
extern int ListDelete(SeqList *L,int i);//删除位置i的数据元素,成功返回1,失败0
extern int ListGet(SeqList L,int i,DataType *x);//取第i个元素存于x中,成功返回1,失败0
#endif
//SeqList.c
#include "SeqList.h"
void ListInitiate(SeqList *L) //初始化顺序表L
{
L->size=0; //定义初始数据元素个数
}
int ListLength(SeqList L)//返回顺序表L的当前数据元素个数
{
return L.size;
}
int ListInsert(SeqList *L,int i,DataType x)//往顺序表中第i个位置插入数值x
//插入成功返回1,失败返回0
{
int j;
if(L->size>=MaxSize){
printf("顺序表已满无法插入!\n");
return 0;}
else if(i<0||i>L->size){
printf("参数i不合法!\n");
return 0;}
else{
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];//数据依次向后移,为插入做准备
L->list[i]=x;//插入x
L->size++;
return 1;}
}
int ListDelete(SeqList *L,int i)//删除位置i的数据元素,成功返回1,失败0
{
int j;
if(L->size<=0){
printf("顺序表为空无元素可删!\n");
return 0;}
else if(i<0||i>L->size-1){
printf("参数i不合法!\n");
return 0;}
else{
for(j=i+1;j<=L->size-1;j++)
L->list[j-1]=L->list[j];
L->size--;
return 1;}
}
int ListGet(SeqList L,int i,DataType *x)//取第i个元素存于x中,成功返回1,失败0
{
if(i<0||i>L.size-1){
printf("参数i不合法!\n");
return 0;}
else{
*x=L.list[i];
return 1;}
}
#ifndef AdjMGraph_H
#define AdjMGraph_H
#include "InitEnv.h"
#include "SeqList.h"
typedef struct {
SeqList Vertices;//存放顶点的顺序表
int edge[MaxVertices][MaxVertices];//存放边的邻接矩阵
int numOfEdges;//边的条数
}AdjMGraph;
extern void Initiate(AdjMGraph *G,int n);//初始化
extern void InserVertex(AdjMGraph *G,DataType vertex);//在图G中插入顶点vertex
extern void InsertEdge(AdjMGraph *G,int v1,int v2,int weight);//在图G中插入边<v1,v2>,权为weight
extern void DeleteEdge(AdjMGraph *G,int v1,int v2);//在图G中删除边<v1,v2>
extern int GetFirstVex(AdjMGraph G,int v);//在图G中寻找序号为v的顶点的第一个邻接顶点
extern int GetNextVex(AdjMGraph G,int v1,int v2);//在图G中寻找v1顶点的邻接顶点v2的下一个邻接顶点
#endif
//AdjMGraph.c
#include "AdjMGraph.h"
void Initiate(AdjMGraph *G,int n)//初始化
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++){
if(i==j)
G->edge[i][j]=0;
else
G->edge[i][j]=MaxWeight;//MaxWeight表示无穷大
}
G->numOfEdges=0;//边的条数为0
ListInitiate(&G->Vertices);//顺序表初始化
}
void InserVertex(AdjMGraph *G,DataType vertex)//在图G中插入顶点vertex
{
ListInsert(&G->Vertices,G->Vertices.size,vertex);//顺序表尾插入
}
void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)//在图G中插入边<v1,v2>,权为weight
{
if(v1<0||v1>=G->Vertices.size||v2<0||v2>=G->Vertices.size){
printf("参数v1或参数v2越界出错!\n");
return;}
G->edge[v1][v2]=weight;
G->numOfEdges++;
}
void DeleteEdge(AdjMGraph *G,int v1,int v2)//在图G中删除边<v1,v2>
{
if(v1<0||v1>=G->Vertices.size||v2<0||v2>=G->Vertices.size||v1==v2){
printf("参数v1或参数v2越界出错!\n");
return;}
if(G->edge[v1][v2]==MaxWeight||v1==v2){
printf("该边不存在!\n");
return;}
G->edge[v1][v2]=MaxWeight;
G->numOfEdges--;
}
int GetFirstVex(AdjMGraph G,int v)//在图G中寻找序号为v的顶点的第一个邻接顶点
{
int col;
if(v<0||v>G.Vertices.size){
printf("参数v越界出错\n");
return -1;}
for(col=0;col<G.Vertices.size;col++)
if(G.edge[v][col]>0&&G.edge[v][col]<MaxWeight)
return col;
return -1;
}
int GetNextVex(AdjMGraph G,int v1,int v2)//在图G中寻找v1顶点的邻接顶点v2的下一个邻接顶点
{
int col;
if(v1<0||v1>G.Vertices.size||v2<0||v2>G.Vertices.size){
printf("参数v1或参数v2越界出错!\n");
return -1;}
for(col=v2+1;col<G.Vertices.size;col++)
if(G.edge[v1][col]>0&&G.edge[v1][col]<MaxWeight)
return col;
return -1;
}
#include<stdio.h>
#include<malloc.h>
#include "SeqList.h"
#include "AdjMGraph.h"
//#include "AdjMGraphCreate.h"
//#include "AdjMGraphTraverse.h"
void Visit(DataType item)
{
printf("%c ",item);
}
void main(void)
{
AdjMGraph g1;
DataType a[]={'A','B','C'.'D','E'};
RowColWeight rcw[]={{0,1,10},{0,4,20},{1,3,30},{2,1,40},{3,2,50}};
int n=5,e=5;
int i,j;
CreatGraph(&g1,a,n,rcw,e);
printf("顶点的集合为:");
for(i=0;i<g1.Vertices.size;i++)
printf("%c ",g1.Vertices.list[i]);
printf("\n");
printf("权值的集合为:\n");
for(i=0;i<g1.Vertices.size;i++){
for(j=0;j<g1.Vertices.size;j++)
printf("%5d ",g1.edge[i][j]);
printf("\n");
}
}
文件重新组织一下,主要是声明顺序有些乱
头文件,还有函数的定义呢啊?
typedef int DataType;
#define MaxSize 10