用C语言实现线性表的顺序存储(创建,插入,删除和查找)

用C语言实现线性表的顺序存储(创建,插入,删除和查找),第1张

//C++课程设计---学生成绩管理系统

#include <stdioh>

#include <stringh>

#include <iostreamh>

#include <stdlibh>

#include <windowsh>

typedef struct studentinfo //结构体定义

{

int num;//学号

char name[64];//姓名

int sex;//性别,1为男性,0为女性

float math;//数学

float english;//英语

float politic;//政治

float chinese;//语文

float total;//总成绩

struct studentinfo next;

}STUDENT;

#define FILENAME "D:\\1txt"

//定义默认的数据库文件

#define DELAYTIME 1500

//显示信息,延时

void create_menu();

STUDENT new_student();

STUDENT create_linkbyfile(char );

STUDENT del_info(STUDENT );

int save_info(char ,STUDENT ,int);

int find_infile_printf(char );

int pri_whole_link(STUDENT );

STUDENT printf_sort(STUDENT );

void free_link(STUDENT );

void main() //主函数

{

create_menu();

}

STUDENT reverse(STUDENT head)

//功能:链表反转顺序

//参数:head链表头结点指针

{

STUDENT ptemp,p1;

if(head==NULL)

{

return 0;

}

p1=head;//p1使之永远指向排好序的第一个结点,初值为head,head使之永远是已经排好序的最后一个结点

while(head->next!=NULL)//本次循环使ptemp排好序

{

ptemp=head->next;//ptemp指向未排好序的第一个结点

head->next=ptemp->next;//

ptemp->next=p1;//ptemp也排好序了,ptemp变成排好序的第一个结点了

p1=ptemp;//再次让p1成为第一个排好序的结点

}

return p1;//头结点为第一个结点

}

void create_menu()

//功能:输出功能菜单,提供人-机接口

{

char menu_Num;

STUDENT head=NULL;

char ch;

char file_name[256];

while(1)

{

system("cls");

cout<<"\t\t学生成绩管理系统\n";

cout<<"##########################################\n";

cout<<"#\t\t 1新增学生信息\t\t #\n";

cout<<"#\t\t 2加载数据库\t\t #\n";

cout<<"#\t\t 3删除学生信息\t\t #\n";

cout<<"#\t\t 4保存学生信息\t\t #\n";

cout<<"#\t\t 5数据库查询\t\t #\n";

cout<<"#\t\t 6原序输出\t\t #\n";

cout<<"#\t\t 7排序输出\t\t #\n";

cout<<"#\t\t 8退出\t\t\t #\n";

cout<<"##########################################\n";

cout<<"请输入 *** 作编号:";

cin>>menu_Num;

switch (menu_Num)

{

case '1':

free_link(head);//释放链表空间

head=new_student();//新增学生信息

break;

case '2':

free_link(head);//释放链表空间

cout<<"请输入要加载的数据库文件的路径"<<endl;

cin>>file_name;

head=create_linkbyfile(file_name);//读取数据文件

if(head!=NULL)

{

cout<<"数据库"<<file_name<<"已加载"<<endl;

Sleep(DELAYTIME);

}

break;

case '3':

del_info(head);//删除学生信息

break;

case '4'://保存学生信息

if (head==NULL)

{

cout<<"请先生成学生信息"<<endl;

Sleep(DELAYTIME);

}

else

{

cout<<"想将学生信息保存到哪个数据库文件?";

cin>>file_name;

cout<<"请选择保存方式:0追加到文件末尾 1覆盖文件\n";

cin>>menu_Num;

if(save_info(file_name,head,menu_Num-'0')==0)//0表示追加,1表示覆盖

{

cout<<"信息保存失败\n";

}

else

{

cout<<"数据已保存到"<<file_name<<endl;

Sleep(DELAYTIME);

}

}

break;

case '5':

find_infile_printf(FILENAME);//数据库查询

break;

case '6'://原序输出信息

pri_whole_link(head);

cout<<"返回主菜单? Y/N\t";

do

{

cin>>ch;

}while(ch!='Y'&&ch!='y');

break;

case '7'://排序输出信息

do

{

if((head=printf_sort(head))==NULL)

{

cout<<"数据库未加载"<<endl;

Sleep(DELAYTIME);

break;

}

else

{

cout<<"选择其他方式排序? Y/N\t";

cin>>ch;

}

}while(ch=='Y'||ch=='y');

break;

case '8':

free_link(head);//释放链表空间

exit(0);

break;

default:

cout<<"输入有误!请重新输入!"<<endl;

Sleep(DELAYTIME);

break;

}

}

}

