其他分享
首页 > 其他分享> > 数据结构c代码7:图的邻接表表示及其存储

数据结构c代码7:图的邻接表表示及其存储

作者:互联网

下面是用c语言实现的关于图的邻接表表示及其存储代码:

  1 #include<iostream>
  2 using namespace std;
  3 /**
  4  * *用邻接表表示图的存储结构步骤如下:
  5  * 输入 总顶点数和总边数 
  6  * 依次输入点的信息存入顶点表中,使每个表头结点的指针域初始化为NULL
  7  * 创建邻接表。依次输入每条边依附的两个顶点,确定这两个顶点的序号i和j之后,将此边结点分别插入vi和vj对应的
  8  * 两个边链表的头部。 
  9  **/
 10 #define MVNum 100         //最大顶点数 
 11 typedef char VerTexType;   //假设顶点的数据类型为字符类型 
 12 
 13 typedef struct ArcNode     //边结点 
 14 {
 15     int adjvex;            //该边所指向的顶点的位置 
 16     struct ArcNode *nextarc;  //指向下一条边的指针 
 17     int info;                //和边相关的信息 
 18 }ArcNode; 
 19 
 20 typedef struct VNode      //顶点信息 
 21 {
 22     VerTexType data;
 23     ArcNode *firstarc;   //指向第一条依附该顶点边的节点 
 24 }VNode, AdjList[MVNum];  //AdjList表示邻接表类型 
 25 
 26 typedef struct ALGraph   //邻接表 
 27 {
 28     AdjList vertices; 
 29     int vexnum, arcnum;    //图当前的顶点数和边数 
 30 }ALGraph;
 31 
 32 int LocateVex(ALGraph G, char v)
 33 {
 34     int index = 0;
 35     for(int i=0;i<G.vexnum;i++)
 36     {
 37         if(G.vertices[i].data == v)
 38         {
 39             index = i;
 40             break;
 41         }
 42     }
 43     return index;
 44 } 
 45 
 46 void Creat_UDG(ALGraph &G)
 47 {
 48     char v1, v2; 
 49     cout<<"请输入顶点数和边数:";
 50     cin>>G.vexnum>>G.arcnum;    //输入总顶点数和边数 
 51     
 52     cout<<"请输入各点:\n";
 53     for(int i=0;i<G.vexnum;i++)   //输入各点,构造表头结点 
 54     {
 55         cin>>G.vertices[i].data;  //输入顶点值 
 56         G.vertices[i].firstarc = NULL;   //初始化表头结点的指针域为NULL 
 57     }
 58     
 59     for(int k=0;k<G.arcnum;k++)  //输入各边,构造邻接表 
 60     {
 61         cout<<"请输入第"<<k+1<<"条边相邻的两个顶点:\n"; 
 62         cin>>v1>>v2;   //输入一条边依附的两个顶点
 63         int i = LocateVex(G, v1);
 64         int j = LocateVex(G, v2);  
 65         
 66         //将新节点*p1插入顶点vi的边表头部 
 67         ArcNode * p1 = (ArcNode *)malloc(sizeof(ArcNode));
 68         p1->adjvex = j;
 69         p1->nextarc = G.vertices[i].firstarc;
 70         G.vertices[i].firstarc = p1;
 71         
 72         //将新节点*p2插入顶点vj的边表头部 
 73         ArcNode * p2 = (ArcNode *)malloc(sizeof(ArcNode));
 74         p2->adjvex = i;
 75         p2->nextarc = G.vertices[j].firstarc;
 76         G.vertices[j].firstarc = p2; 
 77     } 
 78 }
 79 
 80 void print_UDG(ALGraph G)
 81 {
 82     cout<<"建立的邻接表如下:\n";
 83     for(int i=0;i<G.vexnum;i++)
 84     {
 85         cout<<i<<" "<<G.vertices[i].data<<"->";
 86         ArcNode *p = G.vertices[i].firstarc;
 87         while(p!=NULL)
 88         {
 89             cout<<p->adjvex;
 90             p = p->nextarc;
 91             if(p!=NULL)
 92             {
 93                 cout<<"->";
 94             }
 95             else
 96                 cout<<"\n";
 97         }
 98     }
 99 }
100 int main()
101 {
102     ALGraph G;
103     Creat_UDG(G);
104     print_UDG(G);
105     return 0;
106 }

运行结果如下:

有不懂的可以留言,如果这篇文章对你有帮助,请帮忙给个赞!!!!

标签:p2,存储,firstarc,int,vertices,ArcNode,邻接,顶点,数据结构
来源: https://www.cnblogs.com/yyn520cyq/p/15731425.html