数据结构学习笔记 图:邻接表(严蔚敏版)

   邻接表(Adjacency  List)是图的一种链式存储结构。在邻接表中,对图中的每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对有向图是以顶点vi为尾的弧)。每个结点有三个域组成,其中邻接点域(adjvex)指示与顶点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的结点;数据域(info)存储和边或弧相关的信息,如权值等。每个链表上附设一个表头结点。在表头结点中,除了链域(firstarc)指向链表中的第一结点之外,还设有存储顶点vi的名或其他相关信息的数据域(data)。

如图:



图:


#include<iostream>
using namespace std;
#include<malloc.h>
#include<string.h>
#define MAX_NAME       5                                //顶点字符串的最大长度
#define MAX_VERTEX_NUM 20                               //顶点最大长度
#define OK             1    
#define FALSE          -1  
typedef char VertexType[MAX_NAME];
typedef int InfoType;
typedef struct ArcNode        
{
	int             adjvex;                         //该弧所指向的顶点的位置
        struct ArcNode  *nextarc;                       //指向下一条弧的指针
	InfoType        *info;                          //该弧相关信息
}ArcNode;
typedef struct VNode
{
	VertexType data;                                //顶点信息,   如 v1, v2,v3
	ArcNode *firstarc;                              //指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VERTEX_NUM];                         
typedef struct
{
   AdjList vertices;
   int vexnum, arcnum;                                  //图的当前顶点数和弧数
   int king;                                            //图的种类标志    
}ALGraph;
int LocateVex(ALGraph &G, VertexType &u)                //返回顶点u在vertices数组中的位置
{
	for(int i = 0; i < G.vexnum; ++i)
		if(strcmp(G.vertices[i].data,u) == 0)
			return i;
	return FALSE;
}
int CreateDG(ALGraph &G)
{
	int IncInfo, i, j, k;
        VertexType v1,v2;
	cout << "请输入有向图的顶点数:" << endl;
	cin >> G.vexnum;
	cout << "请输入有向图的弧数:" << endl;
	cin >> G.arcnum;
        cout << "请输入有向图的弧是否含有其它信息:(有:1 无:0)" << endl;
	cin >> IncInfo;
        cout << "请输入有向图的所有顶点:" << endl;
	for (i = 0; i < G.vexnum; ++i)                                     //初始化G.vertices数组
	{
		cout << "请输入第" << i+1 << "个顶点" << endl;
		scanf("%s",&G.vertices[i].data);
		//gets(G.vertices[i].data);
		G.vertices[i].firstarc = NULL;
	}
	cout << "请输入弧,如:(v1->v2)" << endl;
	for (k = 0; k < G.arcnum; ++k)
	{
		cout << "请输入第" << k+1 << "条弧" << endl;
		cin >> v1;
		cout << v1 << "->";
		cin >> v2;
		i = LocateVex(G,v1);                                      //如果v1存在,则返回v1在数组G.vertices[]中的位置,否则返回-1
		j = LocateVex(G,v2);
              while(i<0 || i > G.vexnum-1 || j<0 || j > G.vexnum-1)
	      {
		      cout << "找不到该弧所依附的顶点,请重新输入:" << endl;
		      cout << "请输入第" << k+1 << "条弧" << endl;
		      cin >> v1;
		      cout << "->";
		      cin >> v2;
		      i = LocateVex(G,v1);                                //如果v1存在,则返回v1在数组G.vertices[]中的位置,否则返回-1
		      j = LocateVex(G,v2);
	      }
	      ArcNode *p;
	      p = (ArcNode *)malloc(sizeof(ArcNode));                     //开辟内存空间
              if(!p)
	      {
		      cout << "溢出" << endl;
		      return 0;
	      }
	      p->adjvex = j;                                              //这里运用了单链表的逆序构建
	      p->info   = NULL;
	      p->nextarc = G.vertices[i].firstarc;
	      G.vertices[i].firstarc = p;
	      if(IncInfo)
	      {
		      cout << "请输入单链表的其它信息:" << endl;
		      cin >> *(p->info);
	      }   // if end

	}   // for end
	return OK;
}     // CreateDG() end
void DisplayDG(ALGraph &G)
{     
	cout << "邻接表:" << endl;
	for(int i = 0; i < G.vexnum; ++i)
	{
		cout << G.vertices[i].data << ' ';
		for(ArcNode *p = G.vertices[i].firstarc; p!=NULL; p=p->nextarc)
		{
			cout << p->adjvex << ' ';
		}
		cout << endl;
	}
}
void DestroyDG(ALGraph &G)
{
	ArcNode *q;
	for(int i = 0; i > G.vexnum; ++i)
	   for (ArcNode *p = G.vertices[i].firstarc; p!=NULL; )
	   {
                q = p;
		p = p->nextarc;
		free(q);
	   }
	
}
int main()
{
	ALGraph G;
	CreateDG(G);
	DisplayDG(G);
	DestroyDG(G);
	return 0;

}
运行结果:



采用C++编写,完成了题目的所有要求,并附有说明文档。 大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年含两学 期,每学期的时间长度和学分上限值均相等,每个专业开设的课程都是确定的,而且课程在 开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门, 也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。 [基本要求] (1)输入参数包括:学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。 (2)允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。 (3)若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。计划的表格格式自行设计。 [测试数据] 学期总数:6;学分上限:10;该专业共开设12门课,课程号从C01到C12,学分顺序为2,3,4,3,2,3,4,4,7,5,2,3。先修关系如下: 课程编号 课程名称 先决条件 C1 程序设计基础 无 C2 离散数学 C1 C3 数据结构 C1,C2 C4 汇编语言 C1 C5 语言的设计和分析 C3,C4 C6 计算机原理 C11 C7 编译原理 C5,C3 C8 操作系统 C3,C6 C9 高等数学 无 C10 线性代数 C9 C11 普通物理 C9 C12 数值分析 C9,C10,C1 [实现提示] 可设学期总数不超过12,课程总数不超过100。如果输入的先修课程号不在该专业开设的课程序列中,则作为错误处理。应建立内部课程序号与课程号之间的对应关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值