STUDENT new_student()

//功能:创建学生信息(通过链表)

//返回值:头结点指针

{

STUDENT pnew,p,head;

float pfloat;

char ch;

head=NULL;

do

{

system("cls");

pnew=(STUDENT )malloc(sizeof(STUDENT)1);

cout<<"请输入学生的学号(0表示取消): ";

cin>>pnew->num;

if(0>=pnew->num)

{

break;

}

cout<<"请输入学生的姓名:";

cin>>pnew->name;

while(1)

{

cout<<"请输入学生的性别:0/1\t";

cin>>pnew->sex;

if(pnew->sex&&pnew->sex-1)

{

cout<<"性别输入错误,0表示女性,1表示男性,请重新输入"<<endl;

}

else

{

break;

}

}

cout<<"请依次输入学生的数学、英语、政治、语文成绩:"<<endl;

for(pnew->total=0,pfloat=&pnew->math;pfloat<&pnew->math+4;)

{

cin>>pfloat;

if(pfloat<0||pfloat>150)

{

cout<<"成绩输入错误,只能为0~150"<<endl;

}

else

{

pnew->total+=pfloat;

pfloat++;

}

}

if(head==NULL)

{

head=pnew;

}

else

{

p->next=pnew;

}

p=pnew;

pnew->next=NULL;

cout<<"##########################该学生信息已生成#########################\n";

cout<<"建立另一个学生的信息? Y/N\t";

cin>>ch;

}while(ch=='Y'||ch=='y');

return head;

}

STUDENT create_linkbyfile(char filename)

//功能:读取文件,创建链表

//参数:如果filename不为空,则打开该文件,如果filename为空,要求输入文件位置

//创建的链表的所有结点的next全部修改,指向物理地址上的下一个结点

{

system("cls");

FILE fp;

STUDENT head,ptemp,pnew;

head=NULL;//初始化head为空

if(filename==NULL)//若filename为空,要求输入文件绝对地址

{

char file_name[256];

cout<<"请输入数据库文件的路径:"<<endl;

cin>>file_name;

if(NULL==(fp=fopen(file_name,"rb")))

{

cout<<"数据库连接失败\n";

return 0;

}

}

else

{

if(NULL==(fp=fopen(filename,"rb")))

{

cout<<"数据库连接失败\n";

return 0;

}

}

for(ptemp=NULL;;)

{

pnew=(STUDENT )malloc(sizeof(STUDENT)1);

if(fread(pnew,sizeof(STUDENT),1,fp)!=NULL)

{

if(ptemp!=NULL)

{

ptemp->next=pnew;

}

else

{

head=pnew;

}

ptemp=pnew;

}

else

{

if(ptemp!=NULL)

{

ptemp->next=NULL;

}

else

{

head=NULL;

}

free(pnew);

break;

}

}

fclose(fp);

return head;

}

STUDENT del_info(STUDENT head)

//根据学号,删除链表的结点

{

system("cls");

STUDENT p1,p2;

int num;

if (head==NULL)

{

cout<<"数据库未加载"<<endl;

Sleep(DELAYTIME);

return 0;

}

cout<<"请输入要删除学生的学号:";

cin>>num;

for(p1=head;p1!=NULL;)

{

if(p1->num==num)//找到

{

if(p1==head)//要删除的结点是头结点

{

head=p1->next;

}

else

{

p2->next=p1->next;

}

cout<<"成功删除!!";

}

p2=p1;

p1=p1->next;

}

return head;

}

int save_info(char filename,STUDENT head,int flag)

//功能:将链表按Binary写入文件末尾

//参数:

//1filename文件名,绝对地址

//2head指向链表的头结点

//3flag 0追加或1覆盖数据

//返回值:失败则返回0

