【数据结构】图的邻接表存储完整代码

简介: 【数据结构】图的邻接表存储完整代码

图的邻接表存储完整代码

建立邻接表

计算各顶点的入读出度总度

计算权值最大的边

打印邻边

主函数

实现代码

程序样例


建立邻接表


//以出度和入读建立邻接表
void CreateALGraph(ALGraph *G,ALGraph *G2)
{
  int i,j,k,qz;
  EdgeNode *s,*d;
  printf("请输入顶点数:");
  scanf("%d",&(G->n));G2->n=G->n;
  printf("请输入边数:");
  scanf("%d",&(G->e));G2->e=G->e;
  printf("-------------------------------------\n");
  printf("请输入顶点信息(输入格式为:<回车>顶点号,顶点):\n");
  for(i=0;i<G->n;i++)
  {
    printf("请输入第%d个顶点的信息:",i+1);
    scanf("\n%d,%c",&(G->adjlist[i].vertex),&G->a[i]);//读入顶点信息
    G->adjlist[i].firstedge=NULL;//顶点的边表头指针设为空
    G2->adjlist[i].vertex=G->adjlist[i].vertex;
    G2->a[i]=G->a[i];//读入顶点信息
    G2->adjlist[i].firstedge=NULL;//顶点的边表头指针设为空
  }
  printf("-------------------------------------\n");
  printf("请输入边表的信息(输入格式为:i,j,权重):\n");
  for(k=0;k<G->e;k++) //建立边表
  {
    printf("请输入第%d个边表的信息:",k+1);
    scanf("%d,%d,%d",&i,&j,&qz);  //读入边<vi,vj>的顶点对应序号
    //以出度---建立G1
    s=(EdgeNode *)malloc(sizeof(EdgeNode));//生成新边表结点
    s->adjvex=j;  //邻接点序号为j
    s->next=G->adjlist[i].firstedge;//将边表插入到顶点的边表表头
    s->info=qz;   //权值
    G->adjlist[i].firstedge=s;
    //以入度---建立G2
    d=(EdgeNode *)malloc(sizeof(EdgeNode));//生成新边表结点
    d->adjvex=i;  //邻接点序号为i
    d->next=G2->adjlist[j].firstedge;//与出度相同的操作
    G2->adjlist[j].firstedge=d;
  }
  printf("邻接表方式存储图建立成功\n\n");
  printf("-------------------------------------\n");
}

计算各顶点的入读出度总度


//计算各顶点的出度入度总度
void Degree(ALGraph *G,ALGraph *G2)
{
  int i; 
  //出度以G中第i个链表中结点的个数
  //入度以G2
  for(i=0;i<G->n;i++)//i<边数
  {
    int outnum=0;
    int innum=0;
    struct node *q,*p;
    q=G->adjlist[i].firstedge;
    while(q!=NULL)
    {
      outnum++;q=q->next;
    }
    p=G2->adjlist[i].firstedge;
    while(p!=NULL)
    {
      innum++;p=p->next;
    }
    printf("%c顶点的出度是%d\n",G->a[i],outnum);
    printf("%c顶点的入度是%d\n",G->a[i],innum);
    printf("%c顶点的总度是%d\n\n",G->a[i],outnum+innum);
  }
  printf("顶点度输出完毕\n\n");
  printf("-------------------------------------\n");
}

计算权值最大的边


//计算权值最大的边
void Weights(ALGraph *G)
{ 
  int i,maxi=0,max=0,maxj=0;
  struct node *q;
  for(i=0;i<G->n;i++)
  {
    q=G->adjlist[i].firstedge;  //遍历每条邻接链表 
    while(q!=NULL)
    { 
      if(max<G->adjlist[i].firstedge->info) //记录下权值最大的maxi和maxj 
      {
        maxi=i;
        maxj=G->adjlist[i].firstedge->adjvex;
        max=G->adjlist[i].firstedge->info;
      }
      q=q->next;
    }
  }
  printf("\n权值最大的边是:%c--->%c 权值为%d\n",G->a[maxi],G->a[maxj],max);
  printf("\n");
}

打印邻边


