图的邻接链表存储

//输入样例
/*
 5 0
 AB AD AC CD BE DE
 */
//输出
/*
 Please Input the edge x-->y:AB AD AC CD BE DE
 A  1  2  3
 B  0  4
 C  0  3
 D  0  2  4
 E  1  3
 */
#include<iostream>
#include<cstdio>
using namespace std;
#define MAXVER 10
typedef char Elemtype;
//接下来要连的结点
typedef struct node{
    int num;
    struct node *next;
}slink;
//首结点数组
typedef struct{
    struct{
        Elemtype vertex;
        slink *first;
    }ve[MAXVER];
    int vex,edge,tag;
}adjlist;
//使用简单结构建立图的邻接表
void cregraph(adjlist *G,int n,int m)
{
    G->vex=n;
    G->tag=m;
    int e=0;
    slink *s,*p,*q;
    for(int i=0;i<n;i++){
        G->ve[i].vertex='A'+i;
        G->ve[i].first=NULL;
    }
    Elemtype x,y;
    printf("Please Input the edge x-->y:");
    scanf("%c%c",&x,&y);
    while(x!=' '&&y!=' ')
    {
        e++;
        s=(slink *)malloc(sizeof(slink));
        s->num=y-'A';
        if(G->ve[x-'A'].first==NULL){
            G->ve[x-'A'].first=s;
            s->next=NULL;
        }
        else{
            p=G->ve[x-'A'].first;
            if(p->num>s->num){
                s->next=p;
                G->ve[x-'A'].first=s;
            }
            else{
                q=p->next;
                while(q!=NULL&&q->num<s->num)
                {
                    p=q;
                    q=q->next;
                }
                p->next=s;
                s->next=q;
            }
        }
        if(!G->tag)
        {
            s=(slink *)malloc(sizeof(slink));
            s->num=x-'A';
            if(G->ve[y-'A'].first==NULL) {G->ve[y-'A'].first=s;s->next=NULL;}
            else{
                p=G->ve[y-'A'].first;
                if(p->num>s->num)
                {s->next=p;G->ve[y-'A'].first=s;}
                else{
                    q=p->next;
                    while(q!=NULL&&q->num<s->num) {p=q;q=q->next;}
                    p->next=s;
                    s->next=q;
                }
            }
        }
        getchar();
        scanf("%c%c",&x,&y);
    }
    G->edge=e;
}
//输出用邻接表表示的图的算法
void list(adjlist *G)
{
    slink *p;
    for(int i=0;i<G->vex;i++)
    {
        p=G->ve[i].first;
        printf("%c",G->ve[i].vertex);
        while(p)
        {
            printf("%3d",p->num);
            p=p->next;
        }
        printf("\n");
    }
}
int main()
{
    adjlist *G;
    G=(adjlist *)malloc(sizeof(adjlist));
    int n,m;
    scanf("%d%d",&n,&m);
    getchar();
    cregraph(G,n,m);
    list(G);
    return 0;
}

时间: 2024-10-31 22:41:49

图的邻接链表存储的相关文章

数据结构之---C语言实现图的邻接表存储表示

// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME 3 // 顶点字符串的最大长度+1 #define MAX_VERTEX_NUM 20 typedef int InfoType; // 存放网的权值 typedef char VertexType[MAX_NAME]; // 字符串类型 typedef enum{DG, DN, AG

图的邻接表存储方式的建立

图的邻接表存储方式,主要由表节点与头结点组成. 头结点中主要包含两个域: 1)存放顶点信息 2)存放与顶点相连的第一个表节点的指针 表节点中主要包含两个域: 1)存放相连的节点的序号 2)指向下一个节点的指针 #define MAXNUM 100; //表节点 typedef struct ArcNode{ int adjvex;//邻接顶点编号 struct ArcNode *next;//下一邻接顶点 }ArcNode; //头结点 typedef struct AdjList{ char

数据结构(10) -- 图的邻接表存储

////////////////////////////////////////////////////////// //图的邻接表存储 ////////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> using namespace std; //图的邻接表表示法 #define MaxVertexNum 100 enum GraphType{DG,

稀疏图(邻接链表),并查集,最短路径(Dijkstra,spfa),最小生成树(kruskal,prim)

#include<iostream> #include<vector> #include<queue> #include<stack> #include<algorithm> #include<stdio.h> #include<stdlib.h> using namespace std; /* //函数集合声明下,方便查看 void Dijkstra(const denseGraph& dg, int s); v

图的邻接表存储

图的邻接表存储 struct Edge { int v; ll w; Edge *next; };Edge e[maxn*10]; void add_edge(int u,int v,ll w) ///插入邻接表的首部而非尾部,避免遍历 { Edge *pre=&e[u]; Edge *p=(Edge*)malloc(sizeof(Edge)); p->v=v;p->w=w; p->next=pre->next; pre->next=p; } //遍历 for(Edg

7-3-有向图的十字链表存储结构-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 有向图的十字链表存储结构 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c.LinkQueue.c        

_DataStructure_C_Impl:图的邻接表存储

#include<stdio.h> #include<stdlib.h> #include<string.h> //图的邻接表类型定义 typedef char VertexType[4]; typedef char InfoPtr; typedef int VRType; #define INFINITY 10000 //定义一个无限大的值 #define MaxSize 50 //最大顶点个数 typedef enum{DG,DN,UG,UN}GraphKind;

数据结构之---C++语言实现图的十字链表存储表示

最近一直忙着考研复习,很久都没有更新博客了,今天写一篇数据结构的存储. //有向图的十字链表存储表示 //杨鑫 #include <iostream> #include <cstdio> #include <stdlib.h> #include <cstring> using namespace std; #define MAX_VERTEX_NUM 20 #define OVERFLOW -2 #define OK 1 typedef int Status

图的十字链表存储(C语言)

时间一晃已经大二下了,学校也开了数据结构的课,想起了自己大一刚会C语言,自学数据结构的时候,那时候很无助啊,不懂就只有拼命看,改bug改很久. 老师一节课讲完了邻接表,十字链表,邻接多重表.然而感觉他好像在自己讲自己的,一点也不认真. 但是依托老师是不行的,只懂理论也不行,或许学生认为邻接矩阵,邻接表不就那种东西吗?很简单啊. 大一的时候我也觉得C语言很简单啊,然后一写不都是错? 不写代码的数据结构不叫数据结构. 不多说,开始吧. 邻接表固然优秀,但也有不足,例如对有向图的处理上,有时候需要再建