{

system("cls");

FILE fp;

STUDENT p;

char openmethod[8];

if(flag==0)

{

strcpy(openmethod,"ab+");//追加

}

else

{

strcpy(openmethod,"w");//覆盖

}

if(NULL==(fp=fopen(filename,openmethod)))//

{

cout<<"数据库连接失败"<<endl;

Sleep(DELAYTIME);

return 0;

}

else

{

for(p=head;p;p=p->next)

{

if((fwrite(p,sizeof(STUDENT),1,fp))==NULL)

{

cout<<"数据库创建失败"<<endl;

return 0;

}

}

}

fclose(fp);

return 1;

}

int find_infile_printf(char filename)

//功能:根据学号和姓名来查询某个学生

//参数:filename数据库文件

//返回值:失败返回0

//直接搜索文件,缺点是速度慢

//也可先根据文件创建链表,再搜索链表,缺点是如果文件较大,占用内存多

{

system("cls");

FILE fp;

STUDENT stu;

int num;

char stu_name[64];

char ch;

if(filename==NULL)

{

return 0;

}

do

{

memset(stu_name,0,sizeof(stu_name));

cout<<"查询学号或查询姓名? 1查询学号 0查询姓名";

//flag=1根据学号来查询,flag=0根据姓名来查询

cin>>num;

if(num==1)

{

cout<<"输入要查询的学号:";

cin>>num;

cout<<"正在为您查询学号为"<<num<<"的学生……"<<endl;

}

else if(num==0)

{

cout<<"输入要查询的姓名:";

cin>>stu_name;

cout<<"正在为您查询姓名为"<<stu_name<<"的学生……"<<endl;

}

else

{

cout<<"输入有误"<<endl;

return 0;

}

if(NULL==(fp=fopen(filename,"rw")))

{

cout<<"数据库连接失败\n";

return 0;

}

else

{

while(fread(&stu,sizeof(STUDENT),1,fp)!=NULL)

{

if(strcmp(stuname,stu_name)==0||stunum==num)

{

cout<<"学号\t姓名\t性别\t数学\t英语\t政治\t语文\t总成绩\n";

//输出该学生的所有信息

cout<<stunum<<"\t"<<stuname<<"\t"<<stusex<<"\t"<<stumath<<"\t"<<stuenglish<<"\t"<<stupolitic<<"\t"<<stuchinese<<"\t"<<stutotal<<endl;

//不加break;可支持多个相同数据的索引

}

}

}

cout<<"##########################查询完毕#########################\n";

cout<<"查询另一个学生的信息? Y/N\t";

cin>>ch;

}while(ch=='Y'||ch=='y');

fclose(fp);

return 1;

}

int pri_whole_link(STUDENT head)

//功能:显示整条链表的学生信息

//参数:head 头结点指针,如果head为空,返回空

{

system("cls");

STUDENT p;

if (head==NULL)

{

cout<<"数据库未加载"<<endl;

Sleep(DELAYTIME);

return 0;

}

cout<<"学号\t姓名\t性别\t数学\t英语\t政治\t语文\t总成绩\n";

for(p=head;p;p=p->next)

{

cout<<p->num<<"\t"<<p->name<<"\t"<<p->sex<<"\t"<<p->math<<"\t"<<p->english<<"\t"<<p->politic<<"\t"<<p->chinese<<"\t"<<p->total<<endl;

}

return 1;

}

STUDENT printf_sort(STUDENT head)

//功能:根据学号|某科目成绩|总成绩对链表进行排序,然后输出

//参数:head链表头指针,如果head为空,返回空

//返回值:返回新的链表的头结点指针

