图的基本操作与实现的课程设计报告_第1页
图的基本操作与实现的课程设计报告_第2页
图的基本操作与实现的课程设计报告_第3页
图的基本操作与实现的课程设计报告_第4页
图的基本操作与实现的课程设计报告_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据结构课程设计报告设计题目: 图的基本操作与实现专 业 班 级 学 生 学 号 指导教师 起止时间 年 学期目 录1.问题描述:实现图的一些基本操作32.基本要求:3(2)求每个顶点的度,输出结果;33.测试数据:34.算法思想:3(1)自选存储结构创建一个图:3(2)求每个顶点的度:3(3)图的深度优先遍历:4(4)图的广度优先遍历:4(5)判断有向图的强连通性:4(6)用邻接矩阵的信息生成邻接表:46.数据结构:57.功能模块图78.源程序:89.心得体会:281.问题描述:实现图的一些基本操作2.基本要求:(1)自选存储结构,输入含n个顶点(用字符表示顶点)和e条边的图G;(2)求每个

2、顶点的度,输出结果;(3)指定任意顶点x为初始顶点,对图G作DFS遍历,输出DFS顶点序列(提示:使用一个栈实现DFS);(4)指定任意顶点x为初始顶点,对图G作BFS遍历,输出BFS顶点序列(提示:使用一个队列实现BFS);(5)输入顶点x,查找图G:若存在含x的顶点,则删除该结点及与之相关连的边,并作DFS遍历(执行操作3);否则输出信 息“无x”;(6)判断图G是否是连通图,输出信息“YES”/“NO”;(7)如果选用的存储结构是邻接矩阵,则用邻接矩阵的信息生成图G的邻接表,即复制图G,然再执行操作(2);反之亦然。3.测试数据:有向图的顶点数n和有向图的边数e由用户从键盘敲入4.算法思

3、想:(1)自选存储结构创建一个图:通过用户从键盘敲入的两个数值分别确定图的顶点数和边数,选择邻接矩阵存储结构将图的结点信息存储在一个顺序表中,图的边信息存储在一个二维数组中。(2)求每个顶点的度:1.邻接矩阵存储结构下求每个顶点的度:利用图的邻接矩阵,每个顶点所在行和所在列的边的权值如果存在则该顶点的度+1,依次算出每个顶点的度,并且记录在一个数组中输出。2.邻接表存储结构下求每个顶点的度:定义一个邻接边指针循环指向顶点的邻接边单链表头结点,当结点不空时,该顶点的出度+1,邻接边弧头结点的入度+1,依次求出每个顶点的出度和入度之和就为该顶点的度。(3)图的深度优先遍历:采取邻接矩阵结构,指定任

4、意顶点x为初始顶点1.访问结点v并标记结点v已访问;2.查找结点v的第一个邻接结点w;3.若结点v的邻接结点w存在,则继续执行,否则算法结束;4.若结点w尚未被访问,则递归访问结点w;5.查找结点v的w邻接结点的下一个邻接结点w,转到步骤3。(4)图的广度优先遍历:采取邻接矩阵结构,指定任意顶点x为初始顶点,利用顺序循环队列以保持访问过的结点的顺序1.首先访问初始结点v并标记结点v为已访问;2.结点v入队列;3.当队列非空时则继续执行,否则算法结束;4.出队列取得队头结点u;5.查找u的第一个邻接结点w;6.若u的邻接结点w不存在则转到步骤3,否则循环执行下列步骤:6.1若结点w尚未被访问,则

5、访问结点w并标记结点w为已访问;6.2结点w入队列;6.3查找结点u的w邻接结点的下一个邻接结点w,转到步骤6 。(5)判断有向图的强连通性:采取邻接表结构,在图中寻找一个包含所有顶点且首尾相连的环,若这样的环存在,则该图为强连通图,否则不为强连通图。(6)用邻接矩阵的信息生成邻接表:定义一个邻接表的边信息结构体,将邻接矩阵的边信息转换成邻接表的边信息存储到邻接边的单链表中。5.模块划分:mian():主函数模块。在主函数模块中调用以下函数:(1) void CreatGraph(AdjMGraph *G,DataType v,int n,RowColWeight E,int e):创建一个邻

