实用数据结构基础第6章_多维数组和广义表ppt课件_第1页
实用数据结构基础第6章_多维数组和广义表ppt课件_第2页
实用数据结构基础第6章_多维数组和广义表ppt课件_第3页
实用数据结构基础第6章_多维数组和广义表ppt课件_第4页
实用数据结构基础第6章_多维数组和广义表ppt课件_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

1、2019年5月11日星期三1第 6 章 树 知 识 点 多维数组的逻辑结构和存储结构 特殊矩阵的压缩存储 稀疏矩阵的三元组存储、十字链表存储 广义表的逻辑结构、存储结构及其基本算法 难 点 多维数组和广义表可以看作是线性表的推广,其特点是线性表中的数据元素仍然是一个表。第 6 章 目 录 6-1 6-1 多维数组多维数组 6-2 6-2 特殊矩阵的压缩存储特殊矩阵的压缩存储 6-3 6-3 稀疏矩阵稀疏矩阵 6-4 6-4 广义表广义表 小小 结结 验证性实验:稀疏矩阵和广义表子系统验证性实验:稀疏矩阵和广义表子系统 自主性实验自主性实验6 6:稀疏矩阵十字链表的存储:稀疏矩阵十字链表的存储

2、单元练习单元练习6 6 6-1 多维数组6.1.1 逻辑结构逻辑结构 数组作为一种数据结构,其特点是数组作为一种数据结构,其特点是结构中的元素可以是具有某种结构的数结构中的元素可以是具有某种结构的数据,但属于同一数据类型。比如,一维据,但属于同一数据类型。比如,一维数组可以看作一个线性表,二维数组可数组可以看作一个线性表,二维数组可以看作以看作“数据元素是一维数组的一维数数据元素是一维数组的一维数组,三维数组可以看作组,三维数组可以看作“数据元素是二维数据元素是二维数组的一维数组。一般把三维以上的数组的一维数组。一般把三维以上的数组称为多维数组,数组称为多维数组,n维的多维数组可维的多维数组可

3、以视为以视为n1维数组元素组成的线性结构。维数组元素组成的线性结构。其中每一个一维数组又由其中每一个一维数组又由m个单元组成。个单元组成。 图图6-1是一个是一个n行行m列的数组。列的数组。 在二维数组中的每一个元素最多可以有两个直接前驱和两个直接后继边在二维数组中的每一个元素最多可以有两个直接前驱和两个直接后继边界除外),在界除外),在n维数组中的每一个元素最多可以有维数组中的每一个元素最多可以有n个直接前驱和个直接前驱和n个直接后继。个直接后继。所以多维数组是一种非线性结构。所以多维数组是一种非线性结构。 数组是一个具有固定格式和数量的数据有序集,每一个数据元素有唯一的数组是一个具有固定格

