c++实验10 图的应用实验
大体与上次实验相同,特点为图是邻接表存储结构
--博客后半部分有程序的所有代码--
1、图邻接表存储结构表示及基本操作算法实现
所加载的库函数或常量定义及类的定义:
- #include "SeqQueue.h"
- const int MaxVertices = ;
- const int MaxWeight=;
(1)邻接表存储结构类定义:
- struct EdgeType
- {
- int dest;
- DistT weight;
- EdgeType *next;
- EdgeType(){};
- EdgeType(int d, DistT w): dest(d), weight(w), next(NULL){}
- };
- struct ItemType
- {
- VerT data;
- EdgeType *adj;
- };
- class AdjTWGraph
- {
- private:
- ItemType Vertices[MaxVertices];
- int numVertices;
- double numOfEdges;
- void DepthFirstSearch(const int v, int visited[]);
- void BroadFirstSearch(const int v, int visited[]);
- public:
- AdjTWGraph(void);
- ~AdjTWGraph(void);
- int NumOfVertices(void)
- {return numVertices;}
- double NumOfEdges(void)
- {return numOfEdges;}
- VerT GetValue(const int i);
- int GetWeight(const int v1, const int v2);
- void Show(); //输出邻接矩阵结果
- void InsertVertex(const VerT &vertex);
- void InsertWayEdge(const int v1, const int v2, int weight);
- void InsertNoWayEdge(const int v1, const int v2, int weight);
- void DeleteVertex(const int v);
- void DeleteEdge(const int v1, const int v2);
- int GetFirstNeighbor(const int v);
- int GetNextNeighbor(const int v1, const int v2);
- void DepthFirstSearch();
- void BroadFirstSearch();
- };
(2)创建邻接表算法
创建无向网邻接表算法:
- void CreatNoWayWeb(AdjTWGraph &G, DataType V[],int n,RowColWeight E[], int e)
- {
- //在图G中插入n个顶点
- for(int i = ; i < n; i++)
- G.InsertVertex(V[i]);
- //在图G中插入e条边
- for(int k = ; k < e; k++)
- {
- if(E[k].row>E[k].col)
- {
- cout<<"无向网参数输入错误";
- exit();
- }
- G.InsertNoWayEdge(E[k].row, E[k].col, E[k].weight);
- G.InsertNoWayEdge(E[k].col, E[k].row, E[k].weight);
- }
- }
创建有向网邻接表算法:
- void CreatWayWeb(AdjTWGraph &G, DataType V[], int n,RowColWeight E[],int e)
- //在图G中插入n个顶点V和e条边E
- {
- //在图G中插入n个顶点
- for(int i = ; i < n; i++)
- G.InsertVertex(V[i]);
- //在图G中插入e条边
- for(int k = ; k < e; k++)
- G.InsertWayEdge(E[k].row, E[k].col, E[k].weight);
- }
(3)输出邻接表结果算法
- void AdjTWGraph::Show()
- {
- for(int i=;i<numVertices;i++)
- {
- for(int j=;j<numVertices;j++)
- {
- int a=GetWeight(i,j);
- if(a==MaxWeight)
- cout<<"∞ ";
- else
- cout<<a<<" ";
- }
- cout<<endl;
- }
- }
测试结果粘贴如下:
2、图的遍历递归算法
(1)(存储结构为邻接表)深度优先遍历算法-递归算法
- void AdjTWGraph::DepthFirstSearch()
- {
- int *visited = new int[NumOfVertices()];
- for(int i = ; i < NumOfVertices(); i++) visited[i] = ;
- for(int i = ; i < NumOfVertices(); i++)
- if(! visited[i])
- DepthFirstSearch(i, visited);
- delete []visited;
- }
- void AdjTWGraph::DepthFirstSearch(const int v, int visited[])
- {
- cout<<GetValue(v)<<" ";
- visited[v] = ;
- int w = GetFirstNeighbor(v);
- while(w != -)
- {
- if(! visited[w])
- DepthFirstSearch(w, visited);
- w = GetNextNeighbor(v, w);
- }
- }
测试结果粘贴如下:
- int main()
- {
- AdjTWGraph g,f;
- char a[] = {'A','B','C','D','E'};
- char b[] = {'A','B','C','D','E','F'};
- RowColWeight r1[] ={{,,},{,,},{,,},{,,},{,,},{,,}};
- RowColWeight r2[] ={{,,},{,,},{,,},{,,},{,,},{,,},{,,}};
- int n1,n2,e1,e2;
- n1=sizeof(a)/sizeof(a[]);
- n2=sizeof(b)/sizeof(b[]);
- e1=sizeof(r1)/sizeof(r1[]);
- e2=sizeof(r2)/sizeof(r2[]);
- CreatWayWeb(g, a, n1, r1, e1); //创建有向网
- CreatNoWayWeb(f, b, n2, r2, e2); //创建无向网
- cout<<"有向网:"<<endl;
- cout << "\n深度优先搜索序列为:";
- g.DepthFirstSearch();
- cout<<"\n\n无向网"<<endl;
- cout << "\n深度优先搜索序列为:";
- f.DepthFirstSearch();
- return ;
- }
有向网/无向网的测试结果:
(2)广度优先遍历算法(递归算法)
- void AdjTWGraph::BroadFirstSearch()
- {
- int *visited = new int[NumOfVertices()];
- for(int i = ; i < NumOfVertices(); i++) visited[i] = ;
- for(int i = ; i < NumOfVertices(); i++)
- if(!visited[i]) BroadFirstSearch(i, visited);
- delete []visited;
- }
- void AdjTWGraph::BroadFirstSearch(const int v, int visited[])
- {
- VerT u, w;
- SeqQueue queue;
- cout<<GetValue(v)<<" ";
- visited[v] = ;
- queue.Append(v);
- while(queue.NotEmpty())
- {
- u = queue.Delete();
- w = GetFirstNeighbor(u);
- while(w != -)
- {
- if(!visited[w])
- {
- cout<<GetValue(w)<<" ";;
- visited[w] = ;
- queue.Append(w);
- }
- w = GetNextNeighbor(u, w);
- }
- }
- }
测试结果粘贴如下:
- int main()
- {
- AdjTWGraph g,f;
- char a[] = {'A','B','C','D','E'};
- char b[] = {'A','B','C','D','E','F'};
- RowColWeight r1[] ={{,,},{,,},{,,},{,,},{,,},{,,}};
- RowColWeight r2[] ={{,,},{,,},{,,},{,,},{,,},{,,},{,,}};
- int n1,n2,e1,e2;
- n1=sizeof(a)/sizeof(a[]);
- n2=sizeof(b)/sizeof(b[]);
- e1=sizeof(r1)/sizeof(r1[]);
- e2=sizeof(r2)/sizeof(r2[]);
- CreatWayWeb(g, a, n1, r1, e1); //创建有向网
- CreatNoWayWeb(f, b, n2, r2, e2); //创建无向网
- cout<<"有向网:"<<endl;
- cout << "\n广度优先搜索序列为:";
- g.BroadFirstSearch();
- cout<<"\n\n无向网"<<endl;
- cout << "\n广度优先搜索序列为:";
- f.BroadFirstSearch();
- return ;
- }
有向网/无向网的测试结果:
最后附上整体代码结构与结果
AdjTWGraph.h
- #include "SeqQueue.h"
- const int MaxVertices = ;
- const int MaxWeight=;
- struct EdgeType
- {
- int dest;
- DistT weight;
- EdgeType *next;
- EdgeType(){};
- EdgeType(int d, DistT w): dest(d), weight(w), next(NULL){}
- };
- struct ItemType
- {
- VerT data;
- EdgeType *adj;
- };
- class AdjTWGraph
- {
- private:
- ItemType Vertices[MaxVertices];
- int numVertices;
- double numOfEdges;
- void DepthFirstSearch(const int v, int visited[]);
- void BroadFirstSearch(const int v, int visited[]);
- public:
- AdjTWGraph(void);
- ~AdjTWGraph(void);
- int NumOfVertices(void)
- {return numVertices;}
- double NumOfEdges(void)
- {return numOfEdges;}
- VerT GetValue(const int i);
- int GetWeight(const int v1, const int v2);
- void Show(); //输出邻接矩阵结果
- void InsertVertex(const VerT &vertex);
- void InsertWayEdge(const int v1, const int v2, int weight);
- void InsertNoWayEdge(const int v1, const int v2, int weight);
- void DeleteVertex(const int v);
- void DeleteEdge(const int v1, const int v2);
- int GetFirstNeighbor(const int v);
- int GetNextNeighbor(const int v1, const int v2);
- void DepthFirstSearch();
- void BroadFirstSearch();
- };
- AdjTWGraph::AdjTWGraph(void)
- {
- for(int i = ; i < MaxVertices; i++) Vertices[i].adj = NULL;
- numVertices = ;
- numOfEdges = ;
- }
- AdjTWGraph::~AdjTWGraph(void)
- {
- for(int i = ; i < numVertices; i++)
- {
- EdgeType *p = Vertices[i].adj, *q;
- while(p != NULL)
- {
- q = p->next;
- delete p;
- p = q;
- }
- }
- }
- VerT AdjTWGraph::GetValue(const int i)
- {
- if(i < || i > numVertices)
- {
- cout << "参数i越界出错!" << endl;
- exit();
- }
- return Vertices[i].data;
- }
- int AdjTWGraph::GetWeight(const int v1, const int v2)
- {
- if(v1 < || v1 > numVertices || v2 < || v2 > numVertices)
- {
- cout << "参数v1或v2越界出错!" << endl;
- exit();
- }
- EdgeType *p = Vertices[v1].adj;
- while(p != NULL && p->dest < v2)
- p = p->next;
- if(p==NULL||v2 != p->dest)
- {
- return MaxWeight;
- }
- return p->weight;
- }
- void AdjTWGraph::InsertVertex(const VerT &vertex)
- {
- Vertices[numVertices].data = vertex;
- numVertices++;
- }
- void AdjTWGraph::InsertWayEdge(const int v1, const int v2, int weight)
- {
- if(v1 < || v1 > numVertices || v2 < || v2 > numVertices)
- {
- cout << "参数v1或v2越界出错!" << endl;
- exit();
- }
- EdgeType *q = new EdgeType(v2, weight);
- if(Vertices[v1].adj == NULL)
- Vertices[v1].adj = q;
- else
- {
- EdgeType *curr = Vertices[v1].adj, *pre = NULL;
- while(curr != NULL && curr->dest < v2)
- {
- pre = curr;
- curr = curr->next;
- }
- if(pre == NULL)
- {
- q->next = Vertices[v1].adj;
- Vertices[v1].adj = q;
- }
- else
- {
- q->next = pre->next;
- pre->next = q;
- }
- }
- numOfEdges++;
- }
- void AdjTWGraph::InsertNoWayEdge(const int v1, const int v2, int weight)
- //插入一条起始顶点为v1、终止顶点为 v2、权值为weight的边
- {
- if(v1 < || v1 > numVertices || v2 < || v2 > numVertices)
- {
- cout << "参数v1或v2越界出错!" << endl;
- exit();
- }
- EdgeType *q = new EdgeType(v2, weight);
- if(Vertices[v1].adj == NULL)
- Vertices[v1].adj = q;
- else
- {
- EdgeType *curr = Vertices[v1].adj, *pre = NULL;
- while(curr != NULL && curr->dest < v2)
- {
- pre = curr;
- curr = curr->next;
- }
- if(pre == NULL)
- {
- q->next = Vertices[v1].adj;
- Vertices[v1].adj = q;
- }
- else
- {
- q->next = pre->next;
- pre->next = q;
- }
- }
- numOfEdges+=0.5; //边的个数加0.5
- }
- void AdjTWGraph::DeleteVertex(const int v)
- {
- EdgeType *pre, *curr;
- for(int i = ; i < numVertices; i++)
- {
- pre = NULL;
- curr = Vertices[i].adj;
- while(curr != NULL && curr->dest < v)
- {
- pre = curr;
- curr = curr->next;
- }
- if(pre == NULL && curr->dest == v)
- {
- Vertices[i].adj = curr->next;
- delete curr;
- numOfEdges--;
- }
- else if(curr != NULL && curr->dest == v)
- {
- pre->next = curr->next;
- delete curr;
- numOfEdges--;
- }
- }
- EdgeType *p = Vertices[v].adj, *q;
- for(int i = v; i < numVertices-; i++)
- Vertices[i] = Vertices[i+];
- numVertices--;
- while(p != NULL)
- {
- q = p->next;
- delete p;
- p = q;
- numOfEdges--;
- }
- }
- void AdjTWGraph::DeleteEdge(const int v1, const int v2)
- {
- if(v1 < || v1 > numVertices || v2 < || v2 > numVertices)
- {
- cout << "参数v1或v2越界出错!" << endl;
- exit();
- }
- EdgeType *curr = Vertices[v1].adj, *pre = NULL;
- while(curr != NULL && curr->dest < v2)
- {
- pre = curr;
- curr = curr->next;
- }
- if(pre == NULL && curr->dest == v2)
- {
- Vertices[v1].adj = curr->next;
- delete curr;
- numOfEdges--;
- }
- else if(pre != NULL && curr->dest == v2)
- {
- pre->next = curr->next;
- delete curr;
- numOfEdges--;
- }
- else
- {
- cout << "边<v1, v2>不存在!" << endl;
- exit();
- }
- }
- int AdjTWGraph::GetFirstNeighbor(const int v)
- {
- if(v < || v > numVertices)
- {
- cout << "参数v1越界出错!" << endl;
- exit();
- }
- EdgeType *p = Vertices[v].adj;
- if(p != NULL) return p->dest;
- else return -;
- }
- int AdjTWGraph::GetNextNeighbor(const int v1, const int v2)
- {
- if(v1 < || v1 > numVertices || v2 < || v2 > numVertices)
- {
- cout << "参数v1或v2越界出错!" << endl;
- exit();
- }
- EdgeType *p = Vertices[v1].adj;
- while(p != NULL)
- {
- if(p->next != NULL && p->dest == v2) return p->next->dest;
- else p = p->next;
- }
- return -;
- }
- void AdjTWGraph::DepthFirstSearch()
- {
- int *visited = new int[NumOfVertices()];
- for(int i = ; i < NumOfVertices(); i++) visited[i] = ;
- for(int i = ; i < NumOfVertices(); i++)
- if(! visited[i])
- DepthFirstSearch(i, visited);
- delete []visited;
- }
- void AdjTWGraph::DepthFirstSearch(const int v, int visited[])
- {
- cout<<GetValue(v)<<" ";
- visited[v] = ;
- int w = GetFirstNeighbor(v);
- while(w != -)
- {
- if(! visited[w])
- DepthFirstSearch(w, visited);
- w = GetNextNeighbor(v, w);
- }
- }
- void AdjTWGraph::BroadFirstSearch()
- {
- int *visited = new int[NumOfVertices()];
- for(int i = ; i < NumOfVertices(); i++) visited[i] = ;
- for(int i = ; i < NumOfVertices(); i++)
- if(!visited[i]) BroadFirstSearch(i, visited);
- delete []visited;
- }
- void AdjTWGraph::BroadFirstSearch(const int v, int visited[])
- {
- VerT u, w;
- SeqQueue queue;
- cout<<GetValue(v)<<" ";
- visited[v] = ;
- queue.Append(v);
- while(queue.NotEmpty())
- {
- u = queue.Delete();
- w = GetFirstNeighbor(u);
- while(w != -)
- {
- if(!visited[w])
- {
- cout<<GetValue(w)<<" ";;
- visited[w] = ;
- queue.Append(w);
- }
- w = GetNextNeighbor(u, w);
- }
- }
- }
- void AdjTWGraph::Show()
- {
- for(int i=;i<numVertices;i++)
- {
- for(int j=;j<numVertices;j++)
- {
- int a=GetWeight(i,j);
- if(a==MaxWeight)
- cout<<"∞ ";
- else
- cout<<a<<" ";
- }
- cout<<endl;
- }
- }
CreatAdjTWGraph.h
- struct RowColWeight
- {
- int row; //行下标
- int col; //列下标
- int weight; //权值
- };
- void CreatWayWeb(AdjTWGraph &G, DataType V[], int n,RowColWeight E[],int e)
- //在图G中插入n个顶点V和e条边E
- {
- //在图G中插入n个顶点
- for(int i = ; i < n; i++)
- G.InsertVertex(V[i]);
- //在图G中插入e条边
- for(int k = ; k < e; k++)
- G.InsertWayEdge(E[k].row, E[k].col, E[k].weight);
- }
- void CreatNoWayWeb(AdjTWGraph &G, DataType V[],int n,RowColWeight E[], int e)
- {
- //在图G中插入n个顶点
- for(int i = ; i < n; i++)
- G.InsertVertex(V[i]);
- //在图G中插入e条边
- for(int k = ; k < e; k++)
- {
- if(E[k].row>E[k].col)
- {
- cout<<"无向网参数输入错误";
- exit();
- }
- G.InsertNoWayEdge(E[k].row, E[k].col, E[k].weight);
- G.InsertNoWayEdge(E[k].col, E[k].row, E[k].weight);
- }
- }
SeqQueue.h
- #include<iostream>
- using namespace std;
- class SeqQueue
- {
- private:
- DataType data[MaxQueueSize]; //顺序队列数组
- int front; //队头指示器
- int rear; //队尾指示器
- int count; //元素个数计数器
- public:
- SeqQueue(void) //构造函数
- {front = rear = ; count = ;};
- ~SeqQueue(void){}; //析构函数
- void Append(const DataType& item); //入队列
- DataType Delete(void); //出队列
- DataType GetFront(void)const; //取队头数据元素
- int NotEmpty(void)const //非空否
- {return count != ;};
- };
- void SeqQueue::Append(const DataType& item) //入队列
- //把数据元素item插入队列作为当前的新队尾
- {
- if(count > && front == rear)
- {
- cout << "队列已满!" << endl;
- exit();
- }
- data[rear] = item; //把元素item加在队尾
- rear = (rear + ) % MaxQueueSize; ///队尾指示器加1
- count++; //计数器加1
- }
- DataType SeqQueue::Delete(void) //出队列
- //把队头元素出队列,出队列元素由函数返回
- {
- if(count == )
- {
- cout << "队列已空!" << endl;
- exit();
- }
- DataType temp = data[front]; //保存原队头元素
- front = (front + ) % MaxQueueSize; //队头指示器加1
- count--; //计数器减1
- return temp; //返回原队头元素
- }
- DataType SeqQueue::GetFront(void)const //取队头数据元素
- //取队头元素并由函数返回
- {
- if(count == )
- {
- cout << "队列空!" << endl;
- exit();
- }
- return data[front]; //返回队头元素
- }
GraphTest.cpp
- #include <iostream>
- #include <stdlib.h>
- const int MaxQueueSize = ;
- typedef char VerT;
- typedef int DistT;
- typedef char DataType;
- #include "AdjTWGraph.h"
- #include "CreatAdjTWGraph.h"
- int main()
- {
- AdjTWGraph g,f;
- char a[] = {'A','B','C','D','E'};
- char b[] = {'A','B','C','D','E','F'};
- RowColWeight r1[] ={{,,},{,,},{,,},{,,},{,,},{,,}};
- RowColWeight r2[] ={{,,},{,,},{,,},{,,},{,,},{,,},{,,}};
- int n1,n2,e1,e2;
- n1=sizeof(a)/sizeof(a[]);
- n2=sizeof(b)/sizeof(b[]);
- e1=sizeof(r1)/sizeof(r1[]);
- e2=sizeof(r2)/sizeof(r2[]);
- CreatWayWeb(g, a, n1, r1, e1); //创建有向网
- CreatNoWayWeb(f, b, n2, r2, e2); //创建无向网
- cout<<"有向网:"<<endl;
- g.Show();
- cout << "\n顶点个数为:" << g.NumOfVertices();
- cout << "\n边的条数为:" << g.NumOfEdges();
- cout << "\n广度优先搜索序列为:";
- g.BroadFirstSearch();
- cout << "\n深度优先搜索序列为:";
- g.DepthFirstSearch();
- cout<<"\n\n无向网"<<endl;
- f.Show();
- cout << "\n顶点个数为:" << f.NumOfVertices();
- cout << "\n边的条数为:" << f.NumOfEdges();
- cout << "\n深度优先搜索序列为:";
- f.DepthFirstSearch();
- cout << "\n广度优先搜索序列为:";
- f.BroadFirstSearch();
- return ;
- }
最终结果
c++实验10 图的应用实验的更多相关文章
- 实验10.3_数值显示拓展_dword型数转变为表示十进制数的字符串
assume cs:code data segment db 10 dup (0) data ends code segment start : mov ax,4240H;F4240H=1000000 ...
- 20162327WJH实验四——图的实现与应用
20162327WJH实验四--图的实现与应用 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 王旌含 学号:20162327 成绩: 指导教师:娄嘉鹏 王志强 实验日期:11月2 ...
- c++实验9 图及图的操作实验
实验9 图及图的操作实验 --博客后半部分有程序的所有代码-- 1.图邻接矩阵存储结构表示及基本操作算法实现 (1)邻接矩阵存储结构类定义: #include "SeqList.h" ...
- 20145206《Java程序设计》实验二Java面向对象程序设计实验报告
20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...
- 20145219 《Java程序设计》实验二 Java面向对象程序设计实验报告
20145219 <Java程序设计>实验二 Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S. ...
- 20145239杜文超 《Java程序设计》实验二 Java面向对象程序设计实验报告
20145239 <Java程序设计>实验二 Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S. ...
- 实验二 PHP基本语法实验
实验二 PHP基本语法实验 0 实验准备 0.1实验环境和相关工具软件 具体到的机房环境,请在Windowsxp环境下做本实验: l 操作系统:Windowsxp l Web服务器:Apache ...
- 20145308刘昊阳 《Java程序设计》实验四 Android环境搭建 实验报告
20145308刘昊阳 <Java程序设计>实验四 Android环境搭建 实验报告 实验名称 Android环境搭建 实验内容 搭建Android环境 运行Android 修改代码,能输 ...
- 20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告
20145308刘昊阳 <Java程序设计>实验二 Java面向对象程序设计 实验报告 实验名称 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面相对象三要素:封 ...
随机推荐
- js方法的封装
封装是为了更好的调用,当我们很多页面都需要同一种方法的时候,为了避免每个页面都需要进行重写方法,增加工作量,这个时候就需要我们对部分公共的方法进行封装,这样便于更好的进行调用 我在写接口的时候用到了 ...
- Apache ab测试工具使用方法(无参、get传参、post传参)(转)
转自Apache ab测试工具使用方法(无参.get传参.post传参) Ab测试工具是apache自带的测试工具,具有简单易上手的特性,下面我总结一下我的使用方法,首先去官方下载apache程序包, ...
- ceph对接openstack
一.使用rbd方式提供存储如下数据: (1)image(glance):保存glanc中的image: (2)volume(cinder)存储:保存cinder的volume:保存创建虚拟机时选择创建 ...
- 利用python自动发邮件
工作中有时长时间运行代码时需要监控进度,或者需要定期发送固定格式邮件时,可以使用下面定义的邮件函数. 该函数调用了outlook和qqmail的接口,只需要放置到python的环境目录中即可 impo ...
- java面试01-网络知识
1.网络七层协议 第一层:物理层 机械.电子.定时接口通信信道上的原始比特流传输 第二层:数据链路层 物理寻址,同时将原始比特流转变为逻辑传输线路 第三层:网络层 控制子网的运行‘如逻辑编址.分组传输 ...
- hdu 3549 网络流最大流 Ford-Fulkerson
Ford-Fulkerson方法依赖于三种重要思想,这三个思想就是:残留网络,增广路径和割. Ford-Fulkerson方法是一种迭代的方法.开始时,对所有的u,v∈V有f(u,v)=0,即初始状态 ...
- webpack多页应用
本文主要讲了webpack怎么搭建多页应用,熟悉下webpack的基本用法. 新建文件夹,目录结构如下: 然后 cd webpack-test npm init(根目录下创建了一个pakage.jso ...
- 基于vue模块化开发后台系统——准备工作
文章目录如下:项目效果预览地址项目开源代码基于vue模块化开发后台系统--准备工作基于vue模块化开发后台系统--构建项目基于vue模块化开发后台系统--权限控制 前言 本文章是以学习为主,练习一下v ...
- urllib详细版
urllib是python内置的处理HTTP请求的库,主要包含以下四个模块 request 模块,是最基本的处理HTTP请求的模块. error 异常处理模块,如果出现请求错误,可以捕获这些错误,保证 ...
- wordpress在线预览pdf插件
插件名称:PDF.js Viewer Shortcode 插件主页:http://tphsfalconer.com/ 优点:功能强大,有分页缩略图功能,翻页,放大缩小,打印,下载,读取等功能. 使用方 ...