{

system("cls");

STUDENT p1,p2,ptemp,pfinished=NULL;

char num;

char flag;

if (head==NULL)

{

return 0;

}

cout<<"选择排序依据 0数学成绩1英语成绩2政治成绩3语文成绩4总成绩\n";

while(1)

{

cin>>num;

if(num>'4'||num<'0')

{

cout<<"输入有误,请重新输入 0~4"<<endl;

}

else

{

break;

}

}

cout<<"升序/降序输出? 0降序1升序";

while(1)

{

cin>>flag;

if(flag>'1'||flag<'0')

{

cout<<"输入有误,请重新输入 0~1"<<endl;

}

else

{

break;

}

}

for(p1=head;p1->next!=pfinished;)//对链表进行从大到小排序(这里用冒泡法)

//p1使之总是指向头结点,pfinished使之总是指向已排序好的最前面的结点

//ptemp作为中介,保存p2的上一个结点

{

for(p2=p1;p2->next!=pfinished;)

{

if((&(p2->math)+num-'0')<(&(p2->next->math)+num-'0'))//p2的值小于p2->next的值,交换 ptemp p2 p2->next

{

if(p2==p1)//头结点要交换

{

p1=p2->next;

p2->next=p1->next;

p1->next=p2;

ptemp=p1;

}

else

{

ptemp->next=p2->next;

ptemp=p2->next;

p2->next=ptemp->next;

ptemp->next=p2;

}

}

else//不需要交换,则p2、ptemp前进1位

{

ptemp=p2;

p2=p2->next;

}

}

pfinished=p2;

}

if(flag=='1')

{

p1=reverse(p1);

}

pri_whole_link(p1);

cout<<"##########################信息显示完毕#########################\n";

return p1;

}

void free_link(STUDENT head)

//释放链表空间,如果head,什么都不做

{

STUDENT p1,p2;

for(p1=head;p1;p1=p2)

{

p2=p1->next;//先保存,否则

free(p1);//free后 p1->next数据丢失

}

}

LZ好。线性代数是高数里最好学的课程了。它和微积分没有太大的关系。如果你的微积分不好,完全不必担心学不好线性代数。要说线性代数究竟难在哪,还是在它的计算上。线性代数要求你有很强的计算能力,只要不算错数,按部就班的来,非常容易懂

数据仓库的定义及特点

一数据仓库定义

数据仓库之父Bill Inmon在1991年出版的“Building the Data Warehouse”一书中所提出的定义被广泛接受:数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。

对于数据仓库的概念我们可以从两个层次予以理解,首先,数据仓库用于支持决策,面向分析型数据处理,它不同于企业现有的 *** 作型数据库;其次,数据仓库是对多个异构的数据源有效集成,集成后按照主题进行了重组,并包含历史数据,而且存放在数据仓库中的数据一般不再修改。

二数据仓库特点

1、面向主题。 *** 作型数据库的数据组织面向事务处理任务,各个业务系统之间各自分离,而数据仓库中的数据是按照一定的主题域进行组织。主题是一个抽象的概念,是指用户使用数据仓库进行决策时所关心的重点方面,一个主题通常与多个 *** 作型信息系统相关。

2、集成的。面向事务处理的 *** 作型数据库通常与某些特定的应用相关,数据库之间相互独立,并且往往是异构的。而数据仓库中的数据是在对原有分散的数据库数据抽取、清理的基础上经过系统加工、汇总和整理得到的,必须消除源数据中的不一致性,以保证数据仓库内的信息是关于整个企业的一致的全局信息。

3、相对稳定的。 *** 作型数据库中的数据通常实时更新,数据根据需要及时发生变化。数据仓库的数据主要供企业决策分析之用,所涉及的数据 *** 作主要是数据查询,一旦某个数据进入数据仓库以后,一般情况下将被长期保留,也就是数据仓库中一般有大量的查询 *** 作,但修改和删除 *** 作很少,通常只需要定期的加载、刷新。

4、反映历史变化。 *** 作型数据库主要关心当前某一个时间段内的数据,而数据仓库中的数据通常包含历史信息,系统记录了企业从过去某一时点(如开始应用数据仓库的时点)到目前的各个阶段的信息,通过这些信息,可以对企业的发展历程和未来趋势做出定量分析和预测。

企业数据仓库的建设,是以现有企业业务系统和大量业务数据的积累为基础。数据仓库不是静态的概念,只有把信息及时交给需要这些信息的使用者,供他们做出改善其业务经营的决策,信息才能发挥作用,信息才有意义。而把信息加以整理归纳和重组,并及时提供给相应的管理决策人员,是数据仓库的根本任务。因此,从产业界的角度看,数据仓库建设是一个工程,也是一个过程。

1 将excel上的数据转化为线形图怎么弄

1、首先打开excel软件,任意版本都是可以的,不过现在一般都是新版本,然后进入到软件的主界面。

2、接着在软件界面的第一列打上标题和一些数字,多打上几行,这样一会线形图显示的就比较明显。

