(C語言、資料結構)鄰接矩陣的初始化、邊的插入和輸出,以及鄰接矩陣的撤銷和邊的搜尋

阿茶大人發表於2018-06-17

#include<stdio.h>
#include<stdlib.h>
#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 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;
}


void   Destroy (mGraph *mg )   //鄰接矩陣的撤銷 
{
int i;
for(i=0;i<mg->n;i++)            //釋放n個一維陣列的儲存空間
free(mg->a[i]);               //釋放一維指標陣列的儲存空間
free(mg->a);
}
Status Exist(mGraph *mg,int u,int v)  //邊的搜尋
{
if(u<0||v<0||v>mg->n-1||u==v||mg->a[u][v]==mg->noEdge)
return ERROR;
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 Putout(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 main()
{

  mGraph mg;
  Init (&mg,4,0);
  Insert(&mg,1,0,1);
  Insert(&mg,1,2,1);
  Insert(&mg,2,3,1);
  Insert(&mg,3,0,1);
  Putout(&mg);
 //Exist(&mg,1,1);
// Destroy (&mg);
}

 

  實際上,圖的鄰接矩陣的建立方法是一樣的,不論是無向圖還是有向圖,還是權數都與輸入的數值有關,建立鄰接矩陣的程式碼是沒有區別的,主要的區別在於Insert(插入函式的區別)

Status Insert(mGraph *mg,int u,int v,ElemType w)        //邊的插入

int u 決定行的值

int v 決定列的值

ElemType w  決定權值

相關文章