邻接表

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define maxsize 100
typedef char verteg[4];
typedef enum
{
DN,DG,UN,UG
}graph;
typedef struct arcnode                   //边结点的定义 此处typedef struct arcnode    不要省略arcnode,否则计算机识别不了
{
int adj;                      //指向顶点的位置 
char infopro;               //与弧相关的信息 
struct arcnode *next;         //指示下一节点 
}arcnode;
typedef struct                    //头结点的定义 
{       
verteg data;                    //存储顶点 
arcnode *first;              //第一个与顶点 相连的边结点 
}arclist,arcgraph[maxsize];
typedef struct
{
int arcnum,vexnum;           //边数与顶点数 
arcgraph vex; 
graph kind;                 //图的类型 
}mgraph;
//图的创建
/*原理:图的创建包含两部分(头结点和边结点。头)结点用一维数组操作实现,而一维数组
包含数据域和指向下一边的指针组成。表结点类似链表*/ 


void creatgraph(mgraph *n)
{
int i,j,k;
arcnode *p;
verteg v1,v2;
printf("请输入顶点、边数的值:");
scanf("%d%d",&n->arcnum,&n->vexnum);
for(i=0;i<n->arcnum;i++)                  //头结点的初始化 
{
scanf("%s",&n->vex[i].data);           //顶点赋值 
n->vex[i].first=NULL;                 //连接点置为空值 

printf("请输入弧头和弧尾:\n");
for(k=0;k<n->vexnum;k++)
{
scanf("%s%s",v1,v2);
i=locate(n,v1);
j=locate(n,v2);
    p=(arcnode *)malloc(sizeof(arcnode));
    /*以i为入边,j为出边*/; 
    p->adj=i;                            //寻找到v1的位置并赋值 
p->infopro=NULL;
p->next=n->vex[j].first;             
n->vex[j].first=p;                   //插入 ,与单链表相似
p=(arcnode *)malloc(sizeof(arcnode));
    /*以j为入边,i为出边*/; 
    p->adj=j;                            //寻找到v2的位置并赋值 
p->infopro=NULL;
p->next=n->vex[i].first;             
n->vex[i].first=p;                   //插入 ,与单链表相似
}
n->kind=UG;
} /*这里为无向图,一条边对应两个顶点,故循环中需要对i和j同时寻找位置*/
/*寻找顶点位置函数*/
int locate(mgraph *n,verteg v)
{
int i;
for(i=0;i<n->arcnum;i++)
{
if(strcmp(n->vex[i].data,v)==0)
return i;
}
return -1;
}
/*图的删除类似单链表的删除*/
void destroy(mgraph *n)
{
int i;
arcnode *p,*q;
for(i=0;i<n->arcnum;i++)
{
p=n->vex[i].first;
while(p!=NULL)
{
q=p->next;
free(p);                       
p=q;
}
}
n->arcnum=0;                            //将顶点数置为0 
n->vexnum=0;                            //将边数置为0 
}
/*图的输出*/
void display(mgraph *n)
{
int i;
arcnode *p;
printf("%d个顶点:\n",n->arcnum);
for(i=0;i<n->arcnum;i++)
{
printf("%s  ",n->vex[i].data);
}
printf("\n");
printf("无向图%d条边:\n",2*n->vexnum);       //无向图一出一进共两条边 故乘2 
for(i=0;i<n->vexnum;i++)
{
p=n->vex[i].first;                        //p指向第一个结点 
while(p)                            //输出无向图的所有边 
{
printf("%s->%s ",n->vex[i].data,n->vex[p->adj].data);
p=p->next;
}
printf("\n");
}

int main()
{
mgraph n;
printf("采用无向图n:\n");
creatgraph(&n);
display(&n);
destroy(&n);                           //此处不可省略,否则会因为内存空间问题不能允许 
return 0;



总的实现效果如下,如果讲评有误,请指出!!!!


阅读更多

扫码向博主提问

zhouzhou_98

焦虑就是书读得太少,想得又特别多
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页