先把所有的笔记贴上了,顺便熟悉一下md的使用。慢慢整理,笔记太多太杂了。
大学学习严蔚敏的数据结构,一下是图的一些常见操作
/*创建无向网UDN*/
int CreateUDN(MGraph * G){
int w = 0;
char v1,v2;
int IncInfo = 0;
scanf("%d%d%d", &G->vexnum, &G->arcnum),&IncInfo);
for (int i = 0; i < G->vexnum; ++i){
scanf("%d", &G->vexs[i]);
}
//初始化矩阵
for (int i = 0; i < G->vexnum; ++i){
for (int j = 0; j < G->vexnum; ++j){
G->arcs[i][j].adj = 0;
G->arcs[i][j].info = NULL;
}
}
//构造邻接矩阵
for (int k = 0; k < G->arcnum; ++k){
scanf("%c%c%d", &v1, &v2, &w);
int i = LocateVex(G, v1);
int j = LocateVex(G, v2);
G->arcs[i][j].adj = w;
G->arcs[j][i].adj = w;
//if(IncInfo)
// Input(G,i,j);
}
return OK;
}
/*创建无向图UDG*/
Status CreateUDG(MGraph *G){
int i,j,k;
char v1[20],v2[20];
scanf("%d%d",&G->vexnum,&G->arcnum);
for(i=0;i<G->vexnum;i++)
scanf("%s",G->vexs[i]);
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++){
G->arcs[i][j].adj=0;
G->arcs[i][j].info=NULL;
}
for(k=0;k<G->arcnum;k++){
scanf("%s%s",v1,v2);
i=LocateVex(*G,v1);
j=LocateVex(*G,v2);
G->arcs[i][j].adj=G->arcs[j][i].adj=1;
}
return OK;
}
/*对节点v的定位*/
Status LocateVex(MGraph G,char * v){
for(int i=0;i<G.vexnum;i++)
if(!strcmp(G.vexs[i],v)) return i;
return -1;
}
/*寻找图G中定点V的下一个点的位置*/
Status FirstAdjVex(MGraph G,int v){
for(int j=0;j<G.vexnum;j++)
if(G.arcs[v][j].adj)
return j;
return -1;
}
/*寻找图G中和定点V同层次的点的位置*/
Status NextAdjVex(MGraph G,int v,int w){
if(!G.arcs[v][w].adj)
return -1;
for(int k=w+1;k<G.vexnum;k++)
if(G.arcs[v][k].adj)
return k;
return -1;
}
/*深度优先搜索*/
void DFSTraverse(MGraph G,Status (*Visit)(MGraph G,int v)){
VisitFunc=Visit;
for(int i=0;i<G.vexnum;i++)
visited[i]=FALSE;
for(int i=0;i<G.vexnum;i++)
if(!visited[i]) DFS(G,i);
}
/*递归-深度优先搜索*/
void DFS(MGraph G,int v){
visited[v]=TRUE;
(*VisitFunc)(G,v);
for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
if(!visited[w])
DFS(G,w);
}
/*广度优先搜索*/
void BFSTraverse(MGraph G,Status (*Visit)(MGraph G,int v)){
int i,w,u;
LinkQueue Q;
for(i=0;i<G.vexnum;i++)
visited[i]=FALSE;
InitQueue(&Q);
for(i=0;i<G.vexnum;i++)
if(!visited[i]){
visited[i]=TRUE;
(*Visit)(G,i);
EnQueue(&Q,i);
while(!QueueEmpty(Q)){
DeQueue(&Q,&u);
for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w)){
if(!visited[w]){
visited[w]=TRUE;
(*Visit)(G,w);
EnQueue(&Q,w);
}
}
}
}
}
/*创建邻接表*/
Status Create(ALGraph *G){
int i,j,k;
char v1[20],v2[20];
ArcNode *p,*q;
fscanf("%d%d",&G->vexnum,&G->arcnum);
for(i=0;i<G->vexnum;i++) {
scanf("%s",G->vertices[i].data);
G->vertices[i].firstarc=NULL;
}
for(k=0;k<G->arcnum;k++){
scanf("%s%s",&v1,&v2);
i=LocateVex(*G,v1);
j=LocateVex(*G,v2);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->nextarc=G->vertices[i].firstarc;
G->vertices[i].firstarc=p;
p->adjvex=j;
q=(ArcNode*)malloc(sizeof(ArcNode));
q->nextarc=G->vertices[j].firstarc;
G->vertices[j].firstarc=q;
q->adjvex=i;
}
}
/*寻找图G中定点V的下一个点的位置*/
Status FirstAdjVex(ALGraph G,int v){
ArcNode *p;
if(p=G.vertices[v].firstarc)
return p->adjvex;
return -1;
}
/*寻找图G中和定点V同层次的点的位置*/
Status NextAdjVex(ALGraph G,int v,int w){
ArcNode *p;
for(p=G.vertices[v].firstarc;p->adjvex!=w;p=p->nextarc);
if(p=p->nextarc)
return p->adjvex;
else
return -1;
}
/*对节点v的定位*/
Status LocateVex(ALGraph G,char *v){
for(int i=0;i<G.vexnum;i++)
if(!strcmp(G.vertices[i].data,v))
return i;
return -1;
}
/*数组存储转链式存储(邻接表)*/
Status MGtoALG(MGraph G,ALGraph *ALG){
int i,j;
ArcNode *p;
ALG->vexnum=G.vexnum;
ALG->arcnum=G.arcnum;
for(i=0;i<G.vexnum;i++){
strcpy(ALG->vertices[i].data,G.vexs[i]);
ALG->vertices[i].firstarc=NULL;
}
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++){
if(G.arcs[i][j].adj){
p=(ArcNode*)malloc(sizeof(ArcNode));
p->nextarc=ALG->vertices[i].firstarc;
ALG->vertices[i].firstarc=p;
p->adjvex=j;
}
}
}