//输出邻边
void Print(ALGraph *G)
{
  struct node *q;
  int i,j,k,cnt,t;
  int b[10];
  for(i=0;i<G->n;i++)
  {
    q=G->adjlist[i].firstedge;
    for(cnt=0,j=0;q!=NULL;j++)
    {
      b[j]=q->adjvex; //保存下标
      q=q->next; cnt++;
    }
    if(cnt==1) ;
    else      //多于1个排序 
    for(j=0;j<cnt-1;j++) 
      for(k=0;k<cnt-i-1;k++)
        if(b[k]>b[k+1]) 
        {
          t=b[k];
          b[k]=b[k+1];
          b[k+1]=t;
        }
    for(j=0;j<cnt;j++)  //输出 
    {
        printf("%c---->%c\n",G->a[i],G->a[b[j]]); 
    }
  }
  printf("邻边输出完毕.......\n");
  printf("-------------------------------------\n");
} 

主函数


void main()
{
  ALGraph G;
  ALGraph G2;//创建一个新图---以入度
  CreateALGraph(&G,&G2); // 邻接表 
  Degree(&G,&G2);//每个顶点的出度 入度 总度 
  Print(&G);//输出邻边 
  Weights(&G);//权重最大的边 
}

实现代码


#include<stdio.h>
#include<malloc.h>
typedef struct node//表结点
{
  int adjvex;//邻接点域 存放顶点序号
  struct node *next;//指向下一个邻接点的指针域
  int info;//权重
}EdgeNode;
typedef struct vnode
{
  int vertex; // 顶点域
  EdgeNode *firstedge; // 边表头指针
}VertexNode;
typedef struct
{
  VertexNode adjlist[10]; //邻接表
  int n,e;//顶点数,边数
  char a[10];
}ALGraph; //ALGraph是以邻接表方式存储的图
//以出度和入读建立邻接表
void CreateALGraph(ALGraph *G,ALGraph *G2)
{
  int i,j,k,qz;
  EdgeNode *s,*d;
  printf("请输入顶点数:");
  scanf("%d",&(G->n));G2->n=G->n;
  printf("请输入边数:");
  scanf("%d",&(G->e));G2->e=G->e;
  printf("-------------------------------------\n");
  printf("请输入顶点信息(输入格式为:<回车>顶点号,顶点):\n");
  for(i=0;i<G->n;i++)
  {
    printf("请输入第%d个顶点的信息:",i+1);
    scanf("\n%d,%c",&(G->adjlist[i].vertex),&G->a[i]);//读入顶点信息
    G->adjlist[i].firstedge=NULL;//顶点的边表头指针设为空
    G2->adjlist[i].vertex=G->adjlist[i].vertex;
    G2->a[i]=G->a[i];//读入顶点信息
    G2->adjlist[i].firstedge=NULL;//顶点的边表头指针设为空
  }
  printf("-------------------------------------\n");
  printf("请输入边表的信息(输入格式为:i,j,权重):\n");
  for(k=0;k<G->e;k++) //建立边表
  {
    printf("请输入第%d个边表的信息:",k+1);
    scanf("%d,%d,%d",&i,&j,&qz);  //读入边<vi,vj>的顶点对应序号
    //以出度---建立G1
    s=(EdgeNode *)malloc(sizeof(EdgeNode));//生成新边表结点
    s->adjvex=j;  //邻接点序号为j
    s->next=G->adjlist[i].firstedge;//将边表插入到顶点的边表表头
    s->info=qz;   //权值
    G->adjlist[i].firstedge=s;
    //以入度---建立G2
    d=(EdgeNode *)malloc(sizeof(EdgeNode));//生成新边表结点
    d->adjvex=i;  //邻接点序号为i
    d->next=G2->adjlist[j].firstedge;//与出度相同的操作
    G2->adjlist[j].firstedge=d;
  }
  printf("邻接表方式存储图建立成功\n\n");
  printf("-------------------------------------\n");
}
//计算各顶点的出度入度总度
void Degree(ALGraph *G,ALGraph *G2)
{
  int i; 
  //出度以G中第i个链表中结点的个数
  //入度以G2
  for(i=0;i<G->n;i++)//i<边数
  {
    int outnum=0;
    int innum=0;
    struct node *q,*p;
    q=G->adjlist[i].firstedge;
    while(q!=NULL)
    {
      outnum++;q=q->next;
    }
    p=G2->adjlist[i].firstedge;
    while(p!=NULL)
    {
      innum++;p=p->next;
    }
    printf("%c顶点的出度是%d\n",G->a[i],outnum);
    printf("%c顶点的入度是%d\n",G->a[i],innum);
    printf("%c顶点的总度是%d\n\n",G->a[i],outnum+innum);
  }
  printf("顶点度输出完毕\n\n");
  printf("-------------------------------------\n");
}
//计算权值最大的边
void Weights(ALGraph *G)
{ 
  int i,maxi=0,max=0,maxj=0;
  struct node *q;
  for(i=0;i<G->n;i++)
  {
    q=G->adjlist[i].firstedge;  //遍历每条邻接链表 
    while(q!=NULL)
    { 
      if(max<G->adjlist[i].firstedge->info) //记录下权值最大的maxi和maxj 
      {
        maxi=i;
        maxj=G->adjlist[i].firstedge->adjvex;
        max=G->adjlist[i].firstedge->info;
      }
      q=q->next;
    }
  }
  printf("\n权值最大的边是:%c--->%c 权值为%d\n",G->a[maxi],G->a[maxj],max);
  printf("\n");
}
//输出邻边
void Print(ALGraph *G)
{
  struct node *q;
  int i,j,k,cnt,t;
  int b[10];
  for(i=0;i<G->n;i++)
  {
    q=G->adjlist[i].firstedge;
    for(cnt=0,j=0;q!=NULL;j++)
    {
      b[j]=q->adjvex; //保存下标
      q=q->next; cnt++;
    }
    if(cnt==1) ;
    else      //多于1个排序 
    for(j=0;j<cnt-1;j++) 
      for(k=0;k<cnt-i-1;k++)
        if(b[k]>b[k+1]) 
        {
          t=b[k];
          b[k]=b[k+1];
          b[k+1]=t;
        }
    for(j=0;j<cnt;j++)  //输出 
    {
        printf("%c---->%c\n",G->a[i],G->a[b[j]]); 
    }
  }
  printf("邻边输出完毕.......\n");
  printf("-------------------------------------\n");
} 
void main()
{
  ALGraph G;
  ALGraph G2;//创建一个新图---以入度
  CreateALGraph(&G,&G2); // 邻接表 
  Degree(&G,&G2);//每个顶点的出度 入度 总度 
  Print(&G);//输出邻边 
  Weights(&G);//权重最大的边 
}

