数据结构之图题集

邻接矩阵存储结构

图的邻接矩阵存储结构
#define MaxVertexNum l00 //最大顶点数,应由用户定义
typedef char VertexType; //顶点类型应由用户定义
typedef int EdgeType; //边上的权值类型应由用户定义
typedef struct{
   
VextexType vexs[MaxVertexNum] //顶点表
EdeType edges[MaxVertexNum][MaxVertexNum];//邻接矩阵,可看作边表
int n,e; //图中当前的顶点数和边数
}MGragh;

邻接表存储结构

typedef struct ArcNode //边表结点
{
   
    int adjvex;//邻接点域,存储邻接顶点对应的下标
    InfoType* info; //用于存储权值,对于非网图可以不需要
    struct ArcNode* nextarc;//链域,指向下一个邻接点
}ArcNode;//ArcNode 邻接点

typedef struct VNode//顶点表结点
{
   
    VertexType data;//顶点域,存储顶点信息
    ArcNode* firstarc;//边表头指针
}VNode,AdjList[MaxVertexNum];//VNode 顶点 | AdjList 邻接点位置下标(adjvex)的数组

typedef struct
 {
   
    AdjList vertices;//存放顶点的顺序表
    int vexnum,arcnum; // 图中当前顶点数和边数
 }ALGraph;

数据结构习题

删除顶点

1.无向图采用邻接表为存储结构,写一函数,删除图中的某一顶点Vi  (2004)
 void deleteV(ALGraph G,int i,int x){
   
 	ArcNode *p,*q,*r;
 	p=G->adjList[i].firstarc;
 	q=p->nextarc;
 	r=p;
 	while(q){
   
 		if(q->data==x){
   
 			G.arcnum--;
 			p->nextarc=q->nextarc;
 			free(q);
 			q=p->nextarc;
 		}
 	else{
   
 		p=p->nextarc;
 		q=q->nextarc;
 		}
 	if(r->data==x){
   
 		G->adjList.firstarc=r->nextarc;
 		G.arcnum--;
 	}
 	}
 	for(j=0;j<G.vexnum;j++){
   
		deleteV(G,j,i);
	}
 }

判断连通图(无向图)