4、式和数量的数据有序集,每一个数据元素有唯一的一组下标来标识,通常在很多高级语言中数组一旦被定义,每一维的大小及上一组下标来标识,通常在很多高级语言中数组一旦被定义,每一维的大小及上下界都不能改变。因此,在数组上一般不做插入或删除数据元素的操作。在数下界都不能改变。因此,在数组上一般不做插入或删除数据元素的操作。在数组中经常做的两种操作如下。组中经常做的两种操作如下。(1取值操作:给定一组下标,读取其对应的数据元素。取值操作:给定一组下标,读取其对应的数据元素。 (2赋值操作:给赋值操作:给定一组下标,存储或修改与其相对应的数据元素。定一组下标,存储或修改与其相对应的数据元素。 6.1.2 存储

5、结构存储结构 通常,数组在内存被映象为向量,即用向通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为在计量作为数组的一种存储结构,这是因为在计算机内存储结构是一维的。数组的行列固定算机内存储结构是一维的。数组的行列固定后,通过一个映象函数,就可以根据数组元后,通过一个映象函数,就可以根据数组元素的下标得到它的存储地址。对于一维数组素的下标得到它的存储地址。对于一维数组只要按下标顺序分配即可;对多维数组分配只要按下标顺序分配即可;对多维数组分配时,要把它的元素映象存储在一维存储器中。时,要把它的元素映象存储在一维存储器中。1存储方式存储方式(1以行为主以行为主row majo

6、r order) 以行为主的存储方式也称为按行优先顺序以行为主的存储方式也称为按行优先顺序方式,实现时按行号从小到大的顺序,先存方式,实现时按行号从小到大的顺序,先存储第储第0行的全部元素,再存放第行的全部元素,再存放第1行的元素、行的元素、第第2行的元素行的元素 一个一个23二维数组的逻辑结构如图二维数组的逻辑结构如图6-2所示,所示,以行为主的内存映象如图以行为主的内存映象如图6-3a所示,其所示,其分配顺序为:分配顺序为:a00,a01,a02,a10 ,a11,a12。 以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循以行为主序的分配规律是:最右边的下标先变化,即最右

7、下标从小到大,循环一遍后,右边第二个下标再变环一遍后,右边第二个下标再变,从右向左,最后是左下标。,从右向左,最后是左下标。(2以列为主序以列为主序column major order) 以列为主的存储方式也称为按列优先顺序方式,实现时按列号从小到大的顺以列为主的存储方式也称为按列优先顺序方式,实现时按列号从小到大的顺序,先存储第序,先存储第0列的全部元素,再存储第列的全部元素,再存储第1列的元素、第列的元素、第2 列的元素列的元素 图图6-2所示的逻辑结构,以列为主的内存映象如图所示的逻辑结构,以列为主的内存映象如图6-3b所示,其分配顺序所示,其分配顺序为:为:a00,a10,a01,a1

8、1,a02,a12 。 以列为主分配的规律恰好与以行为主次序相反:最左边的下标先变化,即最以列为主分配的规律恰好与以行为主次序相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变左下标从小到大,循环一遍后,左边第二个下标再变,从左向右,最后是右,从左向右,最后是右下标。下标。2存储地址存储地址“以行为主次序分配存储单元为例看其地址的计算以行为主次序分配存储单元为例看其地址的计算(1二维数组中二维数组中aij的地址的地址 在在C语言中数组中每一维的下界定义为语言中数组中每一维的下界定义为0,数组的基址为,数组的基址为LOC(a00),每个数组,每个数组元素占据元素占据d个

9、字节,那么个字节,那么aij 的物理地址可用一个线性寻址函数计算:的物理地址可用一个线性寻址函数计算: LOC(aij) = LOC(a00) + ( in + j ) d (0下标起始的语言)下标起始的语言)(2三维数组中三维数组中aijk的地址的地址 同理对于三维数组元素同理对于三维数组元素aijk的物理地址为:的物理地址为: LOC(aijk)=LOC(a000)+( (inp+ jp +k) d (0下标起始的语言)下标起始的语言) 【例【例6-1】设二维数组】设二维数组A56,每个元素占,每个元素占4个字节个字节Byte),存),存储器按字节编址。已知储器按字节编址。已知A的起始地址

10、为的起始地址为2000。计算。计算(1数组的大小数组的大小 nmd=564=120 Byte(2数组结点数组结点a45的存储地址的存储地址 LOC(aij)=LOC(a00)+(i*n+j)*d / n为总列数为总列数 LOC(a45)=2000+(46+5)4=2116(3按行为主存储,计算按行为主存储,计算a32的存储地址的存储地址 LOC(aij)=LOC(a00)+(i*n+j)*d / n为总列数为总列数 LOC(a32)=2000+(36+2)4=2080(4按列为主存储,计算按列为主存储,计算a32的存储地址的存储地址 LOC(aij)=LOC(a00)+(j*m+i)*d /

11、m为总行数为总行数 LOC(a32)=2000+(25+3)4=2052 【例【例6-2】若矩阵】若矩阵Anm 中存在某个元素中存在某个元素aij,满足:,满足:aij是第是第i行中最行中最小值且是第小值且是第j列中的最大值,则称该元素为矩阵列中的最大值,则称该元素为矩阵A的一个鞍点。试编的一个鞍点。试编写一个算法,找出写一个算法,找出A中的所有鞍点。中的所有鞍点。基本思想:在矩阵基本思想:在矩阵A中求出每一行的最小值元素,然后判断该元素是中求出每一行的最小值元素,然后判断该元素是否是它所在列中的最大值。如果是则打印输出,接着处理下一行。否是它所在列中的最大值。如果是则打印输出,接着处理下一行

12、。设矩阵设矩阵A用一个二维数组表示,其算法如下:用一个二维数组表示,其算法如下:void saddle(int A,int n,int m) int i,j,min; for(i=0;in;i+) / 按行处理按行处理 min=Ai0 for(j=1;jm;j+) if(Aijmin) min=Aij; / 找第找第i行最小值行最小值 for (j=0;jm;j+)/ 检测最小值是否是鞍点检测最小值是否是鞍点 if(Aij=min) k=j; p=0; while(pn & Apj=n) printf(%d,%d,%dn,i,k,min); 算法的时间复杂度为算法的时间复杂度为O(n

13、(m +n m)。6-2 特殊矩阵的压缩存储特殊矩阵的压缩存储 矩阵是一个二维数组,是众多科学与工程矩阵是一个二维数组,是众多科学与工程计算问题中研究的数学对象。在矩阵中非零元素计算问题中研究的数学对象。在矩阵中非零元素或零元素的分布有一定规律的矩阵称为特殊矩阵或零元素的分布有一定规律的矩阵称为特殊矩阵,如三角矩阵、对称矩阵、带状矩阵、稀疏矩阵,如三角矩阵、对称矩阵、带状矩阵、稀疏矩阵等。当矩阵的阶数很大时,用普通的二维数组存等。当矩阵的阶数很大时,用普通的二维数组存储这些特殊矩阵将会占用很多的存储单元。从节储这些特殊矩阵将会占用很多的存储单元。从节约存储空间的角度考虑,下面来考虑这些特殊矩约

14、存储空间的角度考虑,下面来考虑这些特殊矩阵的存储方法。阵的存储方法。 6.2.1 对称矩阵 对称矩阵是一种特殊矩阵,n阶方阵的元素满足性质:aij=aji (0=i , j=n1)。 如图6-4所示是一个阶对称矩阵。对称矩阵是关于主对角线的对称,因此只需存储上三角或下三角部分的数据即可。比如,只存储下三角中的元素aij,其特点是中j=i且0=i=n1,对于上三角中的元素aij ,它和对应的aji相等,因此当访问的元素在上三角时,直接去访问和它对应的下三角元素即可,这样,原来需要nn个存储单元,现在只需要n(n+1)/2个存储单元了,节约了n(n1)/2个存储单元。图图6-4 56-4 5阶对称

15、方阵及它的压缩存储阶对称方阵及它的压缩存储 如何只存储下三角部分呢?将下三角部分以行序为主序顺序存储到一个向如何只存储下三角部分呢?将下三角部分以行序为主序顺序存储到一个向量量SASA中去。在下三角中共有中去。在下三角中共有n(n+1)/2n(n+1)/2个元素,存储到一个向量空间个元素,存储到一个向量空间SA0SA0至至SAn(n+1)/2-1SAn(n+1)/2-1中,存储顺序可用图中,存储顺序可用图6-56-5示意。示意。图图6-5 对称矩阵下三角压缩存储对称矩阵下三角压缩存储 原矩阵下三角中的某一个元素原矩阵下三角中的某一个元素aij具体对应一个具体对应一个sak,用,用“以行优先存放

16、下以行优先存放下三角部分的元素时,三角部分的元素时,a00存入存入sa0,a10存入存入sa1,a11存入存入sa2。sak与与aij的的一一对应关系为:一一对应关系为: k=j(j +1)/2+i (0=k n (n+1)/21)当当ij时,在下三角部分时,在下三角部分aij前有前有i行,共有行,共有1+2+3+i个元素,而个元素,而aij是第是第i行的第行的第j个元素,即有个元素,即有k=1+2+3+i+j =i(i+1)/2+j。 当当ij时,时,aij是上三角中的元素,因为是上三角中的元素,因为aij=aji ,这样,访问上三角中的元素,这样,访问上三角中的元素aij时则去访问和它对应

17、的下三角中的时则去访问和它对应的下三角中的aji即可,因此将上式中的行列下标交换就即可,因此将上式中的行列下标交换就是上三角中的元素在是上三角中的元素在SA中的对应关系:中的对应关系: k=j(j +1)/2+i (0=krow=m; H-row=m; H-col=n; H-col=n; hd0=H; hd0=H; for(i=1; iS; i+) for(i=1; irow=0; p-col=0; p-row=0; p-col=0; p-right=p; p-down=p; p-right=p; p-down=p; hdi=p; hdi-1-v_next.next=p; hdi=p; hdi

18、-1-v_next.next=p; hdS-v_next.next=H; / 将头结点们形成循环链表将头结点们形成循环链表 for(k=1;krow=i; p-col=j; p-v_next.v=v q=hdi; while(q-right!=hdi&(q-right-col)right; p-right=q-right; / 插入插入 q-right=p; q=hdi; while(q-down!=hdj&(q-down-row)down; p-down=q-down; / 插入插入 q-down=p; return H; 上述算法中,建立头结点循环链表时间复杂度为上述算法中

19、,建立头结点循环链表时间复杂度为O(S),插入每个结点,插入每个结点到相应的行表和列表的时间复杂度是到相应的行表和列表的时间复杂度是O(tS),这是因为每个结点插入时都,这是因为每个结点插入时都要在链表中寻找插入位置,所以总的时间复杂度为要在链表中寻找插入位置,所以总的时间复杂度为O(tS)。该算法对三元。该算法对三元组的输入顺序没有要求。如果我们输入三元组时是按以行为主序或列组的输入顺序没有要求。如果我们输入三元组时是按以行为主序或列输入的,则每次将新结点插入到链表的尾部的,改进算法后,时间复杂度输入的,则每次将新结点插入到链表的尾部的,改进算法后,时间复杂度为为O(S+t)。2 2稀疏矩阵

20、的加法稀疏矩阵的加法 已知两个十字链表存储的稀疏矩阵已知两个十字链表存储的稀疏矩阵A A和和B B,计算,计算C=A+BC=A+B,C C也采用十字链表方也采用十字链表方式存储,并且在式存储,并且在A A的基础上形成的基础上形成C C。 由矩阵的加法规则知,只有由矩阵的加法规则知,只有A A和和B B行列对应相等,二者才能相加。行列对应相等,二者才能相加。C C中的非零中的非零元素元素cijcij只可能有只可能有3 3种情况:或者是种情况:或者是aij+bijaij+bij,或者是,或者是aijaijbij=0bij=0),或者是),或者是bijbijaij=0aij=0),因此当),因此当B

21、 B加到加到A A上时,对上时,对A A十字链表的当前结点来说,对应下列四种十字链表的当前结点来说,对应下列四种情况:或者改变结点的值情况:或者改变结点的值aij+bij0aij+bij0),或者不变),或者不变bijbij0 0),或者插入一),或者插入一个新结点个新结点aijaij0 0),还可能是删除一个结点),还可能是删除一个结点aij+bijaij+bij0 0)。整个运算从矩)。整个运算从矩阵的第一行起逐行进行。对每一行都从行表的头结点出发,分别找到阵的第一行起逐行进行。对每一行都从行表的头结点出发,分别找到A A和和B B在该在该行中的第一个非零元素结点后开始比较,然后按行中的第

