有向图连接链表

图的定义

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #define MAXVEX 100
  4. typedef char VertexType[3];
  5. typedef struct edgenode
  6. {
  7. int adjvex; /*邻接点序号*/
  8. int value; /*边的权值*/
  9. struct edgenode *next; /*下一条边的顶点*/
  10. } ArcNode; /*每个顶点建立的单链表中结点的类型*/
  11. typedef struct vexnode
  12. {
  13. VertexType data; /*结点信息*/
  14. ArcNode *firstarc; /*指向第一条边结点*/
  15. } VHeadNode; /*单链表的头结点类型*/
  16. typedef struct
  17. {
  18. int n,e; /*n为实际顶点数,e为实际边数*/
  19. VHeadNode adjlist[MAXVEX]; /*单链表头结点数组*/
  20. } AdjList; /*图的邻接表类型*/

创建图

  1. int CreateAdjList(AdjList *&G) /*建立有向图的邻接表*/
  2. {
  3. int i,b,t,w;
  4. ArcNode *p;
  5. G=(AdjList *)malloc(sizeof(AdjList));
  6. printf("顶点数(n),边数(e):");
  7. scanf("%d%d",&G->n,&G->e);
  8. for (i=0;i<G->n;i++)
  9. {
  10. printf(" 序号为%d的顶点信息:", i);
  11. scanf("%s",G->adjlist[i].data);
  12. G->adjlist[i].firstarc=NULL;
  13. }
  14. for (i=0;i<G->e;i++)
  15. {
  16. printf(" 序号为边=>",i);
  17. printf(" 起点号 终点号 权值:");
  18. scanf("%d%d%d",&b,&t,&w);
  19. if (b<G->n && t<G->n && w>0)
  20. {
  21. p=(ArcNode *)malloc(sizeof(ArcNode)); /*建立*p结点*/
  22. p->value=w;p->adjvex=t;
  23. p->next=G->adjlist[b].firstarc; /**p插入到adjlist[b]的单链表之首*/
  24. G->adjlist[b].firstarc=p;
  25. }
  26. else
  27. {
  28. printf("输入错误!\n");
  29. return(0);
  30. }
  31. }
  32. return(1);
  33. }

列出图

  1. void DispAdjList(AdjList *G)
  2. {
  3. int i;
  4. ArcNode *p;
  5. printf("图的邻接表表示如下:\n");
  6. for (i=0;i<G->n;i++)
  7. {
  8. printf(" [%d,%3s]=>",i,G->adjlist[i].data);
  9. p=G->adjlist[i].firstarc;
  10. while (p!=NULL)
  11. {
  12. printf("(%d,%d)->",p->adjvex,p->value);
  13. p=p->next;
  14. }
  15. printf("∧\n");
  16. }
  17. }

main

  1. void main()
  2. {
  3. AdjList *G;
  4. CreateAdjList(G);
  5. DispAdjList(G);
  6. }