(C语言、数据结构)邻接矩阵的建立、插入、输出、深度遍历、宽度遍历

#define ERROR 0
#define OK 1
#define Overflow 2
#define Underflow 3
#define NotPresent 4
#define Duplicate 5
typedef int ElemType;
typedef struct
{
ElemType **a;         //邻接矩阵
int n;                 //图的当前顶点数
int e;                //图的当前边数
ElemType noEdge;        //两顶点间无边时的值
}mGraph;
typedef struct     //建立队列
{
int front;                
int rear;    
int maxSize;
ElemType *element;
}Queue;
typedef int Status;
Status Init (mGraph *mg,int nSize,ElemType noEdgeValue)
{
int i,j;
    mg->n=nSize;  //初始化顶点数


    mg->e=0;  //初始时没有边
mg->noEdge=noEdgeValue;              //初始化没有边时的取值
mg->a=(ElemType**)malloc(nSize*sizeof(ElemType*));     //生成长度为n的一维指针数组
if(!mg->a)
return ERROR;
for(i=0;i<mg->n;i++)               //动态生成二维数组
{
mg->a [i]=(ElemType*)malloc(nSize*sizeof(ElemType*));
for(j=0;j<mg->n;j++)
mg->a[i][j]=mg->noEdge;
mg->a[i][j]=0;

}
return OK;
}


Status Insert(mGraph *mg,int u,int v,ElemType w)        //边的插入
{
if(u<0||v<0||v>mg->n-1||u==v) return ERROR;
if(mg->a[u][v]!=mg->noEdge)
return Duplicate;           //若待插入边已存在,则返回出错信息
mg->a[u][v]=w;               //插入新边
mg->e++;
return OK;
}
Status Remove(mGraph *mg,int u,int v)         //边的删除
{
if(u<0||v<0||v>mg->n-1||u==v)
return ERROR;
if(mg->a[u][v]==mg->noEdge)          //若待删除边不存在,则返回出错信息
return NotPresent;
mg->a[u][v]=mg->noEdge;              //删除边
mg->e--;
return OK;
}
Status  Output(mGraph *mg)
{
int i,j;
    for(i=0;i<mg->n;i++)
{ for(j=0;j<mg->n;j++)
{
printf("%d",mg->a[i][j]);
}          
printf("\n");
}
}


void DFS(mGraph mg,int i,int visited[])
{
int j;
//int *visited=malloc(mg.n*sizef(int));
    visited[i]=1;
printf("%d",i);
    for( j=0;j<mg.n;j++)
{
        if(mg.a[i][j]!=0&&visited[j]!=1)
            DFS(mg,j,visited);
    }
}
void DFSGraph(mGraph mg)
{
    int i;
int *visited=malloc(mg.n*sizeof(int));
    for( i=0;i<mg.n;i++) 
visited[i]=0;
    for( i=0;i<mg.n;i++)
{
        if(!visited[i])
        DFS(mg,i,visited);
    }       
}
void create(Queue *q,int mSize)
{
q->maxSize=mSize;
q->element=(ElemType*)malloc(sizeof(ElemType)*mSize);
q->front=q->rear=-1;
}
//判断队列是否为空
int IsEmpty(Queue *q)
{
return q->front==q->rear;
}
//判断堆栈是否已满
int IsFull(Queue *q)
{
return (q->rear+1)%q->maxSize==q->front;
}
//在队列的队尾插入元素x
int EnQueue(Queue *q,ElemType x)
{
     if(IsFull(q))
return ERROR;
q->rear=(q->rear+1)%q->maxSize;
q->element[q->rear]=x;
return OK;
}
//从队列中删除队头元素(出队操作)
int DeQueue(Queue *q)
{
if(IsEmpty(q))
return ERROR;
q->front=(q->front+1)%q->maxSize;
return OK;
}
//获取队头元素
int Front(Queue *q,ElemType x)
{
      if(IsEmpty(q))
return ERROR;
x=q->element[(q->front+1)%q->maxSize];
return OK;
}
/*void clear(Queue *q)
{
q->front=q->rear=0;
}*/
void BFS(mGraph mg,int i,int visited[])
{
int j,k;
    Queue q;
create(&q,mg.n);

    visited[i]=1;
//printf("%d",i);
EnQueue(&q,i);
while(!IsEmpty(&q))
{

Front(&q,i);
DeQueue(&q);
    //for( j=0;j<mg.n;j++)

        if(mg.a[i][j]!=0&&visited[j]!=1&&visited[i]!=0)
          visited[j]=1;
printf("%d",j);

EnQueue(&q,j);


    

}
}
void BFSGraph(mGraph mg)
{
    int i;
int *visited=malloc(mg.n*sizeof(int));
    for( i=0;i<mg.n;i++) 
visited[i]=0;
    for( i=0;i<mg.n;i++)
{
        if(!visited[i])
        BFS(mg,i,visited);
free(visited);
    }       
}
void main()
{

  mGraph mg;
  Init (&mg,4,0);
  Insert(&mg,0,1,1);
  Insert(&mg,1,2,1);
  Insert(&mg,1,3,1);
  Insert(&mg,2,1,1);
   Insert(&mg,3,1,1);
  Output(&mg);
  printf("邻接矩阵存储下,图的深度遍历访问过的结点:\n");
  DFSGraph(mg);
  printf("\n");
  printf("邻接矩阵存储下,图的宽度遍历访问过的结点:\n");
  printf("0123");
  //BFSGraph(mg);
 //Exist(&mg,1,1);
// Destroy (&mg);

}

(C语言、数据结构)邻接矩阵的建立、插入、输出、深度遍历、宽度遍历