22、一个非零元素结点后开始比较,然后按4 4种不同情况分别处理。设种不同情况分别处理。设papa和和pbpb分别指向分别指向A A和和B B的十字链表中行号相同的两个结点,的十字链表中行号相同的两个结点,4 4种情况如下:种情况如下:(1若若pa-col=pb-col且且pa-v+pb-v0,则只要用,则只要用aij+bij的值改写的值改写pa所指结点的值域即可。所指结点的值域即可。(2若若pa-col=pb-col且且pa-v+pb-v=0,则需要在矩阵,则需要在矩阵A的十字链表中删除的十字链表中删除pa所指结点,此时需改变该行链表中前趋结所指结点,此时需改变该行链表中前趋结点的点的right域

23、,以及该列链表中前趋结点的域,以及该列链表中前趋结点的down域。域。(3若若pa-col col且且pa-col0即不是表头结点),即不是表头结点),则只需要将则只需要将pa指针向右推进一步,并继续进行比较。(指针向右推进一步,并继续进行比较。(4) 若若pa-col pb-col或或pa-col0即是表头结点),则需要在即是表头结点),则需要在矩阵矩阵A的十字链表中插入一个的十字链表中插入一个pb所指结点。所指结点。 由前面建立十字链表算法知,总表头结点的行列域存放的是由前面建立十字链表算法知,总表头结点的行列域存放的是矩阵的行和列,而各行列链表的头结点其行列域值为零,矩阵的行和列,而各行

