数据结构图的存储结构及基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.实验目的
通过上机实验进一步掌握图的存储结构及基本操作的实现。
2.实验内容与要求
要求:
⑴能根据输入的顶点、边/弧的信息建立图;
⑵实现图中顶点、边/弧的插入、删除;
⑶实现对该图的深度优先遍历;
⑷实现对该图的广度优先遍历。
备注:单号基于邻接矩阵,双号基于邻接表存储结构实现上述操作。
3.数据结构设计
逻辑结构:图状结构
存储结构:顺序存储结构、链式存储结构
4.算法设计
#include
#include
#include
#define MAX_VERTEX_NUM 20 typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc; }ArcNode;typedef struct VNode
{
char data[2]; //顶点就设置和书上V1等等一样吧
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM]; typedef struct
{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
typedef struct
{
int data[MAX_VERTEX_NUM+10];
int front;
int rear;
}queue;
int visited[MAX_VERTEX_NUM]; queue q;
int main()
{
ALGraph G;
int CreateUDG(ALGraph &G);
int DeleteUDG(ALGraph &G);
int InsertUDG(ALGraph &G);
void BFSTraverse(ALGraph G, int (*Visit)(ALGraph G,ArcNode v));
int PrintElement(ALGraph G,ArcNode v);
void menu();
void depthfirstsearch(ALGraph *g,int vi);
void travel(ALGraph *g);
void breadfirstsearch(ALGraph *g);
int i;
G.arcnum = G.vexnum = 0;
while(1)
{
menu();
do
{
printf ( "请输入要进行的操作\n" );
scanf ("%d",&i);
if (i<1||i>6)
printf("错误数字,请重新输入\n");
}while (i<1||i>6);
switch (i)
{
case 1: CreateUDG(G);
system("pause"); system("cls"); break;
case 2: DeleteUDG(G); system("pause"); system("cls"); break;
case 3: InsertUDG(G); system("pause"); system("cls"); break;
case 4: travel(&G); system("pause"); system("cls"); break;
case 5: breadfirstsearch(&G); system("pause"); system("cls"); break;
case 6: exit(0); break;
}
}
return 1;
}
void enterqueue(int v)
{
q.data[q.rear]=v;
q.rear++;
}
int deletequeue()
{
int t;
t=q.data[q.front];
q.front++;
return(t);
}
int empty()
{
if(q.front==q.rear)
return 1;
return 0;
}
int LocateVex(ALGraph G,char node[2]) {
int i;
for(i = 0 ; i < G.vexnum ; i++)
{
if(strcmp(G.vertices[i].data,node)= =0)
return i;
}
return -1;
}
int CreateUDG(ALGraph &G)
{
int LocateVex(ALGraph G,char node[2]);
void PrintUDG(ALGraph G);
int i,j,k;
char node1[2],node2[2];
ArcNode *p,*q;
printf("请输入顶点数和弧数\n");
printf("例如:5,6\n");
scanf("%d,%d",&G.vexnum,&G.arc num);
printf("请输入各顶点\n");
for(i = 0 ; i < G.vexnum ; i++)
{
printf("第%d个\n",i+1);
scanf("%s",&G.vertices[i]);
G.vertices[i].firstarc = NULL;
}
//这里开始构造边
printf("请输入边的信息\n");
printf("例如:v1 v2\n");
for(i = 0 ; i < G.arcnum ; i++)
{
printf("第%d条边\n",i+1);
scanf("%s %s",&node1,&node2);
j = LocateVex(G,node1);
k = LocateVex(G,node2);
p = (ArcNode *)malloc(sizeof(ArcNode));
q = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = k;
q->adjvex = j;
p->nextarc = G.vertices[j].firstarc;
G.vertices[j].firstarc = p;
q->nextarc = G.vertices[k].firstarc;
G.vertices[k].firstarc = q;
}