程序样例


目录
相关文章
|
2月前
|
算法 开发者 计算机视觉
燃爆全场!Python并查集:数据结构界的网红,让你的代码炫酷无比!
在编程的世界里,总有一些数据结构以其独特的魅力和高效的性能脱颖而出,成为众多开发者追捧的“网红”。今天,我们要介绍的这位明星,就是Python中的并查集(Union-Find)——它不仅在解决特定问题上大放异彩,更以其优雅的设计和强大的功能,让你的代码炫酷无比,燃爆全场!
40 0
|
26天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
58 1
|
2月前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
34 1
|
2月前
|
存储 安全 数据库
除了 HashMap,还有哪些数据结构可以实现键值对存储?
【10月更文挑战第11天】 除了`HashMap`,其他常见支持键值对存储的数据结构包括:`TreeMap`(基于红黑树,键有序)、`LinkedHashMap`(保留插入顺序)、`HashTable`(线程安全)、`B-Tree`和`B+Tree`(高效存储大量数据)、`SkipList`(通过跳跃指针提高查找效率)及`UnorderedMap`(类似`HashMap`)。选择合适的数据结构需根据排序、并发、存储和查找性能等需求。
|
3月前
|
存储 Java
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
2月前
|
存储 算法 索引
HashMap底层数据结构及其增put删remove查get方法的代码实现原理
HashMap 是基于数组 + 链表 + 红黑树实现的高效键值对存储结构。默认初始容量为16,负载因子为0.75。当存储元素超过容量 * 负载因子时,会进行扩容。HashMap 使用哈希算法计算键的索引位置,通过链表或红黑树解决哈希冲突,确保高效存取。插入、获取和删除操作的时间复杂度接近 O(1)。
32 0
|
2月前
05(数据结构考研)树相关操作代码
05(数据结构考研)树相关操作代码
31 0
|
2月前
|
算法
04(数据结构考研)串相关操作代码
04(数据结构考研)串相关操作代码
21 0
|
2月前
03(数据结构考研)队列相关操作代码
03(数据结构考研)队列相关操作代码
43 0
|
2月前
02(数据结构考研)栈相关操作代码
02(数据结构考研)栈相关操作代码
14 0

热门文章

最新文章