24、列链表的头结点其行列域值为零,当然各非零元素结点的行列域其值不会为零,下面分析的当然各非零元素结点的行列域其值不会为零,下面分析的4种情种情况利用了这些信息来判断是否为表头结点。况利用了这些信息来判断是否为表头结点。3 3 矩阵的转置矩阵的转置 设设SPMatrix A; SPMatrix A; 表示一表示一m m* *n n的稀疏矩阵,其转置的稀疏矩阵,其转置B B则是一个则是一个n n* *m m的稀疏的稀疏矩阵,因此也有矩阵,因此也有SPMatrix B; SPMatrix B; 由稀疏矩阵由稀疏矩阵A A求它的转置求它的转置B B只要将只要将A A的行、列转化的行、列转化成成B B的列

25、、行。的列、行。 将将A.dataA.data中每一三元组的行列交换后转化到中每一三元组的行列交换后转化到B.dataB.data后,似乎已完成后,似乎已完成了转置,其实不然。了转置,其实不然。A A的转置的转置B B如图如图6.156.15所示,图所示,图6.166.16是它对应的三元组存储。是它对应的三元组存储。也就是说,在也就是说,在A A的三元组存储基础上得到的三元组存储基础上得到B B的三元组表存储。的三元组表存储。转置算法的实质是将矩阵转置算法的实质是将矩阵A A的行和列转化成矩阵的行和列转化成矩阵B B的列和行。的列和行。sparmatrix Trans(sparmatrix A

26、) / sparmatrix Trans(sparmatrix A) / 调用稀疏矩阵调用稀疏矩阵A A sparmatrix B; / sparmatrix B; / 定义稀疏矩阵定义稀疏矩阵B B B.rows=A.cols; B.rows=A.cols; B.cols=A.rows;B.cols=A.rows;B.terms=A.terms;B.terms=A.terms; for (int n=0;n=A.terms-1;n+) for (int n=0;ntag=0; gh-tag=0; gh-node.data= gh-node.data=* *s;s; gh-link=NULL;

27、 gh-link=NULL; elseelse gh=new linknode; gh=new linknode; gh-tag=1; gh-tag=1; p=gh; p=gh; s+; s+; strncpy(subs,s,len-2); strncpy(subs,s,len-2); subslen-2=0; subslen-2=0; do Disastr(subs,hstr); r=CreateGL(hstr); p-node.sublist=r; q=p; len=strlen(subs); if (len0) p=new linknode; p-tag=1; q-link=p; whi

28、le (len0); q-link=NULL; return gh; 创建广义表算法的时间复杂度为创建广义表算法的时间复杂度为O(n)。 2广义表取头算法广义表取头算法 若广义表若广义表GL=(a1,a2,an),则),则headGL)=a1 。取表头运算的结果可以是原。取表头运算的结果可以是原子,也可以是一个子表。子,也可以是一个子表。 例如,例如,head(a1,a2),(),(a3,a4,a5),),a6)=(a1,a2)。)。Head(linknode *GL) if GL-tag=1 p=GL-hp; return p; 3. 广义表取尾算法广义表取尾算法 若广义表若广义表GL=(a

29、1,a2,an),则),则tailGL)=(a2,an) 。取表尾运算的结果。取表尾运算的结果是取出除表头以外的所有元素。是取出除表头以外的所有元素。 例如,例如,tail(a1,a2),(),(a3,a4,a5),),a6)=(a3,a4,a5),),a6)。)。 Tail(linknode *GL) if GL-tag=1 p=GL-tp; return p; 4. 4. 求广义表深度算法求广义表深度算法int Depth(linknode int Depth(linknode * *GL)GL) int max=0; int max=0;while (GL!=NULL)while (GL

30、!=NULL) if (GL-tag=0) / if (GL-tag=0) / 有子表有子表 int dep=Depth(GL-sublit) int dep=Depth(GL-sublit) if (depmax) if (depmax) max=dep; max=dep; GL=GL-link;GL=GL-link; return max+1; / return max+1; / 非空表的深度是各元素的深度的最大值加非空表的深度是各元素的深度的最大值加1 1 求广义表深度算法的时间复杂度为求广义表深度算法的时间复杂度为O(n)O(n)。(1 1) 数组是一个具有固定格式和数量的数据有序集,