3、数据全部编辑好后,用鼠标在上方选中整列,也就是图标变成向下的小黑色箭头的时候,点击鼠标就选中整列了。

4、接下来选择标题栏的插入选项,然后在其众多的选项中选择折线图的图标,如图所示:

5、点击折线图的图标,会d出很多的样式,看自己的需要来进行选择,这里选择第一种,也是最基本的一种。

6、选中之后,在表格的窗口就会显示折现图了,折线图上边的转折点都会有标识,也会对应左侧的数据,当然数据都是可以更改的。

7、当然插入的折线图是默认的大小位置,这个可以根据自己的排版要求来编辑整个线形图的大小和位置,最后折线图就完成了。

2 如何实现变量的线性变换

下面介绍WinCC 线性变换的 *** 作步骤。

1 创建项目,建立过程变量。

2 配置线性变换及组态画面。

3 测试效果。

点击图形编辑器工具栏中的绿色三角激活项目。

按照以上的步骤就能实现变量的线 换了。

3 什么是线性变换,求通俗易懂

线性映射( linear mapping)是从一个向量空间V到另一个向量空间W的映射且保持加法运算和数量乘法运算,而线性变换(linear transformation)是线性空间V到其自身的线性映射。

性质

(1)设A是V的线性变换,则A(0)=0,A(-α)=-A(α);

(2)线性变换保持线性组合与线性关系式不变;

(3)线性变换把线性相关的向量组变成线性相关的向量组。

注意:线性变换可能把线性无关的向量组变成线性相关的向量组。

扩展资料:

运算

线性变换的加法和数量乘法

定义一: 设

对A 与B和A+B定义为:

定义二:设

对k与A的数量乘积kA定义为:

定义三:设

对A 与B的乘积AB定义为:

定义四:设

若存在

使得

则称A是可逆的,且B是A的逆变换,记为:

4 怎么把非线性回归分析转换为线性回归分析

非线性回归的分析比线性回归要复杂得多。其中对于一些数据,可以转化为线性回归进行处理。

1 首先要对数据进行分析,根据数据在平面坐标中的点的分布,按照数学知识,估计出数据的大致趋势,常见的有对数型、指数型等等。

以指数型为例,如果数据符合y=Ae^x的形式,那么可以对数据两边取对数,得到:

lny=lnA+x的形式,把试验数据中的因变量取对数后,原来的数据就成为线性数据了,可以用线性回归的方法进行分析,求出回归方程,进行方差分析了。

现在计算机进行数据分析非常方便,可以不需要进行数据转化,直接进行非线性回归分析,这样的结果更准确,还可以进行多因素,多次的回归分析,这些都有成熟的软件可以使用,但非线性回归转化为线性回归的数学思想在分析中还是很有用的,还需要学习的。

一般方法A直接处理法、B对数变换法 、C广义最小二乘法

5 如何用Excel做数据线性拟合和回归分析 详细

?裉煳颐抢闯⑹允褂媒衔?ㄒ档哪夂瞎ぞ呃炊源死嗍?萁?写?怼 在数据分析中,对于成对成组数据的拟合是经常遇到的,涉及到的任务有线性描述,趋势预测和残差分析等等。

很多专业读者遇见此类问题时往往寻求专业软件,比如在化工中经常用到的Origin 和数学中常见的MATLAB 等等。它们虽很专业,但其实使用Excel 就完全够用了。

我们已经知道在Excel 自带的数据库中已有线性拟合工具,但是它还稍显单薄,今天我们来尝试使用较为专业的拟合工具来对此类数据进行处理。 注:本功能需要使用Excel 扩展功能,如果您的Excel 尚未安装数据分析,请依次选择“工具”-“加载宏”,在安装光盘支持下加载“分析数据库”。

加载成功后,可以在“工具”下拉菜单中看到“数据分析”选项 实例 某溶液浓度正比对应于色谱仪器中的峰面积,现欲建立不同浓度下对应峰面积的标准曲线以供测试未知样品的实际浓度。已知8 组对应数据,建立标准曲线,并且对此曲线进行评价,给出残差等分析数据。

