小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

c語言數(shù)據(jù)結(jié)構(gòu)--圖的鄰接矩陣和鄰接表操作的基本操作

 Ethan的博客 2010-11-14

#include <stdio.h>

#include <malloc.h>

#include <time.h>

#define MAX 100

typedef char DataType;

typedef int VectorRelationType;

typedef char VectorType;

 

typedef struct arcell

{

   VectorRelationType adj;

   //DataType * data;

}arcell, adjmatrix[MAX][MAX];

 

//鄰接矩陣定義

typedef struct

{

   VectorType vexs[MAX]; //頂點(diǎn)向量

   adjmatrix arcs;       //鄰接矩陣

   int vexnum, arcnum;   //圖的當(dāng)前頂點(diǎn)數(shù)和邊數(shù)

// GraphType kind;

}MGraph;           

 

typedef struct ArcNode

{

   int adjvex;           //鄰接點(diǎn)在頭結(jié)點(diǎn)數(shù)組中的位置(下標(biāo))

   struct ArcNode * nextarc; //指向下一個(gè)表結(jié)點(diǎn)

   DataType * date;

}ArcNode;

 

//頂點(diǎn)結(jié)點(diǎn)

typedef struct VNode

{

   VectorType vexdata;

   ArcNode * firstarc;

}VNode, Adjlist[MAX];

 

//鄰接表類型定義

typedef struct

{

   Adjlist vexs;

   int vexnum, arcnum;

   //GraphType gtype;

}ALGraph;

 

//打印鄰接表

void TraverseG(ALGraph G)

{

   ArcNode * p;

   int i;

   printf("圖的鄰接表如下:\n");

   for(i = 0; i < G.vexnum; i++)

   {

      printf("%c ->", G.vexs[i].vexdata);

      p = G.vexs[i].firstarc;

      while(p)

      {

        printf("%d ->", p->adjvex);

        p = p->nextarc;

      }

      printf("NULL\n");

   }

}

 

//確定v在鄰接矩陣中位置

int Locatevex(ALGraph * G, VectorType v)

{

   int i;

   for(i = 0; i < G->vexnum; i++)

      if(G->vexs[i].vexdata == v)

        return (i);

   return -1;

}

 

int locatevexM(MGraph * G, VectorType v)

{

   int i;

   for(i = 0; i < G->vexnum; i++)

      if(G->vexs[i] == v)

        return (i);

   return -1;

}

 

//建立鄰接矩陣

void CreateMGraph(MGraph * G)

{

   int i, j, k, w;

   VectorType u, v;

   printf("創(chuàng)建有向圖的鄰接矩陣\n");

   printf("請(qǐng)輸入當(dāng)前的頂點(diǎn)數(shù)和弧數(shù)(vex arc): \n");

   fflush(stdin);        //清空輸入緩沖區(qū),確保不影響后面的數(shù)據(jù)讀取

   scanf("%d %d", &G->vexnum, &G->arcnum);

 

   for(i = 0; i < G->vexnum; i++)

   {

      printf("請(qǐng)輸入第%d個(gè)頂點(diǎn)(vertex): \n", i+1);

      fflush(stdin);

      scanf("%c", &G->vexs[i]);

   }

 

   for(i = 0; i < G->vexnum; i++)

   {

      for(j = 0; j < G->vexnum; j++)

      {

        G->arcs[i][j].adj = 0;

      }

   }

 

   for(k = 0; k < G->arcnum; k++)

   {

      printf("請(qǐng)輸入頂點(diǎn)和權(quán)值<u v w): \n");

      fflush(stdin);

      scanf("%c %c %d", &u, &v, &w);

      i = locatevexM(G, u);

      j = locatevexM(G, v);

      G->arcs[i][j].adj = w;

   }

}

 

 

void CreateALGraph(ALGraph * G)

{

   int i, j, k;

   ArcNode * s;

   char u, v;

   printf("請(qǐng)輸入當(dāng)前頂點(diǎn)數(shù)和弧數(shù)(vex arc):\n");

   fflush(stdin);

   scanf("%d %d", &G->vexnum, &G->arcnum);

   printf("首先輸入頂點(diǎn):\n");

   for(i = 0; i < G->vexnum; i++)

   {

      printf("請(qǐng)輸入頂點(diǎn)%d,回車輸入下一個(gè)頂點(diǎn)\n", i);

      fflush(stdin);

      scanf("%c", &(G->vexs[i].vexdata));

      G->vexs[i].firstarc = NULL;

   }

 

   printf("接下來輸入弧:\n");

   for(k = 0; k < G->arcnum; k++)

   {

      printf("請(qǐng)輸入弧%d, 回車輸入下一條弧\n", k);

      fflush(stdin);

      scanf("%c %c", &u, &v);

      i = Locatevex(G, u);

      j = Locatevex(G, v);

      s = (ArcNode *)malloc(sizeof(ArcNode));

      s->adjvex = j;

      s->nextarc = G->vexs[i].firstarc;

      G->vexs[i].firstarc = s;

   }

}

 

void Print_MGraph(MGraph * G)

{

   int i, j;

   printf("\n");

   printf("鄰接矩陣輸入如下: \n");

   printf("[]");

   for(i = 0; i < G->vexnum; i++)

      printf("%c ", G->vexs[i]);

   printf("\n");

   for(i = 0; i < G->vexnum; i++)

   {

      printf("%c ", G->vexs[i]);

      for(j = 0; j < G->vexnum; j++)

        printf("%d ", G->arcs[i][j].adj);

      printf("\n");

   }

}

 

//鄰接表轉(zhuǎn)換為鄰接矩陣

void list_to_mat(ALGraph * AG, MGraph * MG)

{

   int i, j;

   ArcNode * p;

   MG->vexnum = AG->vexnum;

   for(i = 0; i < AG->vexnum; i++)

   {

      for(j = 0; j < AG->vexnum; j++)

      {

        MG->arcs[i][j].adj = 0;

      }

   }

 

   for(i = 0; i < AG->vexnum; i++)

   {

      MG->vexs[i] = AG->vexs[i].vexdata;

   }

 

   printf("圖的頂點(diǎn)向量如下:\n");

   for(i = 0; i < AG->vexnum; i++)

   {

      printf("%d %c\n", i, MG->vexs[i]);

   }

 

   for(i = 0; i < AG->vexnum; i++)

   {

      p = AG->vexs[i].firstarc;

      while(p != NULL)

      {

        MG->arcs[i][p->adjvex].adj = 1;

        p = p->nextarc;

      }

   }

}

 

void main()

{

   MGraph  MG;

   ALGraph AG;

   CreateALGraph(&AG);

   TraverseG(AG);

   list_to_mat(&AG, &MG);

   Print_MGraph(&MG);

   CreateMGraph(&MG);

   Print_MGraph(&MG);

}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多