6、接矩阵存储结构的图;(2) void Print(AdjMGraph *G):输出图的邻接矩阵;(3) void MVertices(AdjMGraph *G,DataType a):求出邻接矩阵存储结构下图的每个顶点的度;(4) void CreatLGraph(AdjLGraph *G,DataType v,int n,RowCol d,int e):用邻接矩阵的信息生成邻接表;(5) void LVertices(AdjLGraph *G,DataType a):求出邻接表存储结构下图的每个顶点的度;(6) int LianTong(AdjLGraph *G,DataType a):判断

7、有向图的强连通性;(7) void DepthFirstSearch(AdjMGraph G,void Visit(DataType item):对图作DFS遍历,输出DFS顶点序列;(8) void BroadFirstSearch(AdjMGraph G,void Visit(DataType item):对图作BFS遍历,输出BFS顶点序列;(9) int ChaZhao(AdjMGraph *G,int v):查找顶点v;(10) void MDelete(AdjMGraph *G,int v):删除查找到的结点v并删除该结点及与之相关的边;6.数据结构:(1)有向图顶点的数据类型Da

8、taType 定义如下: typedef int DataType ;(2)邻接矩阵存储结构下图的结构体定义如下:typedef structSeqList Vertices; /存放结点的顺序表int edgeMaxVerticesMaxVertices; /存放边的邻接矩阵int numOfEdges; /边的条数AdjMGraph; /边的结构体定义(3)邻接矩阵存储结构下图的边信息结构体定义如下:typedef structint row; /行下标int col; /列下标int weight; /权值RowColWeight; /边信息结构体定义(4)邻接表存储结构下图的结构体定义

9、如下:typedef struct Node int dest; /邻接边的弧头结点序号struct Node *next; Edge; /邻接边单链表的结点结构体typedef structDataType data; /结点数据元素 int sorce; /邻接边的弧尾结点序号Edge *adj; /邻接边的头指针AdjLHeight; /数组的数据元素类型结构体typedef structAdjLHeight aMaxVertices; /邻接表数组int numOfVerts; /结点个数int numOfEdges; /边个数AdjLGraph; /邻接表结构体(5)邻接表存储结构下

10、图的边信息结构体定义如下:typedef structint row; /行下标int col; /列下标RowCol; /边信息结构体定义(6)顺序循环队列的结构体定义如下:typedef struct DataType queueMaxQueueSize;int rear;int front;int count;SeqCQueue;(7)顺序表的结构体定义如下:typedef structDataType listMaxSize;int size;SeqList;7.功能模块图:main()PrintCreatGraphMVerticesDepthFirstSearchCreatLGrap

11、hMDeleteBroadFirstSearchChaZhaoLianTongLVerticesInsertVertexInsertEdgeLInsertVertexLAdjInitiateDeleteVertenDeleteEdgeLInsertEdgeInitiate8.源程序:源程序存放在八个文件夹中,文件SeqList.h是顺序表的结构体定义和操作函数,文件SeqCQueue.h是顺序循环队列的结构体定义和操作函数,文件AdjMGraph.h是邻接矩阵存储结构下图的结构体定义和操作函数,文件AdjMGraphCreate.h是邻接矩阵存储结构下图的创建函数,文件AdjLGraph.h是

12、邻接表存储结构下图的结构体定义和操作函数,文件AdjLGraphCreate.h是邻接表存储结构下图的创建函数,文件AdjMGraphTraverse.h是邻接矩阵存储结构下图的深度优先遍历和广度优先遍历操作函数,文件图的基本操作与实现.c是主函数。(1)/* 文件SeqList.h */typedef structDataType listMaxSize;int size;SeqList;void ListInitiate(SeqList *L)L-size=0;int ListLength(SeqList L)return L.size;int ListInsert(SeqList *L,

13、int i,DataType x)int j;if(L-size=MaxSize)printf(数组已满无法插入!n);return 0;else if(iL-size)printf(参数不合法!n);return 0;elsefor(j=L-size;ji;i-)L-listj=L-listj-1;L-listi=x;L-size+;return 1;int ListDelete(SeqList *L,int i,DataType *x)int j;if(L-size=0)printf(顺序表已空无数据元素可删!n);return 0;else if(iL-size-1)printf(参数i

14、不合法!n);return 0;else*x=L-listi;for(j=i+1;jsize-1;j+)L-listj-1=L-listj;L-size-;return 1;int ListGet(SeqList L,int i,DataType *x)if(iL.size-1)printf(参数i不合法!n);return 0;else*x=L.listi;return 1;(2)/* 文件SeqCQueue.h */typedef struct DataType queueMaxQueueSize;int rear;int front;int count;SeqCQueue;void Qu

15、eueInitiate(SeqCQueue *Q)Q-rear=0;Q-front =0;Q-count =0;int QueueNotEmpty(SeqCQueue Q)if(Q.count !=0) return 1;else return 0;int QueueAppend(SeqCQueue *Q,DataType x)if(Q-count0&Q-rear=Q-front)printf(队列已满无法插入!);return 0;else Q-queue Q-rear=x;Q-rear =(Q-rear +1)%MaxQueueSize;Q-count +;return 1;int Que

16、ueDelete(SeqCQueue *Q,DataType *d)if(Q-count =0)printf(队列已空无数据出队列!n);return 0;else*d=Q-queueQ-front; Q-front=(Q-front+1)%MaxQueueSize;Q-count -;return 1;int QueueGet(SeqCQueue Q,DataType*d)if(Q.count =0)printf(队列已空无数据出队列!n);return 0;else*d=Q.queue Q.front ;return 1;(3)/* 文件AdjMGraph.h*/#includeSeqLi

17、st.htypedef structSeqList Vertices; /存放结点的顺序表int edgeMaxVerticesMaxVertices; /存放边的邻接矩阵int numOfEdges; /边的条数AdjMGraph; /边的结构体定义void Initiate(AdjMGraph *G,int n) /初始化int i,j;for(i=0;in;i+)for(j=0;jedgeij=0;elseG-edgeij=MaxWeight;G-numOfEdges=0; /边的条数置为0ListInitiate(&G-Vertices); /顺序表初始化void InsertVert

18、ex(AdjMGraph *G,DataType vertex) /在图G中插入结点vertexListInsert(&G-Vertices,G-Vertices.size,vertex); /顺序表尾插入void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)/在图G中插入边,边的权为weightif(v1G-Vertices.size|v2G-Vertices.size)printf(参数v1或v2越界出错!n);exit(1);G-edgev1v2=weight;G-numOfEdges+;void DeleteEdge(AdjMGra

19、ph *G,int v1,int v2) /在图中删除边if(v1G-Vertices.size|v2G-Vertices.size|v1=v2)printf(参数v1或v2越界出错!n);exit(1);if(G-edgev1v2=MaxWeight|v1=v2)printf(该边不存在!n);exit(0);G-edgev1v2=MaxWeight;G-numOfEdges-;void DeleteVerten(AdjMGraph *G,int v) /删除结点vint n=ListLength(G-Vertices),i,j; DataType x;for(i=0;in;i+) /计算删

20、除后的边数for(j=0;jedgeij0&G-edgeijnumOfEdges-; /计算被删除边for(i=v;in;i+) /删除第v行for(j=0;jedgeij=G-edgei+1j;for(i=0;in;i+) /删除第v列for(j=v;jedgeij=G-edgeij+1;ListDelete(&G-Vertices,v,&x); /删除结点vint GetFistVex(AdjMGraph *G,int v) /在图G中寻找序号为v的结点的第一个邻接结点/如果这样的邻接结点存在,返回该邻接结点的序号;否则,返回-1int col;if(vG-Vertices.size)pr

21、intf(参数v1越界出错!n);exit(1);for(col=0;colVertices.size;col+)if(G-edgevcol0&G-edgevcolMaxWeight)return col;return -1;int GetNextVex(AdjMGraph*G,int v1,int v2)/在图中寻找v1结点的邻接结点v2的下一个邻接结点/如果这样的结点存在,返回该邻接结点的序号;否则,返回-1/v1和v2都是相应结点的序号int col;if(v1G-Vertices.size|v2G-Vertices.size)printf(参数v1或v2越界出错!n);exit(1);

22、 for(col=v2+1;colVertices.size;col+)if(G-edgev1col0&G-edgev1colMaxWeight)return col;return -1;/输出图G的邻接矩阵void Print(AdjMGraph *G) int i,j;for(i=0;iVertices.size;i+)for(j=0;jVertices.size;j+)printf(%6d ,G-edgeij);printf(n);/邻接矩阵存储结构下求出每个顶点的度并输出void MVertices(AdjMGraph *G,DataType a) int i,j,m;DataType

23、 bMaxVertices;/用数组b记录相应结点的度for(i=0;iVertices.size;i+)bi=0; /置0printf(邻接矩阵存储结构下图的顶点的度为:n);for(m=0;mVertices.size;m+) /求出每个结点的度for(i=0;iVertices.size;i+)for(j=0;jVertices.size;j+)if(i=m&G-edgeij0&G-edgeijMaxWeight)/求出邻接矩阵第i行权值存在的边的个数,当边存在时,bm加1bm+;if(j=m&i!=m&G-edgeij0&G-edgeijMaxWeight)/求出邻接矩阵第j列权值存在

24、的边的个数,当边存在时,bm加1bm+;printf(顶点%d的度为:%dn,am,bm); /查找图G中是否存在点vint ChaZhao(AdjMGraph *G,int v) if(0=v&vVertices.size)printf(存在顶点%dn,v);return 1;elseprintf(不存在顶点%dn,v);return 0;/删除查找到的结点v并删除该结点及与之相关的边void MDelete(AdjMGraph *G,int v)int i;for(i=0;iVertices.size;i+)if(G-edgevi0&G-edgeviMaxWeight)/当邻接矩阵的第v行

25、有边存在时,删除边DeleteEdge(G,v,i);if(G-edgeiv0&G-edgeivMaxWeight)/当邻接矩阵的第j行有边存在时,删除边DeleteEdge(G,i,v);DeleteVerten(G,v);/删除结点v(4)/* 文件AdjMGraphCreate.h */typedef structint row; /行下标int col; /列下标int weight; /权值RowColWeight; /边信息结构体定义void CreatGraph(AdjMGraph *G,DataType v,int n,RowColWeight E,int e)/在图G中插入n

26、个结点信息v和e条边信息Eint i,k;Initiate(G,n); /结点顺序表初始化for(i=0;in;i+)InsertVertex(G,vi); /结点插入for(k=0;knumOfVerts=0;G-numOfEdges=0;for(i=0;iai.sorce=i;G-ai.adj=NULL;/撤销操作函数void LAdjDestroy(AdjLGraph *G)/撤销图G中的所有邻接边单链表int i;Edge *p,*q;for(i=0;inumOfVerts;i+)p=G-ai.adj;while(p!=NULL)q=p-next;free(p);p=q;/插入结点操作

27、函数void LInsertVertex(AdjLGraph *G,int i,DataType vertex)/在图G中的第i(0=i=0&iai.data=vertex; /存储结点数据元素vertexG-numOfVerts+; /个数加1elseprintf(结点越界);/插入边操作函数void LInsertEdge(AdjLGraph *G,int v1,int v2)/在图G中加入边的信息Edge *p; /定义一个邻接边指针if(v1=G-numOfVerts|v2=G-numOfVerts)printf(参数v1或v2越界出错);exit(0);p=(Edge *)mallo

28、c(sizeof(Edge); /申请邻接边单链表结点空间p-dest=v2; /置邻接边弧头序号p-next=G-av1.adj; /新结点插入单链表的表头G-av1.adj=p; /头指针指向新的单链表表头G-numOfEdges+; /边数个数加1 /删除边操作函数void LDeleteEdge(AdjLGraph *G,int v1,int v2)/删除图G中的边信息Edge *curr,*pre;if(v1=G-numOfVerts|v2=G-numOfVerts)printf(参数v1或v2越界出错!);exit(0);pre=NULL;curr=G-av1.adj;while(

29、curr!=NULL&curr-dest!=v2)/在v1结点的邻接边单链表中查找v2结点pre=curr;curr=curr-next;/删除表示邻接边的结点if(curr!=NULL&curr-dest=v2&pre=NULL) /当邻接边的结点是单链表的第一个结点时G-av1.adj=curr-next;free(curr);G-numOfEdges-;else if(curr!=NULL&curr-dest=v2&pre!=NULL)/当邻接边的结点不是单链表的第一个结点时pre-next=curr-next;free(curr);G-numOfEdges-;else/当邻接边结点不存

30、在时printf(边不存在时);/取第一个邻接结点int LGetFirstVex(AdjLGraph *G,int v)/取图G中结点v的第一个邻接结点/取到时返回该邻接结点的对应序号,否则返回-1Edge *p;if(vG-numOfVerts)printf(参数v1或v2越界出错!);exit(0);p=G-av.adj;if(p!=NULL)return p-dest; /返回该邻接结点的对应序号elsereturn -1; /返回-1/取下一个邻接结点int LGetNextVex(AdjLGraph *G,int v1,int v2)/取图G中结点v1的邻接结点v2的下一个邻接结点

31、/取到时返回该邻接结点的对应序号,否则返回-1Edge *p;if(v1G-numOfVerts|v2G-numOfVerts)printf(参数v1或v2越界出错!);exit(0);p=G-av1.adj;while(p!=NULL) /寻找结点v1的邻接结点v2if(p-dest!=v2)p=p-next;continue;elsebreak;p=p-next; /p指向邻接结点v2的下一个邻接结点if(p!=NULL)return p-dest; /返回该邻接结点的对应序号elsereturn -1; /返回-1/邻接表存储下求每个顶点的度并输出结果void LVertices(Adj

32、LGraph *G,DataType a)printf(邻接表存储结构下的图的顶点的度为:n);int OutDegreeMaxVertices,InDegreeMaxVertices;/定义一个出度和入度的数组int i;for(i=0;inumOfVerts;i+) /首先将出度和入度数组的每个成员都置0OutDegreei=0;InDegreei=0;Edge *p; /定义一个邻接边指针for(i=0;inumOfVerts;i+)p=G-ai.adj; /指针指向ai的邻接边单链表头结点while(p!=NULL)/当p所指向的邻接边结点不空时OutDegreei+; /出度加1In

33、Degreep-dest+; /邻接边弧头结点的入度加1p=p-next; /p指向下一个邻接边结点for(i=0;inumOfVerts;i+) /输出每个结点的度printf(顶点%d的度为:,ai);printf(%d,OutDegreei+InDegreei); /每个结点的度即出度与入度相加的和printf(n);/判断有向图G是否为强连通图int LianTong(AdjLGraph *G,DataType a) int i,bMaxVertices,k=0;for(i=0;inumOfVerts;i+)bi=0;Edge *q,*p; /定义一个邻接边指针for(i=0;inum

34、OfVerts;i+)q=G-ai.adj;while(q!=NULL)bi+;q=q-next;for(i=0;inumOfVerts;i+)if(bi=1)k+;p=G-aG-numOfVerts-1.adj;if(k=G-numOfVerts&p-dest=a0)return 1;elsereturn 0;(6)/* 文件AdjLGraphCreate.h */typedef structint row; /行下标int col; /列下标RowCol; /边信息结构体定义void CreatLGraph(AdjLGraph *G,DataType v,int n,RowCol d,in

35、t e)int i,k;LAdjInitiate(G);for(i=0;in;i+)LInsertVertex(G,i,vi);for(k=0;ke;k+)LInsertEdge(G,dk.row,dk.col);(7)/* 文件AdjMGraphTraverse.h */void Visit(DataType item)printf(%d ,item);void DepthFSearch(AdjMGraph G,int v,int visited,void Visit(DataType item)/连通图G以v为初始结点的访问操作为Visit()的深度优先遍历/数组visited标记了相应结

36、点是否已访问过,0表示未访问,1表示已访问int w;Visit(G.Vertices.listv); /访问结点vvisitedv=1; /置已访问标记w=GetFistVex(&G,v); /取第一个邻接结点while(w!=-1)if(!visitedw)/非0 还未访问DepthFSearch(G,w,visited,Visit);w=GetNextVex(&G,v,w);void DepthFirstSearch(AdjMGraph G,void Visit(DataType item)/非连通图G的访问操作为Visit()的深度优先遍历int i;int *visited=(int

37、 *)malloc(sizeof(int)*G.Vertices.size);for(i=0;iG.Vertices.size;i+)visitedi=0;for(i=0;iG.Vertices.size;i+)if(!visitedi)DepthFSearch(G,i,visited,Visit);free(visited);#includeSeqCQueue.h /包括顺序循环队列void BroadFSearch(AdjMGraph G,int v,int visited,void Visit(DataType item)/连通图G以v为初始结点的访问操作为Visit()的广度优先遍历/

38、数组visited标记了相应结点是否已访问过,0表示未访问,1表示已访问DataType u,w;SeqCQueue queue;Visit(G.Vertices.listv); /访问结点vvisitedv=1; /置已访问标记QueueInitiate(&queue); /队列初始化QueueAppend(&queue,v); /初始结点v入队列while(QueueNotEmpty(queue) /队列非空时QueueDelete(&queue,&u); /出队列w=GetFistVex(&G,u); /取结点u的第一个邻接结点while(w!=-1) /邻接结点w存在时if(!visi

39、tedw) /若没有访问过Visit(G.Vertices.listw); /访问结点wvisitedw=1; /置已访问标记QueueAppend(&queue,w); /结点w入队列w=GetNextVex(&G,u,w); /取下一个邻接结点 void BroadFirstSearch(AdjMGraph G,void Visit(DataType item)/非连通图G访问操作为Visit()的广度优先遍历int i;int *visited=(int *)malloc(sizeof(int)*G.Vertices.size);for(i=0;iG.Vertices.size;i+)v

40、isitedi=0;for(i=0;iG.Vertices.size;i+)if(!visitedi)BroadFSearch(G,i,visited,Visit);free(visited);(8)/* 文件图的基本操作与实现.c */#include#include#includetypedef int DataType;/定义DataType为整形#define MaxSize 100#define MaxVertices 10#define MaxEdges 100#define MaxWeight 10000 /定义无穷大的具体值#define MaxQueueSize 100#in

41、clude AdjMGraph.h#includeAdjMGraphCreate.h#includeAdjMGraphTraverse.h#includeAdjLGraph.h#includeAdjLGraphCreate.hvoid main()AdjMGraph g1; /定义一个邻接矩阵存储结构的图g1RowColWeight rcwMaxEdges;/定义边信息数组int n,e,i,j;printf(请输入有向图的顶点数:);scanf(%d,&n);printf(请输入有向图的边数:);scanf(%d,&e);DataType aMaxVertices;/定义一个数组存储顶点字符

42、为整形printf(该图的%d个顶点字符分别为:,n);/输出每个顶点字符for(i=0;in;i+)ai=i;printf(%2d,ai);printf(n);/存储边的信息for(i=0;ie;i+)printf(请输入一条边依附的顶点字符v1,v2及权值(v1,v2,w):);scanf(%d,%d,%d,&rcwi.row,&rcwi.col,&rcwi.weight);CreatGraph(&g1,a,n,rcw,e);/创建一个邻接矩阵存储结构的图g1printf(该图的邻接矩阵为:n);Print(&g1);/输出图g1的邻接矩阵 /求出邻接矩阵存储结构下图g1的每个顶点的度MVertices(&g1,a);AdjLGraph g2;/定义一个邻接表存储结构的图g2RowCol rwcMaxEdges;/定义边信息数组/用邻接矩阵的信息生成邻接表for(i=0;ie;i+)rwci.col=rcwi.col;rwci.row=rcwi.row;CreatLGraph(&g2,a,g1.Vertices.size,rwc,g1.numOfEdges);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论