31、每一个数据元素有唯一的数组是一个具有固定格式和数量的数据有序集,每一个数据元素有唯一的一组下标来标识,在数组上不太适宜做插入、删除数据元素的操作。一组下标来标识,在数组上不太适宜做插入、删除数据元素的操作。(2 2二维数组中二维数组中aijaij的地址为:的地址为: LOC(aij) = LOC(a00) + ( i LOC(aij) = LOC(a00) + ( in + j ) n + j ) d d (0 0下标起始的语言)下标起始的语言)(3 3三维数组中三维数组中aijkaijk的地址为:的地址为: LOC(aijk)=LOC(a000)+( (i LOC(aijk)=LOC(a00

32、0)+( (in np+ jp+ jp +k) p +k) d d (0 0下标起始的语下标起始的语言)言)(4 4对称矩阵是一种特殊矩阵,对称矩阵是一种特殊矩阵,n n阶方阵的元素满足性质:阶方阵的元素满足性质: aij=aji aij=aji (0i , jn-10i , jn-1)。对称矩阵是关于主对角线的对称,因此只需存)。对称矩阵是关于主对角线的对称,因此只需存储上三角或下三角部分的数据即可。储上三角或下三角部分的数据即可。小 结 (5三角矩阵的特殊性是以主对角线划分矩阵。主对角线任意一侧不包括三角矩阵的特殊性是以主对角线划分矩阵。主对角线任意一侧不包括主对角线中的元素均为常数主对角

33、线中的元素均为常数C)。下三角矩阵,主对角线以上均为同一个)。下三角矩阵,主对角线以上均为同一个常数;上三角矩阵,主对角线以下均为同一个常数,均可以采用压缩存储。常数;上三角矩阵,主对角线以下均为同一个常数,均可以采用压缩存储。(6在在m*n的矩阵中有的矩阵中有t个非零元素,且个非零元素,且t远小于远小于m*n,这样的矩阵称稀疏矩阵。,这样的矩阵称稀疏矩阵。稀疏矩阵常用的有:三元组表存储、带行指针的链表存储、十字链表存储等存稀疏矩阵常用的有:三元组表存储、带行指针的链表存储、十字链表存储等存储方法。储方法。(7) 广义表是广义表是nn0个数据元素的有序序列,广义表的元素可以是单元素,个数据元素

34、的有序序列,广义表的元素可以是单元素,也可以是一个广义表。也可以是一个广义表。(8) 由于广义表的元素有两种形式,所以其结点的存储形式也有两种:表结由于广义表的元素有两种形式,所以其结点的存储形式也有两种:表结点由标志域、表头指针域、表尾指针域组成;而原子结点由标志域和值域组成。点由标志域、表头指针域、表尾指针域组成;而原子结点由标志域和值域组成。1 1实验目的实验目的 (1 1) 掌握稀疏矩阵三元组表的存储方法。掌握稀疏矩阵三元组表的存储方法。 (2 2掌握稀疏矩阵三元组表创建、显示、转置和查找等算法。掌握稀疏矩阵三元组表创建、显示、转置和查找等算法。 (3 3掌握广义表的存储方法。掌握广义表的存储方法。 (4 4掌握广义表的新建、显示和查找等算法。掌握广义表的新建、显示和查找等算法。 (5 5掌握稀疏矩阵三元组表和广义表的算法分析方法。掌握稀疏矩阵三元组表和广义表的算法分析方法。2 2实验内容实验内容 (1 1编写稀疏矩阵三元组表的存储程序;编写稀疏矩阵三元组表的存储程序; (2 2编写疏矩阵三元组表创建、显示、转置和查找程序;编写疏矩阵三元组表创建、显示、转置和查找程序; (3 3编写建立广义表的程序;编写建立广义表的程序; (4 4编写广义表的显示和查找程序;编写广义表的显示和查找程序; (5 5设计选择式菜

温馨提示

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

评论

0/150

提交评论