zoukankan      html  css  js  c++  java
  • 图(G)的创建

    创建代码:(其中需要注意的是采用的vc++编译器,申请数组时必须为a[常量],因此无法利用算出来行数再去得到顶点坐标数组大小)

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<malloc.h>
    #include<math.h>
    #include<time.h>
    #define MaxVertexNum 90000
    //边表节点
    typedef struct node
    {
    int adjvex;
    struct node *next;
    int visit;
    }EdgeNode;
    //顶点表节点
    typedef struct vnode
    {
    int vertex;
    int KS;//k-core
    float ec;//特征向量中心性
    int k;
    int is_infected;
    int is_visit;
    int layer;//
    int degree;//该节点的度
    EdgeNode* firstedge;//指向边表的指针
    }VertexNode;
    typedef VertexNode AdjList[MaxVertexNum];
    //图的结构
    typedef struct
    {
    AdjList adjlist;//顶点表(类似于数组的)
    int vexnum;//顶点个数
    int arcnum;//边个数
    }ALGraph;
    //返回文件行数(网络边数),有换行符"
    "就为一行
    int lines(char* str)
    {
    int c;
    FILE* fp;
    int lines=0;
    fp=fopen(str,"r");
    if(fp)
        {
        while((c=fgetc(fp))!=EOF)
            if(c=='
    ')
                lines++;
            fclose(fp);
        }
    return lines;
    }
    //返回文件最大数(网络节点数)
    int max(char* str)
    {
    FILE* fp;
    char* p;
    int line=lines(str);
    int i=0;
    int a=0;
    int b=0;
    fp=fopen(str,"r");
    char buf[256];
    if((fp=fopen(str,"r"))==NULL)
        {
        perror("fail to read");
            exit(1);
        }
    //把文件的内容给buf
    
    while(fgets(buf,line,fp)!=NULL)
        {
    
    
    //p就没有    
        p=buf;
        
    //这一步没有成功赋值
    sscanf(p,"%1d %1d",&a,&b);//输入源为p
    
        //i始终为最大的
        if(a>i)
            i=a;
        if(b>i)
            i=b;
        }
    
    return i;
    }
    //创建图
    void createAlgraph(ALGraph*  G,char* str)
    {
    FILE* fp;
    int line=lines(str);
    int node=max(str);//其中最大数
    G->vexnum=node+1;
    G->arcnum=line;
    fp=fopen(str,"r");
    char buf[1024];
    int len;
    int m;
    int n;
    EdgeNode* s;
    char* p;
    int a=0;
    int b=0;
    int i=0;
    //每个节点的顶点表(vn1(i),vn2(i))
    int vn1[5];//这里本来要用vn[line],但不能通过编译,有多少行就有多少(i,j)
    int vn2[5];
    //顶点录入
    for(int j=0;j<G->vexnum;j++)
        {
        G->adjlist[j].vertex=j;
        G->adjlist[j].firstedge=NULL;
        }
    if((fp=fopen(str,"r"))==NULL)
        {
        perror("faile to read");
        exit(1);
        }
    //将顶点信息存入数组
    
    while(fgets(buf,line,fp)!=NULL)//因为行数等于等于节点数,则读取行数个就可以把其他的节点的连接读完
        {
        //这里的读取出错每次只能读取一个数字
    
        len=strlen(buf);
        
        buf[len]='';    
        
        p=buf;
    //下面一句解决了挨个取数字的问题,弄一下午
        sscanf(p,"%1d%1d",&a,&b);
    
    
        vn1[i]=a;
        vn2[i]=b;
    
        i++;
        }
    
    //边节点放入链表
    for(int k=0;k<line;k++)//有多少行就有多少节点,每个节点对应一个边链
        {
        m=vn1[k],n=vn2[k];
        int ii=0;
        EdgeNode* p;
        p=G->adjlist[m].firstedge;
        while(p!=NULL)
            {
            if(p->adjvex==n)
                {
                ii=1;
                break;
                }
            p=p->next;
            }
        if(ii!=1)
            {
            s=(EdgeNode*)malloc(sizeof(EdgeNode));
            s->adjvex=n;//相连接的顶点
            s->next=NULL;
            s->next=G->adjlist[m].firstedge;
            G->adjlist[m].firstedge=s;
            //无向图 有来回
            s=(EdgeNode*)malloc(sizeof(EdgeNode));
            s->adjvex=m;
            s->next=NULL;
            s->next=G->adjlist[n].firstedge;
            G->adjlist[n].firstedge=s;
            }
        }
    //深度为每个节点后面连接的链长度
    EdgeNode* q;
    for( i=0;i<G->vexnum;i++)
        {
        int k=0;
        q=G->adjlist[i].firstedge;
        while(q!=NULL)
            {
            k++;
            q=q->next;
            }
        G->adjlist[i].degree=k;    
        }
        //打印邻接表
        for(i=0;i<G->vexnum;i++)
            {
            s=G->adjlist[i].firstedge;
            while(s)
                {
                printf("(%d,%d)",G->adjlist[i].vertex,G->adjlist[s->adjvex]);    
                s=s->next;
                }
            printf("
    ");
            }
    }
    
    
    
    
    int main()
    {
    char* str="E:\data_set\netsci.txt";
    ALGraph* G;
    G=(ALGraph*)malloc(sizeof(ALGraph));
    createAlgraph(G,str);
        return 0;
    }

    传入的数据:

     结果显示:

  • 相关阅读:
    如何让Android手机顺利连接上PC
    JNI简介
    SQLite代码与工具
    一个JNI的简单示例
    SQLite的WAL机制
    NDK编程中遇到的问题之一 “/androidndk/build/gmsl/__gmsl:512: *** nonnumeric second argument to `wordlist' function”
    与Unix相关的一些规范与组织
    php获得ip,真实IP
    div里的文字左右居中 上下居中
    php防止刷点击数的方法
  • 原文地址:https://www.cnblogs.com/miaobo/p/12504503.html
Copyright © 2011-2022 走看看