采用邻接表创建

完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXVEX 20
//邻接表表示
typedef char VertexType;
//边表
typedef struct EdgeNode
{
int adjvex;//连接上节点的下标
struct EdgeNode* next;
}EdgeNode;
//顶点表
typedef struct VertexNode
{
VertexType data;
EdgeNode* firstedge;//边表的头指针    
}VertexNode,AdjList[MAXVEX];
typedef struct
{
AdjList adjlist;//邻接表
int numVertexs,numEdges;//顶点数,边数
}GraphAdjList;
//创建
void Create(GraphAdjList*  G)
{
int i,j,k;
EdgeNode* p;
printf("输入顶点数和边数\n");
scanf("%d%d",&G->numVertexs,&G->numEdges);
//顶点
printf("输入顶点信息:\n");
for(i=0;i<G->numVertexs;i++)
    {
    getchar();
    scanf("%c",&G->adjlist[i].data);
    G->adjlist[i].firstedge=NULL;
    }
//边(边的两头为顶点下标)
printf("输入边(Vi,Vj)中的下标i,j:\n");
for(k=0;k<G->numEdges;k++)
    {
    scanf("%d%d",&i,&j);
    p=(EdgeNode*)malloc(sizeof(EdgeNode));//包括当前连接上的节点,以及下一个节点
//连接上的节点
    p->adjvex=j;
    //采取头插法
    /*
    先把顶点i的第一个连接的位置和p上,然后顶点i再与p连接
    */
    p->next=G->adjlist[i].firstedge;
    G->adjlist[i].firstedge=p;//表邻接表给相应的节点
    //下面代码,无向图中有;如果是有向图就没有
    p=(EdgeNode*)malloc(sizeof(EdgeNode));
    p->adjvex=i;
    p->next=G->adjlist[j].firstedge;
    G->adjlist[j].firstedge=p;
    }
//打印邻接表
printf("邻接表为:\n");
for(i=0;i<G->numVertexs;i++)
    {
    p=G->adjlist[i].firstedge;
    while(p)
        {
        printf("(%c,%c)",G->adjlist[i].data,G->adjlist[p->adjvex].data);
        p=p->next;
        }
    printf("\n");
    }
}


int main()
{
GraphAdjList G;
Create(&G);
}

 

结果:

 

posted @ 2020-03-14 18:20  记得喝牛奶  阅读(119)  评论(0编辑  收藏  举报