版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
结构、联合与枚举类型第一节结构类型第二节结构数组第三节结构指针第四节在函数之间传递结构第五节联合类型第六节枚举类型第七节用typedef定义类型第八节链表根底问题的引出
用学号、姓名、性别、年龄、住址等属性来描述一个学生。
int
num; charname[20];charsex;
int
age; charaddr[30];问题一:在程序中这些变量没有的内在联系。问题二:如果有成百上千的学生,可能造成混乱。一、结构类型的概念第一节结构类型这些数据存放在内存的某个区域。将此区域统一来使用,形成了结构体的概念。结构是逻辑上相互联系的一组分量的集合。结构中的分量可以有不同的类型数据,结构中的分量称为结构的成员。numnamesexageaddr10010LiFunM18Beijing第一节结构类型比较简单数据类型时的变量说明语句:inti;struct
结构体名{
数据类型
成员名1;
数据类型
成员名2;……
数据类型
成员名n;};二、结构类型的定义struct为关键字结构体名是用户定义的类型标识。{}中包围的是组成该结构的成员。成员的数据类型既可以是简单的数据类型(int、char、float、double...),也可以是复杂的数据类型(数组类型和结构类型)。第一节结构类型结构定义实例为了描述日期可以定义如下结构:
struct
date
{
intyear; /*年结构成员的*/ intmonth; /*月数据类型是*/ intday; /*日整型*/
};为了处理通信录,可以定义如下结构:
struct
address
{charname[30]; /*姓名。字符数组*/ charstreet[40];/*街道名称*/ charcity[20];/*城市*/ charstate[2];/*省市代码*/ unsignedlongzip; /*邮政编码。*/
};第一节结构类型在定义了某种类型的结构体后,就可以使用该类型的结构变量。用类型说明语句说明结构变量struct结构体名结构变量名;系统为所说明的结构变量按照结构定义时说明的组成〔成员分量〕,分配存储数据的实际内存单元。例:将变量today说明为date型的结构变量: structdatetoday;说明多个address型的结构变量: structaddresswang,li,zhang;结构变量同样有存储类型,存储特性与一般变量完全相同。三、结构变量的说明第一节结构类型结构变量占用内存情况结构变量的各个成员分量在内存中占用连续存储区域,所占内存大小为结构中每个成员的占用内存的长度之和。结构变量today和wang占用在内存的情况如下图。2字节2字节2字节today(structdate)6个字节yearmonthdaywang(structaddress)96个字节30字节40字节20字节2字节4字节namestreetcitystatezip表示int表示char表示unsignedlong第一节结构类型关于结构类型的说明类型与变量是不同的概念。在定义结构变量时一般先定义一个结构类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。对结构中的成员,可以单独使用,它的作用与地位相当于普通变量。成员也可以是结构变量。成员名可以与程序中的变量名相同时,二者不代表同一对象。第一节结构类型在定义结构时说明结构变量例如:struct
student
{
int
num; charname[20]; charsex; int
age; charaddr[30];
}student1,student2;直接说明结构变量例如:struct
{
char
name[20];
char
addr[30];
}zhang;第一节结构类型结构成员是另一个结构例如:struct
date { int
month;
int
day;
int
year;
};
struct
student
{
int
num; charname[20]; charsex; int
age;
struct
date
birthday; charaddr[30];
}student1,student2;daymonthyearagesexnamnumaddbirthdaybirthdaybirthdaybirthday第一节结构类型访问结构中的成员是通过成员的名字,称为“按名引用〞。在程序中使用结构中成员的方法为: 结构变量名.成员名称 例:将“〞送入today,对其各个成员分别赋值: today.year=92; today.month=10; today.day=1;指明结构成员的符号“.〞是运算符,含义是访问结构中的成员。“.〞操作的优先级在C语言中是最高的。其结合性为从左到右。四、引用结构变量的成员第一节结构类型例:用结构描述一个人的根本情况,可以定义如下结构: structperson /*定义person结构类型*/ { charname[30]; charsex; structdatebirthday;/*结构的嵌套定义*/ }man;输入zhang先生的情况,如生日,可用如下语句: strcpy(,“zhang〞); /*注意:不能写成="zhang";*/ man.sex=’M’;/*为结构中的字符成员赋值*/ man.birthday.year=1960; man.birthday.month=3; man.birthday.day=28; /*为嵌套定义的结构中的成员赋值*/第一节结构类型输入zhang先生的情况,可用如下语句: strcpy(,“zhang〞); /*注意:不能写成="zhang";*/ man.sex=’M’;/*为结构中的字符成员赋值*/ man.birthday.year=1960; man.birthday.month=3; man.birthday.day=28; /*为嵌套定义的结构中的成员赋值*/如果要将“zhang〞改为“zhong〞,只要将结构变量man中的数组成员name下标为2的元素‘a’改为‘o’即可。可以使用以下语句: [2]='o';. /*为结构变量中的数组成员的一个元素赋值*/第一节结构类型五、对结构变量的整体操作 要对结构进行整体操作有很多限制,C语言中能够对结构进行整体操作的运算不多,只有赋值“=〞和取地址“&〞操作。 例如:有structdatesunday,today;如果today被赋值后,可用语句 sunday=today; 为sunday赋值。第一节结构类型结构类型的引用说明不能将一个结构变量作为一个整体直接访问。例如已定义student1为结构变量并且已有值。不能这样引用: printf(“%s,%c,%d,%d,%d\n〞,student1);如果成员本身又是一个结构类型,那么要用假设干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取等运算。例如,对上面定义的结构变量student1,可以这样访问各个成员:
student1.sex student1.birthday.month student1.birthday.day student1.birthday.year第一节结构类型对成员变量可以象普通变量一样进行各种运算。student2.birthday.year=student1.birthday.year;sum=student1.birthday.month+12;student1.age++;++student1.age;可以引用成员的地址,也可以引用结构变量的地址。如: scanf(“%d〞,&student1.num); printf(“%p〞,&student1);但不能用以下语句整体读入结构变量,如: scanf(“%d,%s,%c,%d,%d,%d,%s〞,&student1);第一节结构类型例:输入今天的日期,然后输出该日期。 #include<stdio.h> main() { structdate
/*在函数中定义结构类型date*/
{intyear,month,day;
};
structdate
today;/*说明结构变量today*/ printf("Entertodaydate(YYYY/MM/DD):"); scanf("%d/%d/%d",&today.year,
&today.month,&today.day); printf("Today:%d/%d/%d\n",today.year,
today.month,today.day); }例C10_103第一节结构类型对结构变量进行初始化在说明变量的同时,可以对每个成员置初值,称为结构变量的初始化,其一般形式为:定义结构时说明变量
struct结构体名
{……
}结构变量={初始化数据};类型说明语句
struct结构体名
结构变量={初始化数据};说明:{}中的初始化数据用逗号分隔。注意数据的个数、数据类型、顺序要一一对应。六、结构变量的初始化第一节结构类型例:用结构描述个人根本情况,打印个人档案。structdate /*在所有函数的外部定义结构date*/{ intyear,month,day;};structperson /*在所有函数的外部定义结构person*/{charname[14],sex; structdatebirthday;};structpersonxu={"Xulihui",'M',{1962,10,4}};main(){ structpersonfang={"Fangjin",'M',{1963,9,13}};structpersonyuan={"Yuanzhiping",'M',{1963,10,5}};/*说明结构变量fang、yuan,并初始化结构变量*/第一节结构类型
printf("namesexbirthday\n");
printf("-------------------------------\n");
printf("%-14s%-4c%4d.%2d.%2d\n",
xu.name,xu.sex,xu.birthday.year,
xu.birthday.month,xu.birthday.day);
printf("%-14s%-4c%4d.%2d.%2d\n",
fang.name,fang.sex,fang.birthday.year,
fang.birthday.month,fang.birthday.day); printf("%-14s%-4c%4d.%2d.%2d\n",
yuan.name,yuan.sex,yuan.birthday.year,
yuan.birthday.month,yuan.birthday.day);}例C11_104第一节结构类型结构体数组说明语句的格式对结构体数组的认识是一个数组。数组中的每一个元素的数据类型是结构类型。例:为记录100个人的根本情况。可以说明一个有100个元素的数组。数组元素的基类型为结构。structpersonman[100]; man就是有100个元素的结构数组,数组的每个元素为person型。 标识符[数组长度]struct
结构体名第二节结构数组访问结构数组元素成员必须遵守数组使用和访问结构成员的规定。访问数组元素按下标进行访问。访问数组元素的成员,使用“.〞运算符和成员名。例如:要将数组man中的3号元素赋值为: "Fangjin",'M',1963,9,13, 就可以使用以下语句: strcpy(man[3].name,"Fangjin〞); man[3].sex='M'; man[3].birthday.year=1963; man[3].birthday.month=9; man[3].birthday.day=13;第二节结构数组将“Fangjin〞改为“Fangjun〞,修改其中的字母'i': man[3].name[5]='u'; /*为数组中元素的数组成员中的一个字符赋值*/注意结构数组遵循数组的性质数组元素的起始下标从0开始,数组名表示该结构数组的存储首地址。结构数组存放在连续的内存区域中,所占内存大小为结构类型的大小乘以数组元素的数量。sizeof(structperson)301222301222301222......namesymdnamesymdnamesymdman[0]man[1]man[99]structpersonman[100]长度==
37
*
100
=
3700
字节?第二节结构数组例:简单的密码加密程序。加密过程是先定义一张字母加密对照表。将需要加密的文字输入加密程序,程序根据加密表中的对应关系,将输入的文字加密输出。对加密表中未出现的字符那么不加密。输入输出输入输出输入输出输入输出输入输出ad bwck d;eiiakb;cwestructtable /*定义结构table*/{ charinput; /*成员input存输入的字符*/ charoutput; /*成员output存输出的字符*/};/*外部结构数组translate并初始化*/structtabletranslate[]={ 'a','d','b','w','c','k','d',';','e','i','i','a','k','b',';','c','w','e’}; /*建立加密对照表*/第二节结构数组“structtabletranslate[]={...}〞有三个作用:说明了一个外部的结构数组translate,表示数组的大小由后面给出的初始化数据决定,对结构数组进行初始化。在程序中给出了数组初始化数据,所以结构数组translate有9个元素。adbwckd;eiiakb;cwetranslate[0]translate[1]translate[2]translate[3]translate[4]translate[5]translate[6]translate[7]translate[8]第二节结构数组structtable{charinput,output;};structtabletranslate[]={'a','d','b','w','c','k','d',';','e','i','i','a','k','b',';','c','w','e'};main(){charch;intstr_long,i;str_long=sizeof(translate)/sizeof(structtable);
/*计算元素个数*/while((ch=getchar())!='\n'){for(i=0;translate[i].input!=ch&&i<str_long;i++);if(i<str_long)putchar(translate[i].output);
/*加密输出*/elseputchar(ch);/*原样输出*/}}例C11_201第二节结构数组例:分析程序运行结果struct
s{intx;int*y;}
/*y:是指向整型的指针*/intdata[5]={10,20,30,40,50};/*data:整型数组*/structs
array[5]={100,&data[0],200,&data[1],300,&data[2],400,&data[3],500,&data[4]};
/*array:结构数组,初始化*/ 结构数组array的每个元素有两个成员,初始化后的状态如下。1002003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]第二节结构数组main(){ inti=0;/*说明变量i并赋初值*/
structss_var; /*s_ver:一般的结构变量*/
s_var=array[0];/*将结构数组array[0]整体赋给s_var*/⑴
printf("%d\n",s_var.x);⑵printf("%d\n",*s_var.y);printf("Forarray:\n");⑶printf("%d\n",array[i].x);⑷printf("%d\n",*array[i].y);⑸printf("%d\n",++array[i].x);⑹printf("%d\n",++
*array[i].y);⑺printf("%d\n",array[++i].x);⑻printf("%d\n",*
++
array[i].y);⑼printf("%d\n",(*
array[i].y)++);⑽printf("%d\n",*(array[i].y
++));⑾printf("%d\n",*
array[i].y
++);⑿printf("%d\n",*
array[i].y);} 第二节结构数组〔i=0〕:s_var=array[0];1002003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]s_var10010010100⑴s_var.x 取s_var的成员x的值⑵*
s_var.y 取s_var的成员指针y所指的内容
⑶array[i].x取array[i]的x的值
⑷
*
array[i].y取array[i]的指针y所指的内容10101001010010第二节结构数组
⑸
++
array[i].x
取array[i]的x的值,x加1后输出
⑹
++
*
array[i].y 取array[i]的指针y所指的内容,y的内容加1后输出1002003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]1001011011i0120030
⑺array[++i].x i先加1后取array[i]的x的值,输出
⑻
*
++
array[i].y将array[i]的指针y先加1后再取y所指的内容,输出10010100101011120030第二节结构数组
⑼
(*array[i].y)++
取array[i]的指针y的内容,输出,y的内容再加1
⑽
*(array[i].y++) 取array[i]的指针y的内容,输出,指针y再加1
1012003004005001120304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]i0130314050
⑾
*array[i].y++ 同*(array[i].y++),由于运算的结合性隐含了括号,输出
⑿*array[i].y
输出
例C10_2021001010010101112003030314050第二节结构数组类似于指向根本数据类型的指针的概念,将结构体变量的地址赋给另一个变量,这就是指向结构体的指针〔简称为结构指针〕。结构指针说明的一般形式struct结构体名*标识符; 例如:structdate*pdate,today; 执行语句:pdate=&today;结果:pdateyearmonthdaytoday一、结构指针的概念第三节结构指针 通过结构指针访问成员采用运算符“->〞进行操作。结构指针->成员名 “->〞运算符有最高的优先级,结合性从左至右。 通过结构指针pdate访问成员year的操作就可以写成:pdate->year=1963; 等价于:today.year=1963;(*pdate).year=1963;辨疑:pdate->year*pdate->year二、通过结构指针访问结构体的成员例C10_301第三节结构指针例:用结构指针改写加密程序structtable{ charinput,output;};structtabletransl[]={'a','d','b','w','c','k','d',';','e','i','i','a','k','b',';','c','w','e’,};main(){ charch; structtable*p,*pend;
/*p和pend为向结构指针*/
pend=&transl[sizeof(transl)/sizeof(structtable)-1
];/*pend指向结构数组transl的最后一个元素*/
while((ch=getchar())!='\n')
{for(p=transl;p->input!=ch&&
p!=pend;p++);
if(p->input==ch)putchar(p->output);
else
putchar(ch);}}adbwckd;eiiakb;cwetranslate[0]translate[1]translate[2]translate[3]translate[4]translate[5]translate[6]translate[7]translate[8]ppend第三节结构指针例.C:请分析程序的运算结果structs{ intx,*y; /*y:结构中的成员是指向整型的指针*/}*p; /*p:指向结构的指针*/intdata[5]={10,20,30,40,50,};/*data:整型数组*/structsarray[5]={100,&data[0],200,&data[1],300,&data[2],400,&data[3],500,&data[4]};
/*array:结构数组*/第三节结构指针main(){ p=array;/*指针p指向结构数组的首地址*/
printf("%d\n",
p->x);
printf("%d\n",
(*p).x);
printf("%d\n",
*p->y);
printf("%d\n",
*(*p).y); printf("%d\n",
++p->x);
printf("%d\n",
(++p)->x);
printf("%d\n",
p->x++);
printf("%d\n",
p->x); printf("%d\n",++(*p->y));
printf("%d\n",++*p->y); printf("%d\n",*++p->y);
printf("%d\n",p->x);
printf("%d\n",*(++p)->y);
printf("%d\n",p->x); printf("%d\n",*p->y++);
printf("%d\n",p->x); printf("%d\n",*(p->y)++);printf("%d\n",p->x); printf("%d\n",*p++->y);printf("%d\n",p->x);}第三节结构指针 结构数组array的初始化后的状态如下图。 ①p->x 取结构指针p指向的结构的成员x的值,输出 ②(*p).x取结构指针p的内容的成员x的值,输出 ③*p->y 取结构指针p的指针成员y的内容,输出 ④*(*p).y取指针p的内容的指针成员y的内容,输出 ⑤++p->xp所指向的x加1,x先加1后再输出,p不加11002003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]p100101011001001010101第三节结构指针①(++p)->xp先加1后再取x的值,x不加1,输出
②p->x++
先取x的值,输出,然后x再加1,③p->x 输出④++(*p->y)p所指的y的内容先加1,输出,p不加1,y也不加1
⑤
++*p->y 同上,由运算的结合性隐含了括号,输出1012003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]p2002012021222002002012122第三节结构指针①*++p->yp所指的y先加1后再取y的内容,输出,
p不加1,y的内容不加1②p->x 输出③*(++p)->yp先加1后再取所指y的内容,输出30④p->x 输出⑤*p->y++取p所指的y的内容输出,然后p所指的y加1⑥
p->x 输出1012013004005001022304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]p30201300302013030030300第三节结构指针①*(p->y)++
取p所指的y的内容,输出,然后p所指的y再加1②p->x 输出
③*p++->y取p所指的y的内容,输出,然后p再加1④p->x 输出1012013004005001022304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]p40300504003004050400例C10_303第三节结构指针指针运算与++运算规律小结 由运算符的优先级和结合性决定++操作的对象; 由++的前缀/后缀形式,决定操作的时机。
++p->x p->x++
++*p->y *++p->y *(++p)->y *p->y++; *(p->y)++ *p++->y第三节结构指针结构与函数的关系: 向结构中传递函数的成员; 在函数之间传递整个结构; 向函数传递结构的地址〔指针〕。向函数中传递结构的成员 在函数中传递结构成员的方法与传递简单变量的方法相同:在函数之间传递成员的值;在函数之间传递成员的地址。一、结构、结构指针作为函数的参数第四节在函数之间传递结构实例 printf(“%d〞,man.birthday.year);传递成员的值scanf(“%d〞,&man.birthday.year);传递成员的地址 gets();传递结构成员的地址第四节在函数之间传递结构在函数之间传递整个结构
将结构作为整体,在函数之间传递:将结构变量作为形参;函数的返回值为一个结构类型。第四节在函数之间传递结构例:利用结构变量求解两个复数之积。①、(3+4i)×(5+6i)②、(10+20i)×(30+40i)structcomplx{ intreal;/*real为复数的实部*/ intim;/*im为复数的虚部*/};structcomplx
cmult(za,zb)/*函数返回值为结构类型*/structcomplx
za,zb; /*形式参数为结构类型*/{ structcomplx
w; w.real=za.real*zb.real-za.im*zb.im; w.im=za.real*zb.im+za.im*zb.real; return(w); /*返回计算结果,返回值的类型为结构*/} 例C10_401第四节在函数之间传递结构向函数传递结构的地址
向函数中传递结构的地址要将函数的形参定义为指向结构的指针, 在调用时要用结构的地址作为实参。例:输入10本书的名称和单价,按照单价排序。 程序中使用插入排序算法。第四节在函数之间传递结构插入排序的根本思想是:在数组中,有N个已经从小到大已经排好序的元素,要参加1个新的元素时,可以从数组的第1个元素开始,依次与新元素进行比较。当数组中首次出现第i个元素的值大于新元素时,那么新元素就应当插在原来数组中的第i-1个元素与第i个元素之间。 此时可以将数组中第i个元素之后〔包括第i个元素〕的所有元素向后移动1个位置,将新元素插入,使它成为第i个元素。这样就可以得到已经排好序的N+1个元素。第四节在函数之间传递结构5552367911
555555555555222555535555555597611插入排序法例如第四节在函数之间传递结构#defineNUM10structbook /*定义结构book*/{ charname[20]; /*书名*/ floatprice; /*单价*/};main(){ structbookterm,books[NUM]; intcount; /*数组books的元素计数器*/ for(count=0;count<NUM;){printf(“EnterNameandPrice.book%d=",count+1);scanf(“%s%f〞,,&term.price);sortbook(term,books,count++);/*传递结构变量term和结构数组book数组的首地址〕*/ } printf("--------BOOKLIST---------\n"); for(count=0;count<NUM;count++) printbook(&books[count]); /*传递数组中1个元素的地址*/}第四节在函数之间传递结构sortbook(term,
pbook,count)structbook
term; /*形参:结构变量term*/structbook
*pbook;/*指向结构数组首元素的指针pbook*/intcount;
/*数组中已存入count个有序元素*/{ inti;
structbook*q,*pend
=pbook;
for(i=0;i<count;i++,pend++); for(;pbook<pend;pbook++) if(pbook->price>term.price)
break;
for(q=pend-1;q>=pbook;q--) *(q+1)=*q; *pbook=term;
/*在pbook处插入新元素term*/}第四节在函数之间传递结构printbook(pbook)structbook*pbook;{ printf("%-20s%6.2f\n",
pbook->name,pbook->price);}例C10_402第四节在函数之间传递结构定义结构变量stu:struct
student{intnum; floatscore;charsex;}stu;结构变量stu占用内存情况
numscoresex2个字节4个字节1个字节sizeof(stu)是7。第五节联合类型union定义联合变量stu:student{intnum; floatscore;charsex;}stu;联合变量stu占用内存情况
4个字节
2个字节
1个字节unionunionunion联合变量占用空间的大小等于成员分量中最长的成员占用内存的长度。4个字节第五节联合类型0x780x560x340x12union{longi;intk;charc;}mix;mix.i=0x12345678;printf(“%x\n〞,mix.i);printf(“%x\n〞,mix.k);printf(“%x\n〞,mix.c);ffe0ffe1ffe2ffe3高地址低地址1234567800010010001101000101011001111000低高ffe3ffe2
ffe1
ffe0
第五节联合类型
mix.c=‘A’;1234567800010010001101000101011001111000低高ffe3ffe2
ffe1
ffe0
123456
4
1
00010010001101000101011001000001低高ffe3ffe2
ffe1
ffe0
printf(“%ld\n〞,mix.i);printf(“%d\n〞,mix.k);printf(“%c\n〞,mix.c);30541984122081A例C10_501第五节联合类型枚举类型的特点:数据的取值是有限个数的数据类型。定义枚举类型的格式
enum枚举类型名{可能的取值表};例如:
enumweekday{sun,mon,tue,wed,thu,fri,dat};说明枚举类型变量的格式
enum枚举类型名变量标识符;第六节枚举类型用户自定义类型 标准类型〔如int、char、float等〕:系统已经定义好的类型,用户可以直接使用,无须再进行定义。 用户自定义类型:用户根据自己的实际要求,自己定义的新的数据类型。除结构和联合等类型之外,还可以用类型说明语句typedef定义新的类型标识符来代替已有的类型。typedef语句的一般形式typedef已定义的类型新的类型实例typedefintINTEGER;typedeffloatREAL; 等价:inti,j;INTEGERi,j;floatpai;REALpai;第七节用typedef定义类型用链表处理不定长数组。什么是链表?结构定义:
structstudent{intnum;floatscore;
structstudent
*
next;};
链表的分类单向链表、双向链表等。一、链表概
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论