这是一个很典型的线性拟合问题,手工计算就是采用最小二乘法求出拟合直线的待定参数,同时可以得出R 的值,也就是相关系数的大小。在Excel 中,可以采用先绘图再添加趋势线的方法完成前两步的要求。

选择成对的数据列,将它们使用“X、Y 散点图”制成散点图。 在数据点上单击右键,选择“添加趋势线”-“线性”,并在选项标签中要求给出公式和相关系数等,可以得到拟合的直线。

拟合的直线是y=15620x+66061,R2 的值为09994。 因为R2 >099,所以这是一个线性特征非常明显的实验模型,即说明拟合直线能够以大于9999%地解释、涵盖了实测数据,具有很好的一般性,可以作为标准工作曲线用于其他未知浓度溶液的测量。

为了进一步使用更多的指标来描述这一个模型,我们使用数据分析中的“回归”工具来详细分析这组数据。 在选项卡中显然详细多了,注意选择X、Y 对应的数据列。

“常数为零”就是指明该模型是严格的正比例模型,本例确实是这样,因为在浓度为零时相应峰面积肯定为零。先前得出的回归方程虽然拟合程度相当高,但是在x=0 时,仍然有对应的数值,这显然是一个可笑的结论。

所以我们选择“常数为零”。 “回归”工具为我们提供了三张图,分别是残差图、线性拟合图和正态概率图。

重点来看残差图和线性拟合图。 在线性拟合图中可以看到,不但有根据要求生成的数据点,而且还有经过拟和处理的预测数据点,拟合直线的参数会在数据表格中详细显示。

本实例旨在提供更多信息以起到抛砖引玉的作用,由于涉及到过多的专业术语,请各位读者根据实际,在具体使用 中另行参考各项参数,此不再对更多细节作进一步解释。 残差图是有关于世纪之与预测值之间差距的图表,如果残差图中的散点在中州上下两侧零乱分布,那么拟合直线就是合理的,否则就需要重新处理。

更多的信息在生成的表格中,详细的参数项目完全可以满足回归分析的各项要求。下图提供的是拟合直线的得回归分析中方差、标准差等各项信息。

6 怎么用EXCEL做线性拟合

打开有样本数据的Excel文件,点击“插入”—“图表”,这样就打开了图表向导,然后在图表向导中选择“散点图”,再点击下一步。

选择图表的源数据。这里点击“数据区域”末尾的按钮,可以把样本数据选入。如果自变量(X值)和因变量(Y值)在坐标系中颠倒,那么还可以通过“系列”来调整,。

接着就进入了“图表选项”,这里主要是对坐标抽和标题进行命名,但是此次主要是为了拟合,所以这里可以不做过多设置。

所有设置完成后就生成了一幅散点图,然后在散点上右击,选择“添加趋势线”。具体如图5。

在添加趋势线的选框中,有一个“类型”,这里我们就选择第一个“线性”,;而在“选项”里面,我们选择“显示公式”和“显示R的平方值”,。

这样在散点图中,我们就可以看见一个公式和R值。这个公式表示的是这些散点的拟合线函数,而R值表示散点数据的线性相关性。

7 什么是非退化线性变换

非退化矩阵就是行列式不等于零。

若n阶矩阵A的行列式|A|≠0,n阶方阵A是非退化的充要条件为A是可逆矩阵。

一个nn矩阵是非退化的充要条件是它的秩等于n。设A,B都是数域F上的nn矩阵,矩阵AB为退化的充要条件是A,B中至少有一个是退化的。

扩展资料:

非退化矩阵就是满秩的矩阵,反之退化矩阵就是不满秩的矩阵。如果矩阵行不满秩,经过初等行变换后,矩阵会出现0行,此时把矩阵列分块,可以发现列向量的维度退化了。

如果列不满秩同理,初等列变换后出现0列,按照行分块,则行向量的维度退化了。

矩阵分解是将一个矩阵分解为比较简单的或具有某种特性的若干矩阵的和或乘积 ,矩阵的分解法一般有三角分解、谱分解、奇异值分解、满秩分解等。

以上就是关于用C语言实现线性表的顺序存储(创建,插入,删除和查找)全部的内容,包括:用C语言实现线性表的顺序存储(创建,插入,删除和查找)、急!线性代数和数据库哪个好学一些、数据仓库的定义及特点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9422875.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存