图算法
邻接矩阵存储结构
图的邻接矩阵存储结构
#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