图的三种存储方式

之前总结过一次。详见本博客或者是另一篇

不过呢。写起来。还是今天的简单易写(学长教的)。

测试数据my.txt.

邻接矩阵:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXN 100

const int INF = (1<<23);

int G[MAXN][MAXN];

int main(){
    //freopen("d:\\my.txt", "r", stdin);
    int n, m, i, j, u, v, w;

    scanf("%d %d", &n, &m);
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            G[i][j] = INF;

    for(i=0; i<m; i++){
        scanf("%d %d %d", &u, &v, &w);
        G[u][v] = G[v][u] = w;  //无向图
    }

    for(i=1; i<=n; i++){
        printf("与%d相关联的顶点有:\n", i);
        for(j=1; j<=n; j++)if(G[i][j] != INF){
            printf("%d ", j);
        }
        putchar('\n');
    }


    return 0;
}

边表:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXM 100    //最大边数
#define MAXN 10   //最大顶点数
struct node{
    int v, w;
    int next;
}g[MAXM];

int head[MAXN], t;

void Init(){
    t = 0;
    memset(head, -1, sizeof(head));
}

void add(int u, int v, int w){
    g[t].v = v;
    g[t].w = w;
    g[t].next = head[u];
    head[u] = t;
    t++;
}



int main(){
    //freopen("d:\\my.txt", "r", stdin);
    int n, m, i, j, u, v, w;
    scanf("%d %d", &n, &m);
    Init();

for(i=0; i<m; i++){ scanf("%d %d %d", &u, &v, &w); add(u, v, w); add(v, u, w); //因为该图为无向图 }
for(i=1; i<=n; i++){ printf("与%d相关联的顶点有:\n", i); for(j=head[i]; j != -1; j=g[j].next){ printf("%d ", g[j].v); } putchar('\n'); } return 0; }

 

邻接表(动态):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXN 100

struct node{
    int v, w;
    struct node *next;
}*head[MAXN];

void Init(){
    memset(head, 0, sizeof(head));
}

void add(int u, int v, int w){
    struct node *p = (struct node *)malloc(sizeof(struct node));
    p->v = v;
    p->w = w;
    p->next = head[u];
    head[u] = p;
}

int main(){
    //freopen("d:\\my.txt", "r", stdin);
    int n, m, i, u, v, w;
    scanf("%d %d", &n, &m);
    Init();
    for(i=0; i<m; i++){
        scanf("%d %d %d", &u, &v, &w);
        add(u, v, w);
        add(v, u, w);   //双向
    }

    for(i=1; i<=n; i++){
        printf("与%d相关联的顶点有:\n", i);
        struct node *p;
        for(p=head[i]; p != NULL; p = p->next){
            printf("%d ", p->v);
        }
        putchar('\n');
    }

    return 0;
}

 

邻接表(静态):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXN 100
#define MAXM 10000

struct node{
    int v, w;
    struct node *next;
}*head[MAXN];

struct node mem[MAXM];
int t;

void Init(){
    t = 0;
    memset(head, 0, sizeof(head));
}

void add(int u, int v, int w){
    struct node *p = &mem[t++];
    p->v = v;
    p->w = w;
    p->next = head[u];
    head[u] = p;
}

int main(){
    freopen("d:\\my.txt", "r", stdin);
    int n, m, i, u, v, w;
    scanf("%d %d", &n, &m);
    Init();
    for(i=0; i<m; i++){
        scanf("%d %d %d", &u, &v, &w);
        add(u, v, w);
        add(v, u, w);   //双向
    }
    for(i=1; i<=n; i++){
        printf("与%d相关联的顶点有:\n", i);
        struct node *p;
        for(p=head[i]; p != NULL; p = p->next){
            printf("%d ", p->v);
        }
        putchar('\n');
    }
    return 0;
}

 

运行结果:

 

转载于:https://www.cnblogs.com/tanhehe/archive/2013/02/22/2921864.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值