2.判断邻接表表示的无向图是否为连通图(2005)
void DFS(Graph G,int v,int vn){
   
	Graph *p;
	visited[v]=1;
	++vn;
	p=G->vertices[v].firstarc;
	while(p){
   
		if(!visit[p->vertex]){
   
			DFS(G,p->vertex,vn);
			p=p->nextarc;
		}
}
int  A(ALGraph G){
   
	int vn=0;
	for(int i=0;i<G->vexnum;i++){
   
		visit[i]=0;
		DFS(G,i,vn);
	}
	if(vn==G->vexnum)	return 1;
	else 	return 0;
}

3.无向图建立邻接多重表存储结构(2006)

参考:https://www.cnblogs.com/cpoint/p/3480218.html

顶点的度

4.有向图十字链表存储结构,编写求图中顶点i的出度和入度算法(2007)
int count(OLGraph *G,int i){
   
	OLGraph *p,*q;
	int insum=outsum=0;
	p=xList[i].firstin;
	q=xList[i].firstout;
	while(p->hlink!=NULL){
   
	++insum;
	p=p->hlink;
	}
	while(q->tlink!=NULL){
   
	++outsum;
	p=p->tlink;
	}
}

判断回路(有向图)

5.判断有向图是否有回路(2008)==拓扑排序

void TopologicalSort
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
...... ( B )3. 有8个结点的无向图最多有 条边。 A.14 B. 28 C. 56 D. 112 ( C )4. 有8个结点的无向连通图最少有 条边。 A.5 B. 6 C. 7 D. 8 ( C )5. 有8个结点的有向完全图有 条边。 A.14 B. 28 C. 56 D. 112 ( B )6. 用邻接表表示图进行广度优先遍历时,通常是采用 来实现算法的。 A.栈 B. 队列 C. 树 D. 图 ...... 二、填空(每空1分,共20分) 1. 图有 邻接矩阵 、 邻接表 等存储结构,遍历图有 深度优先遍历 、 广度优先遍历 等方法。 2. 有向图G用邻接表矩阵存储,其第i行的所有元素之和等于顶点i的 出度 。 3. 如果n个顶点的图是一个环,则它有 n 棵生成树。 4. n个顶点e条边的图,若采用邻接矩阵存储,则空间复杂度为 O(n2) 。 5. n个顶点e条边的图,若采用邻接表存储,则空间复杂度为 O(n+e) 。 ....... 1. 【严7.1①】已知如图所示的有向图,请给出该图的: 每个顶点的入/出度; 邻接矩阵; 邻接表; 逆邻接表。 2. 【严7.7②】请对下图的无向带权图: 写出它的邻接矩阵,并按普里姆算法求其最小生成树; 写出它的邻接表,并按克鲁斯卡尔算法求其最小生成树。 ........ 五、算法设计(每10分,共30分) 1. 【严7.14③】编写算法,由依次输入的顶点数目、弧的数目、各顶点的信息和各条弧的信息建立有向图的邻接表。 解:Status Build_AdjList(ALGraph &G) //输入有向图的顶点数,边数,顶点信息和边的信息建立邻接表 { InitALGraph(G); scanf("%d",&v); if(v<0) return ERROR; //顶点数不能为负 G.vexnum=v; scanf("%d",&a); if(a<0) return ERROR; //边数不能为负 G.arcnum=a; for(m=0;m<v;m++) G.vertices[m].data=getchar(); //输入各顶点的符号 for(m=1;m<=a;m++) { t=getchar();h=getchar(); //t为弧尾,h为弧头 if((i=LocateVex(G,t))<0) return ERROR; if((j=LocateVex(G,h))nextarc;q=q->nextarc); q->nextarc=p; } p->adjvex=j;p->nextarc=NULL; }//while return OK; }//Build_AdjList 2. 【严7.15③】试在邻接矩阵存储结构上实现图的基本操作:DeleteArc(G,v,w)。 (刘提示:删除所有从第i个顶点出发的边的方法是 将邻接矩阵的第i行全部置0 ) ........
数据结构Dijkstra 1.3、将二叉树看作图,并对它作图的深度优先遍历,则与原二叉树的 结果是相同的。 A、前序遍历 B、中序遍历C、后序遍历D、层次序遍历 1.4、在关于树的以下4种叙述中,正确的是 。 A、用指针方式存储有n个结点的二叉树,至少要有n+1个指针。 B、m阶B-树中,具有k个子结点的结点,必有k-1个键值。 C、m阶B-树中,每个非叶子结点的子结点个数≥[m/2]。 D、平衡树一定是丰满树。 1.5、在最好和最坏情况下的时间复杂度均为O(nlog2n)且稳定的排序方法是 A、希尔排序 B、快速排序 C、堆排序 D、归并排序 二、解答 2.1、对目标串 abaabcc和模式串aabc,描述根据KMP算法进行匹配的过程,包括失效函数计算。答:失效函数:-1, 0, -1, -1 目标串 abaabcc和模式串aabc的KMP算法进行匹配的过程 abaabcc aabc 首先,从目标位置0和模式位置0开始比较,至ab和aa,不等时目标位置为1, 模式位置为1。因0位置失效函数的值( f [posP-1] ) 为-1,从目标位 置1和模式位置0开始新一轮比较。因第一个字符( posP == 0 )就不等,目标 位置增1,目标位置2和模式位置0开始新一轮比较,直到模式位置比较至4, 匹配成功。 int fastFind ( char *s, char * pat ){ //带失效函数的KMP匹配算法 int posP = 0, posT = 0; int lengthP = strlen(pat), lengthT = strlen(s); while ( posP < lengthP && posT < lengthT ) if ( pat[posP] == s[posT] ) { posP++; posT++; //相等继续比较 } else if ( posP == 0 ) posT++; //不相等 else posP = f [posP-1]+1; if ( posP < lengthP ) return -1; else return posT - lengthP; }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值