• 指针实现邻接表模板


    自己写的一个无向图邻接表,edge代表邻接的节点,head代表邻接表主体节点。
    不是很喜欢用数组建表,主要是因为数组建表虽然实现简单,但是理解略显复杂,这个方面可以参考朝夕的博客。

    struct edge
    {
        edge *next;
        int num;
        int len;
    };
    
    edge eg[100000];
    
    struct head
    {
        edge *next;
        int num;
    };
    
    head h[100000];
    
    void IniList(int n)
    {
        int i;
        
        for (i = 1; i <= n; i++)
        {
            h[i].next = NULL;
            h[i].num = i;
        }
    }
    
    void CreatList(int n, int m)
    {
        int i;
        int x, y, leng;
        
        for (i = 0; i < m; i++)
        {
            cin >> x >> y >> leng;
            
            edge *p1, *p2;
            
            p1 = new edge;
            p1 -> next = NULL;
            p1 -> num = y;
            p1 -> len = leng;
            
            p2 = new edge;
            p2 -> next = NULL;
            p2 -> num = x;
            p2 -> len = leng;
            
            edge *p3, *p4;
            
            p3 = h[x].next;
            
            if (p3 == NULL) {
                h[x].next = p1;
            }
            
            else
            {
                while (p3 -> next != NULL) {
                    p3 = p3 -> next;
                }
                
                p3 -> next = p1;
            }
            
            p4 = h[y].next;
            
            if (p4 == NULL) {
                h[y].next = p2;
            }
            
            else
            {
                while (p4 -> next != NULL) {
                    p4 = p4 -> next;
                }
                
                p4 -> next = p2;
            }
        }
    }
    
    void PrintList(int n)
    {
        int i;
        edge *p;
        
        for (i = 1; i <= n; i++)
        {
            p = h[i].next;
            
            cout << "Node:" << h[i].num << endl;
            
            while (p != NULL) {
                cout << p -> num << " " << p -> len << " ";
                p = p -> next;
            }
            
            cout << endl;
        }
    }
    
    

    上面的CreatList是在函数内部输入,并且是为无向图服务的(分别在h[x]和h[y]都增加了节点),如果是无向图的话也可以在外部调用两次下面的函数:CreatList(x, y, leng); CreatList(y, x, leng);

    void CreatList(int x, int y, int leng)
    {
        edge *p1, *p2;
        
        p1 = new edge;
        p1 -> next = NULL;
        p1 -> num = y;
        p1 -> len = leng;
        
        p2 = h[x].next;
        
        if (p2 == NULL) {
            h[x].next = p1;
        }
        
        else
        {
            while (p2 -> next != NULL) {
                p2 = p2 -> next;
            }
            
            p2 -> next = p1;
        }
    }
    

    2016/12/18

  • 相关阅读:
    JavaScript-4.5 事件大全,事件监听---ShinePans
    SparseArray具体解释,我说SparseArray,你说要!
    Spark Core源代码分析: RDD基础
    我的 Android 开发实战经验总结
    物联网的一种參考架构
    【LeetCode】 Rotate List 循环链表
    放苹果(整数划分变形题 水)poj1664
    ps白平衡
    jfinal对象封装Record原理
    ps通道混合器
  • 原文地址:https://www.cnblogs.com/qq952693358/p/6193806.html
Copyright © 2020-2023  润新知