数据结构实验线性表(共8篇)
课程名:数据结构
实验名:线性表及其操作 姓名: 班级: 学号:
撰写时间:2014.09.24
一 实验目的与要求
1.掌握线性表的实现
2.掌握线性表的基本操作的实现
二 实验内容
• 分别完成线性表的顺序表示及链式表示
• 在两种表示上, 分别实现一些线性表的操作, 至少应该包括 – 在第i个位置插入一个元素 – 删除第i个元素 – 返回线性表长
– 返回第i个元素的值
三 实验结果与分析
#include
{
printf(“%d, ”,(*p).value);
p=(*p).next;//指针指向下一个结构体
} printf(“n”);} void Link(){
struct V*head;head=(struct V*)malloc(sizeof(struct V));//开辟一个长度为size的内存
(*head).value=-100;//表头为-100(*head).next=NULL;printf(“------------线性表链式表示------------n”);
int i,n=10;struct V*p=head;printf(“10个数据:n”);for(i=0;i (*p).next=(struct V*)malloc(sizeof(struct V)); p=(*p).next; (*p).value=2*i; (*p).next=NULL;} PrintLink(head);//调用PrintLink函数 printf(“删除第四个数据:n”);int k=4;p=head;for(i=1;i p=(*p).next;} struct V*temp=(*p).next;//k表示插入和删除的位置 (*p).next=(*temp).next;free(temp);PrintLink(head);printf(“插入第十个数据:n”); k=10;p=head;for(i=1;i p=(*p).next;} temp=(*p).next;(*p).next=(struct V*)malloc(sizeof(struct V));(*(*p).next).value=-99;(*(*p).next).next=temp;PrintLink(head);} //---------线性表顺序表示-----------void seq1(){ int i,n=10,k=4;int a[10];//---------输出数组元素------------printf(“-------------线性表顺序表示---------n”);for(i=0;i a[i]=i;} printf(“数组元素为:n”);for(i=0;i printf(“%3d”,a[i]);} printf(“n”);//--------插入一个数组元素---------int m=n+1,j=12;//插入元素12 int b[20];for(i=0;i if(i { b[i]=a[i]; } else if(i==k) {b[i]=j;} else {b[i]=a[i-1];} } printf(“输出插入一个元素的数组:n”);for(i=0;i { if(i {c[i]=a[i];} else {c[i]=a[i+1];} } printf(“输出删除一个元素的数组:n”);for(i=0;i printf(“数组元素为:n”);for(i=1;i<=a[0];i++){a[i]=i;} for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”);//-----在k位置插入一个元素------------for(i=a[0];i>=k;i--){a[i+1]=a[i];} a[k]=-100;++a[0];for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”);//-------在k---------------for(i=0;i>k;i++){a[i]=a[i+1];} a[k]=-1;a[0]=n;--a[0];for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”); } int main(int argc,char *argv[]){ seq1();seq2();Link();return 0;} 图1:实验结果截图 磁场是一种看不见且又摸不着的特殊物质,它具有波粒的辐射特性。磁体周围存在磁场,磁体间的相互作用就是以磁场作为媒介的,因此,由磁场产生的相互作用具有非接触性。这一磁场特性被应用到各个领域,如磁悬浮、接近传感等等[1]。然而,由磁场产生的作用力往往不是线性的,因此,在一些领域,特别是传感领域,对线性要求较高,就大大抑制了磁场的作用。本文将采用结构差分的方式,探索一种获得线性磁场力的方法。研究结论是提出一种线性磁场力的方式,对应用于传感领域有一定的引导意义。 2 差分磁场结构模型分析 若两个柱形永磁体的磁轴在同一直线上,且磁极相对,那么由磁场相互作用产生的磁场力亦沿磁轴上,基于磁势能原理[2,3,4],柱形永磁体之间相互作用力如式(1)所示 其中:s为两磁极之间的中心距离,Um为与排斥力相关的磁势能,表达式为Um(s)=qs-1,q是永磁体边界形态和磁能特征决定的相关系数,i为磁极指数。 那么,可以得到: 如果在两个柱形永磁体中间放置另一柱形永磁体(如图2所示),若容器长度为Lv,运动块相对位移为x时,那么中间柱形永磁体受到两侧永磁体的磁场力分别为: 将式(3)和(4)分别在x=Lv/2和x=-Lv/2处进行泰勒展开[5],可得: 由式(5)减去(6)即可得到中间永磁体所受到两侧永磁体作用力的合力Fm: 令线性磁场力系数km=2i(i+1)qLv-(i+2)+4i(i+1)(i+2)·qLv-(i+3),并略去三次高阶项,则有: 3 磁场力关键参数分析 鉴于现今永磁体规格众多,参数多样,本文基于对实验数据严谨性,对于式(2)中的磁场力参数i和q值,将直接采用实验方式获取[6]。本文对永磁体相互作用力fm与位移s之间关系进行实验,选用永磁体材料为钕铁硼,剩余磁化强度为1.2T,初始距离为20mm,尺寸分别为30×φ16和5×φ16,测量得相互磁场力如表1。 下面应用最小二乘法对表1数据进行回归分析,首先对式(2)两边取对数得: 令fm'=lnfm,s'=lns,b=ln(iq),a=-(i+1),有: 由表1数据分别计算fm'和s'。 按最小二乘法计算,建立矩阵,则: 则可以求得:a=-1.375,b=-6.0932。那么可以求出i=0.375,q=0.006,则式(2)为: 上式为永磁体相互作用力与位移关系的拟合曲线。图2为实验数据的拟合曲线。 为了分析回归方程的拟合精度,采用最小二乘法对表2的数据进行线性分析[7],可得残余平方和Q=537.50;残余标准差σ=3.570612;相关系数R2=0.996;剩余标准差为0.657,因此所配置的曲线与试验点拟合是很好的。 4 线性磁场力实验分析 要实验验证差分结构中受力永磁体的受力与位移关系,必须测量其的受力情况,但现今众多测力仪器不容易直接应用于本文的差分结构,因此,本文设计将采用差分结构放置于恒定加速度装置下面,测量受力永磁体的位移,以此来验证式(8)。实验装置如图3所示。 差分结构安装在一个内径比受力柱形永磁体的直径稍大的玻璃器皿中,目的是防止其受力偏传,保证永磁体的磁轴一致,同时玻璃器皿内装入非磁性润滑剂,目的减小摩擦力对实验结构的影响。其中,永磁体中心距离L=25mm,即可求得线性磁场力系数km=735.54N/m。如图3所示,受力永磁体的位移由两侧线性霍尔元件组成的差分测量结构,实验前已将其进行了标定。实验装置放在伺服控制的回转平台,把实验装置放在回转平台上,然后磁轴置于回转平台的轴线上,当回转平台以恒定角速度旋转,回转半径R=0.1m,受力永磁体质量m=0.043kg,实验装置便可以得到恒定的加速度,受力永磁体受到恒定向心力驱动[8],将输出恒定的位移与理论值进行比对。实验结果如表2所示。 从上述结果分析,理论与实验相对误差在2%以内,结果表明理论分析与实验结论一致。 5 结论 (1)本文提出差分磁场结构,分析受力永磁体的受力情况,并采用磁势原理推导出永磁体的受力理论计算公式,从理论公式来看,受力永磁体的受力略去高阶项呈线性特性,证明此差分磁场结构可应用于有线性要求的场合。 (2)采用实验方法测量磁场力关键参数,并通过最小二乘法验证实验的正确性。 (3)设计差分磁场结构线性磁场力公式的验证实验,实验很好地证明了差分磁场结构受力与位移具有较好的线性关系,十分符合理论计算公式。 摘要:针对磁场的特性——永磁体相互作用力的非性线问题,提出一种采取永磁体差分结构,获得高阶线性磁场力的方法。文中以永磁体间相互作用力公式出发,推导永磁体差分结构线性磁场力的高阶近似公式,采用实验方式以及最小二乘法计算磁场力公式的参数,设计通过恒定加速度激励下差分结构的响应实验,有效地验证了差分结构磁场力与位移的关系与理论分析非常符合,相对误差在2%以内,这将对磁场力在各领域的应用有一定的意义。 关键词:差分磁场结构,线性磁场力,最小二乘法 参考文献 [1]王化祥,张淑英.传感器原理及应用[M].天津:天津大学出版社,2004. [2]R Olaru,Dragoi D D.Inductive tilt sensor with magnets and magnetic fluid[J].SENSORS AND ACTUATORS A-PHYS-ICAL,2005,120(2):424-428. [3]蔡圣善,朱耘.经典电动力学[M].上海:复旦大学出版社,1985. [4]冯恩信傅.高等电磁理论[M].西安:西安交通大学出版社,2006. [5]同济大学数学教研室.高等数学(第四版)[M].北京:高等教育出版社,1996. [6]朱鹤年.基础物理实验教程(物理测量的数据处理与实验设计)[M].北京:高等教育出版社,2003. [7]费业泰.误差理论与数据处理[M].北京:机械工业出版社,2007. 试验目的:全面掌握表空间和数据文件的创建、管理过程 试验内容: 1、创建表空间、增加数据文件 2、管理表空间和数据文件的的各种操作 试验步骤: 1、掌握表空间和数据文件相关的概念 1)oracle默认的表空间 系统默认的表空间:SYSTEM、SYSAUX、UNDOTBS1、EMP、EXAMPLE、USERS 2)系统表空间 SYSTEM、SYSAUX是系统表空间,SYSTEM用于存放oracle数据字典的结构和内部元数据。 SYSAUX是SYSTEM的辅助表空间用于存放个模式(用户)的对象元数据。 3)非系统表空间 由DBA根据需要创建,存放用户自己的数据,也可以包含临时数据以及UNDO数据。 2、创建表空间 1)创建表空间的语法 CREATE [smallfile|bigfile] TABLESPACE tablespace_name DATAFILE ‘/path/filename’ SIZE [k|m] REUSE [‘/path/filename’ SIZE [k|m] REUSE] [AUTOEXTEND [ON|OFF] NEXT [k|m] MAXSIZE [UNLIMITED|[K|M]]] [ONLINE|OFFLINE] [LOGGING|NOLOGGING] [PERMANENT|TEMPORARY] [DICTIONARY|LOCAL] 2)定义表空间名字及属性 创建两个表空间ts_test1、ts_test2,本地化管理(Local,默认)、永久表空间(permantent,默认) 3)定义数据文件名字、路径、初始大小、自动扩展等属性 数据文件data_test1、data_test2 路径:c:disk1data_test1.dbf c:disk2data_test2 4)创建脚本: a、创建本地永久表空间 //创建本地永久表空间ts_test1和ts_test2,默认为永久和本地 SQL>create tablespace ts_test1 datafile ‘c:disk1data_file1.dbf’ size=50m reuse autoextend on next 10m; SQL>create tablespace ts_test2 datafile ‘c:disk2data_file2.dbf’ size=50m reuse autoextend on next 10m maxsize unlimited;查看一下创建完成的结果 //查看dba_tablespaces结构 SQL>desc dba_tablespaces; //查看字典中的所有表空间情况,extent_management值为local时为本地表空间 SQL>select tablespace_name,status,extent_management,content from dba_tablespaces;//查看创建表空间时创建的数据文件,首先查看dba_data_files字典结构 SQL>desc dba_data_files;//查看数据文件情况 SQL>set linesize 120 SQL>col file_name for a20 SQL>col file_id for a20 SQL>col tablespace_name a30 SQL>col online_status for a20 SQL>select file_name,file_id,tablespace_name,online_status from dba_data_files; b、创建还原表空间和临时表空间 //创建还原表空间 SQL>create undo tablespace test_undo datafile ‘c:disk3test_undo’ size 20m; //查看创建结果,contents为表空间内容类型,如undo SQL>select tablespace_name,contents from dba_tablespaces; c、创建临时表空间 //创建临时表空间 SQL>create temporary tablespace test_temp tempfile ‘c:disk4test_temp.dbf’ size 20m extent management local; //查询创建结果 SQL>select tablespace_name,extent_management,contents from dba_tablespaces;d、增加数据文件 //增加数据文件 SQL>alter tablespace ts_test1 add datafile ‘c:disk1ts_test11.dbf’ size 10m; //查看增加数据文件的结果 SQL>col file_name for a30 SQL>col tablespace_name for a30 SQL>select file_name,tablespace_name from dba_data_files; 3、管理表空间的各种操作 1)改变表空间的读写状态 //将表空间设为只读 //这时表空间应为online状态,表空间不能包含回滚段,不能是归档模式 //查看数据库日志模式 SQL>archive log list;//查看表空间contents SQL>select tablespace_name,contents from dba_tablespaces where tablespace_name like‘TS_%’; //修改为只读 SQL>alter tablespace ts_test1 read only;2)表空间脱机离线、在线连接 SQL>alter tablespace ts_test1 offline; SQL>alter tablespace ts_test1 online; //查看表空间状态 SQL>select tablespace_name,status from dba_tablespaces;3)修改表空间名称 //查询当前表空间名称和所包含的数据文件 SQL>select file_name,tablespace_name from dba_data_files;//确认表空间处在online状态 SQL>select tablespace_name,status from dba_tablespaces;//表空间改名 SQL>alter tablespace ts_test2 rename to ts_test22;//查询修改结果 SQL>Col file_name for a30;SQL>col tablespace_name for a30;SQL>select file_name,tablespace_name from dba_data_files;4)设置默认表空间 SQL>alter database default tablespace users //设置默认临时表空间 SQL>alter database default temporary tablespace temp;5)删除表空间 SQL>drop tablespace ts_test2;//仅删除表空间信息不删除表空间数据文件 SQL>drop tablespace ts_test2 includng contents;//包括数据文件全部删除 查看删除后的结果情况 SQL>select file_name,tablespace_name from dba_data_files;6)切换undo表空间 SQL>alter system set undo_tablespace =undotbs02;7)删除undo表空间 要删除正在使用的undo表空间,首先切换undo表空间后在进行删除 例如删除undost01 SQL>alter system set undo_tablespace=undost02;SQL>drop tablespace undost01;8)查询undo表空间信息 SQL>show parameter undo_tablespace; 4、管理数据文件的各种操作 1)在表空间中新增一个数据文件 SQL>alter tablespace ts_test1 add datafile ‘c:dsk1ta_test111.dbf’ size 50m;2)删除表空间中无数据的数据文件 第一种语法 SQL>alter database datafile ‘c:disk1ts_test1.dbf’ offline;//数据文件脱机 SQL>alter tablespace ts_test1 drop datafile ‘c:disk1ts_test111.dbf’;第二种语法: SQL>alter database datafile ‘mytb.dbf’ offline drop;3)数据文件自动扩展设置 SQL>alter tablespace ts_test1 datafile ‘c:disk1ts_test1.dbf’ autoextend on next 10m maxsize 500m;4)重置数据文件大小,收回或扩数据文件空间 SQL>alter tablespace ts_test1 datafile ‘c:disk1ts_test1.dbf’ resize 45m; 查询重置数据文件大小后的结果 SQL>col file_name for a30; SQL>col tablespace_name for a30; SQL>select file_name,tablespace_name,bytes/(1024*1024)from dba_data_files;5)移动数据文件 有两条语句可以实现对数据文件的移动: a、alter tablespace tablespace_name rename datafile ‘/path/file_name1’ to ‘/path/file_name_new’; a这条语句主要适合用户表空间,在执行这条语句时表空间必须脱机才能执行。SQL>alter tablesapace ts_test2 offline;//使表空间ts_test2脱机 SQL>host copy c:disk2ts_test2.dbf c:disk1 //将数据文件拷贝到新的位置 SQL>alter tablespace rename datafile ‘c:disk2ts_test2.dbf’ to ‘c:disk1ts_test1.dbf’;b、alter database db_name rename file ‘/path/file_name1’ to ‘/path/file_name_new’; 这条语句使用于系统表空间及不能置为脱机的表空间中的数据文件。在使用该语句时,数据库必须在加载(mount)的状态且目标数据文件必须存在,因为该语句只是修改文件中指向数据文件的指针(地址)。SQL>shutdown immediate;SQL>host copy c:oracleproduct10.2.0oradatasystem01.dbf c:disk1 SQL>startup mount;SQL>alter database rename file ‘c:oracleproduct10.2.0oradataorclsystem01.dbf’ to ‘c:disk1system01.dbf’;SQL>alter database open;查询移动后的结果 一、实验目的 (1)在Matlab Simulink环境下实现控制伺服电机;(2)完成直线倒立摆建模、仿真与分析; (3)通过控制器设计使倒立摆系统稳定运行(摆角保持零度附近): 二、实验内容及要求 (1)状态空间极点配置控制实验(一组极点为书上指定,任选另一组,但保证控制效果要好于前者)具体记录要求:在稳定后(先截一张图),叠加一扰动(仅角度扰动),记录消除扰动的过程(再截一张图),同时记录你所选择的期望极点组。 (2)线性二次最优控制LQR 控制实验(R,Q选择为书上指定,任选另一组,但保证控制效果要好于前者)具体记录要求:在稳定后(先截一张图),叠加一扰动(仅角度扰动),记录消除扰动的过程(再截一张图),同时记录你所选择的R,Q取值。(3)一级正摆位移和角度控制 借助于正摆实验平台,构思、设计控制策略和控制算法,并编程实现,通过实验设备将物体快速、准确地运输到指定的位置,且在吊运的整个过程(起吊,运输,到达目的地)保持较小的摆动角。要求:系统启动后,在当前位置给正摆施加一角度扰动,当平衡(摆角为零)后,让小车直线运行30厘米,并快速保证平衡(摆角为零)。 三、实验过程 1.实验方法 (1)Matlab Simulink仿真环境下精确控制电机 在MATLAB Simulink仿真环境中,建立模型,然后进行仿真并分析结果。(2)直线倒立摆建模、仿真与分析 利用牛顿力学进行受力分析,然后建立直线一级倒立摆系统的数学模型;进行仿真分析。(3)状态空间极点配置控制实验 进入 MATLAB Simulink 实时控制工具箱“Googol Education Products”打开“Inverted PendulumLinear Inverted PendulumLinear 1-Stage IP Experiment PolesExperiments”中的“Poles Control M File1”。 图1 直线一级倒立摆状态空间极点配置实时控制模块(程序) (4)线性二次最优控制LQR 控制实验 打开直线一级倒立摆 LQR 实时控制模块,(进入 MATLAB Simulink 实时控制工具箱“Googol Education Products”打开“Inverted PendulumLinear Inverted PendulumLinear 1-Stage IP Experiment LQRExperiments”中的“LQR Control Demo”)。 图2 直线一级倒立摆 LQR 控制实时控制模块(程序) (5)一级正摆位移和角度控制 (进入 MATLAB Simulink 实时控制工具箱“Googol Education Products”打开 “ Inverted PendulumLinear Inverted PendulumLinear 1-Stage PendulumExperiment LQR Control Experiments”中的“LQR Control Simulink”) 图3 直线一级顺摆 LQR 实时控制模块(程序) 2.实验装置 观察下图我们我们可知直线单级倒立摆控制系统硬件包括计算机、I/O接口设备、伺服电机系统、倒立摆本体和光电码盘反馈测量元件等几大部件,它们正好组成了一个闭环系统。 图4 一级倒立摆实验硬件结构图 对于倒立摆本体而言,可以根据光电码盘的反馈通过换算获得小车的位移,小车的速度信号可以通过差分法得到。摆杆的角度由光电码盘检测并直接反馈到I/O设备,速度信号可以通过差分法得到。计算机从I/O设备中实时读取数据,确定控制策略(实际上是电机的输出力矩),并发送给I/O设备,I/O设备产生相应的控制量,交与伺服驱动器处理,然后使电机转动,带动小车运动,保持摆杆平衡。 图5是一个经典的倒立摆装置图形。小车由6V的直流电机通过齿轮和齿条机构来驱动。小车可以沿导轨做往复运动。小车位移通过一个额外的与电机齿轮啮合的齿轮测得。小车上面通过轴关节安装一个摆杆,摆杆可以绕轴做旋转运动。系统的参数可以改变以使用户能够研究运动特性变化的影响,同时结合系统详尽的参数说明和建模过程,我们能够方便地设计自己的控制系统。 图5 一级倒立摆实验装置图 上面的倒立摆控制实验仪器,包括:摆杆机构、滑块导轨机构基座,其特征在于:其蜗杆通过轴承固定于基座上,与之啮合的涡轮扇的轴通过轴承固定于动座下边,大皮带轮轴一端联接电机,另一端电位计由支座固定于动座上并电机共轴,大皮带轮与2个小皮带轮通过皮带连结,并通过轴承固定于动座之上;滑块固定联接于皮带轮之间的皮带上,同时滑块与动座固定的导轨动配合;摆杆机构通过下摆支座与滑块绞接;控制箱连电位计,电机。 四、实验结果 (1)状态空间极点配置控制实验 K=-34.8233-17.4150 69.4100 12.4717 我们首先打开电源,输入一组实验指导书上指定的极点-10,-10,223.2,223.2 后得到如下提所示的图。 图6 直线一级倒立摆参数修改前稳定时的仿真结果图 我们选择的一组期望的闭环极点是:μ1=-8,μ2=-8,μ3=-2+2*sqrt(3)*i,μ4=-2-2*sqrt(3)*i得到的反馈增益阵为:K=[-34.8299,-17.4150,69.4100,12.4717] 图7 直线一级倒立摆参数修改后扰动时的仿真结果图 添加一扰动后,系统的输出图像如下图所示,该扰动在0.5秒时加到系统中,上升时间为Tr=2s,最大超调量为0.635%,系统在4.5秒后回到最大误差的5%范围内,所以系统调节时间Ts=4s。 系统稳定时的输出图像如下图所示,系统稳定时的输出图像如下图所示,从图中可以看出此时系统的位置Pos稳态误差为0.06,角度Angle稳态误差为-3.16。 添加一扰动后,系统的输出图像如下图所示,该扰动在0.5秒时加到系统中,上升时间为Tr=2s,最大超调量为0.633%,系统在4.5秒后回到最大误差的5%范围内,所以系统调节时间Ts=4s。 实验提高: 1.实验目的 系统启动后,在当前位置给正摆施加一角度扰动,当平衡(摆角近似为零,需要有程序自动判断,不能只用停止若干秒)后,让小车直线运行40厘米,并快速保证平衡(摆角为零).2.实验原理 为了实现上述实验目的,我们使用LQR控制器,对其进行配置Q11=1500,Q33=700,R=5。K=17.3205,得到K=17.3205 8.6802-11.5153-0.5016,因为在上述过程中要求指定位置的快速稳定,并且在移动过程要保持最小角。用一个SWITCH开关来控制选择输入位置,具体的设计图如下图所示: 3.实验结果 实验结果如下图所示 运行1.5秒后,让最大值为0.4的斜坡信号接入,得到Qmax=17.1°,小车能很快的移到指定位置。(3)实验结果分析 1.您的姓名? 2.您的年龄? 3.您的受教育程度 4.您的家庭住址? 5.您的家庭及婚姻状况? 6.您能熟练的使用电脑吗? 7.您最大的爱好是什么? 8.您认为您最大的优点? 9.最大的缺点分别是什么? 10.您以前都有哪些工作经历? 11.您为什么要选择水泥厂化验室的工作而不是别的? 12.一段时间后,您发现您胜任不了这份工作,您会怎么处理? 13.您下班后有急事,领导又要求加班,您怎么处理? 14.您没有违反制度,领导却批评或处罚了您,您怎么处理? 15.在不限定职位的情况下,你认为你适合什么样的工作 ? 16.对这项工作,你有哪些可预见的困难? 17.你希望与什么样的同事一起工作? 18.您认为企业最看重员工的是什么? 19.您希望我们公司能给予您什么?(高薪?尊重?成就感?归属感?其他?) 20.请说出一个现任外国元首的名字。 21.谈一谈您最喜欢的电影。 22.谈一谈您最喜欢的电视剧。 23.谈一谈您认为您做的最有成就感的事情。 24.谈一谈您认为您做的最有糟糕的事情。 25.您的您是一个什么样的人? 关键词:向量组,线性表出,初等行变换,阶梯型矩阵 一问题的提出 向量的线性表出问题是线性代数课程的重点与难点, 在同济大学出版社出版的《线性代数经管类》一书中, 线性表出这部分内容仅限于向量所构造的非齐次线性方程组的系数矩阵为方阵时才可进行判定, 带有一定的局限性。而在同济大学数学系编写的《工程数学线性代数》 (第五版) 一书中, 介绍向量线性表出这一部分内容时, 主要方法是用向量所构造矩阵的秩来判定, 但未详细介绍若能够线性表出, 线性表达式该如何求解。学生在学习这部分内容时略感混乱, 增加了学生学习这部分知识的难度。其实, 掌握这部分内容并不像学生想象得那么困难。本文避开线性方程组内容, 用初等行变换的知识, 轻松地解决向量线性表出的判定这个难点, 同时, 还可直接得到其线性表达式。 二行摆行变换法 下面通过实例来介绍这种方法:如判定β= (3, 0, 5) 是否可由向量组α1= (2, 1, 3) , α2= (1, 2, 0) , α3= (3, 3, 2) 线性表出。 解:将所给的行向量组α1, α2, α3, 与向量β按行排列成矩阵 (注意被表示的向量β放在最后一行) , 把原始向量的序号按顺序标注在矩阵右侧。 由带有向量β的一行为零行可得β-α3-α1+2α2=0⇒β=α3+α1-2α2。 方法介绍: (1) 将所给的行向量组按行排列成矩阵, 原始向量的序号按顺序标注在矩阵右侧。 (2) 对矩阵作初等行变换将其化为阶梯型, 在对矩阵进行初等行变换的同时, 对矩阵后的标注也进行相应的变换。特别注意:在此过程中, 努力尝试将带有向量β的行最简化。 (3) 观察带有向量β的行是否为零行, 若为零行, 向量β可以由其余向量线性表出, 若为非零行, 向量β不可以由其余向量线性表出。 三理论支撑 证明:必要性。设向量β可由向量组α1, α2, …, αn线性表出, 即存在一组数k1, k2, …, kn, 使得关系式:β=k1α1+k2α2+…+knαn。 将m维行向量组α1, α2, …, αn, β按行排列成一个n+1行m列的矩阵A, 对矩阵实施第三种初等行变换, 也就是分别以数-k1, -k2, …, -kn, 乘以α1, α2, …, αn, 再加到矩阵n+1行, 就可以将第n+1行的向量β化为零行, 由此得证。 充分性。在加标注情况下, 设矩阵A经行初等变换化为阶梯型后, β行定有表达式:l1β+l2α1+l3α2+…+ln+1αn (li≠0, i=1, 2, …, n+1) 。 可以看出:向量β可由向量组α1, α2, …, αn线性表出, 由此得证。证毕。 特别提示:矩阵右端标出每个向量所在的位置及每次运算的过程, 目的是为了看出β由向量组线性表出的表达式。 四方法总结 第一, 若向量组未具体给定, 判定是否可以线性表出时, 从定义出发并结合所给条件列出等式后, 进行转化判断。 第二, 若向量组为具体给定时。 (1) 将向量组与被要求判定的向量构造成非齐次线性方程组, 按非齐次线性方程组的求解方法, 若方程有解即可线性表出, 反之不能线性表出。 (2) 将所有行向量按行排列组成矩阵, 被要求判定的向量放在矩阵最后一行。按行摆行变换法进行线性变换, 观察带有向量β的行是否为零行, 若为零行, 向量β可以由其余向量线性表出。若为非零行, 向量β不可以由其余向量线性表出。 这两种方法在判定能否线性表出时可行, 但当我们利用行摆行变换法来处理线性表出问题时, 更方便、简单易操作。 参考文献 [1]石福庆、陈凯、钱辉镜.线性代数辅导 (第二版) [M].北京:中国铁道出版社, 1985 [2]王林、赵云河.行最简形矩阵在线性代数中的应用[J].数学学习与研究, 2013 (5) [3]王文省、姚忠平、钟红心.初等变换的思想方法在高等代数中的运用[J].聊城师院学报 (自然科学版) , 2000 (3) [4]谭洁群、黄秀英.极大无关组求法中一个普遍存在的错误及一种新求法[J].广西农业大学学报, 1996 (2) 2不规范的名称热轧光圆钢筋 固定布线用无护套电缆规范的名称 钢筋混凝土用钢:热轧光圆钢筋 额定电压450V/750V及以下聚氯乙 烯绝缘电缆:固定布线用无护套电 缆家用及类似场所用过电流保护家用及类似场所用过电流保护断所执行的标准名称 钢筋混凝土用钢第1部分:热轧光圆钢筋 额定电压450V/750V及以下聚氯乙烯绝缘电缆第3部分:固定布线用无护套电缆 电气附件:家用及类似场所用过 断路器 点评:不规范的名称所界定的范围大于标准的适用范围。 1、list_init void list_init(List *list, void (*destroy)(void *data)); 返回值void 描述初始化由参数list指定的链表,该函数必须在链表做其他操作之前调用,当调用list_destroy时,destroy参数提供了一种释放动态分配数据的方法,如果链表采用malloc动态分配的数据,destroy应该设置为free来释放这些数据 复杂度O(1) 2、list_destroy void list_destroy(List *list); 返回值void 描述销毁由参数list指定的链表,调用该函数以后任何函数都不能再执行,除非重新执行list_init函数。list_destroy将list中的所有元素都移除,每移除一个元素都会调用此函数 复杂度O(n)n为链表元素的个数 3、list_ins_next int list_ins_next(List *list, ListElmt *element, const void *data); 返回值如果插入元素成功返回0,否则返回-1 描述在指定的list的element元素后面插入一个元素,如果element为NULL,则在链表的头部插入新的元素,该元素包含一个指向data的指针 复杂度O(1) 4、list_rem_next int list_rem_next(List *list, ListElmt *element, void **data); 返回值如果移除元素成功返回0,否则返回-1 描述移除在指定的list的element后面的那个元素,如果element为NULL,则移除链表的头元素,调用返回后,data指向已经移除元素的数据 复杂度O(1) 5、list_size int list_size(const List *list); 返回值如果list中元素的个数 描述这是一个宏,用来计算指定list中元素的个数 复杂度O(1) 6、list_head ListElmt *list_head(const List *list); 返回值指向链表头元素的指针 描述这是一个宏,返回由参数list指定的链表头元素的指针 复杂度O(1) 7、list_tail ListElmt *list_tail(const List *list) ((list)->tail); 返回值指向链表尾元素的指针 描述这是一个宏,返回由参数list指定的链表尾元素的指针 复杂度O(1) 8、list_is_head int list_is_head(const ListElmt *element); 返回值如果element元素是链表头元素返回0,否则返回-1 描述这是一个宏,用来判断element元素是否是list的头元素 复杂度O(1) 9、list_is_tail int list_is_tail(const ListElmt *element); 返回值如果element元素是链表尾元素返回0,否则返回-1 描述这是一个宏,用来判断element元素是否是list的尾元素 复杂度O(1) 10、list_data void *list_data(const ListElmt *element); 返回值结点中保存的数据 描述这是一个宏,返回由element元素中保存的数据 复杂度O(1) 11、list_next ListElmt *list_next(const ListElmt *element) ; 返回值返回element所指定结点的下一个结点 描述这是一个宏,返回链表中element所指定结点的下一个结点 复杂度O(1) 单链表的实现和分析 抽象数据类型的头文件(list.h): #ifndef LIST_H #define LIST_H #include //为单链表的结点定义一个结构体. typedef struct ListElmt_ { void*data;//数据域 struct ListElmt_*next;//指针域 } ListElmt; //为单链表定义一个结构体. typedef struct List_ { intsize;//容量 int(*match)(const void *key1, const void *key2);//匹配函数 void(*destroy)(void *data);//撤销操作 ListElmt*head;//头指针 ListElmt*tail;//尾指针 } List; //公共接口 void list_init(List *list, void (*destroy)(void *data)); void list_destroy(List *list); int list_ins_next(List *list, ListElmt *element, const void *data); int list_rem_next(List *list, ListElmt *element, void **data); #define list_size(list) ((list)->size) #define list_head(list) ((list)->head) #define list_tail(list) ((list)->tail) #define list_is_head(list, element) ((element) == (list)->head ? 1 : 0) #define list_is_tail(element) ((element)->next == NULL ? 1 : 0) #define list_data(element) ((element)->data) #define list_next(element) ((element)->next) #endif 初始化单链表: void list_init(List *list, void (*destroy)(void *data)) {//初始化list list->size = 0; list->destroy = destroy;//设置为定义的析构函数 list->head = NULL; list->tail = NULL; return; } 回收单链表: void list_destroy(List *list) { //移除每一个元素 while (list_size(list) >0) { if (list_rem_next(list, NULL, (void **)&data) == 0 && list->destroy != NULL) {//不断地移除链表的头结点 list->destroy(data);//调用一个用户定义的函数来释放动态分配的数据. } } //现在没有操作了,释放结构体作为预防措施 memset(list, 0, sizeof(List)); return; } 插入新节点作为指定结点的直接后继结点: int list_ins_next(List *list, ListElmt *element, const void *data) { ListElmt *new_element;//为结点动态分配存储空间 if ((new_element = (ListElmt *)malloc(sizeof(ListElmt))) == NULL)//假如分配失败 return -1; // 将元素插入链表 new_element->data = (void *)data; if (element == NULL) { //插入到链表的头部 if (list_size(list) == 0) list->tail = new_element; new_element->next = list->head; list->head = new_element; } else { //插入到除了链表头部以外指定的其他地方 if (element->next == NULL) list->tail = new_element; new_element->next = element->next; element->next = new_element; } list->size++; //表长增加 return 0; } 删除指定结点的直接后继结点: int list_rem_next(List *list, ListElmt *element, void **data) { ListElmt *old_element; //不允许从一个空的list中移除元素. if (list_size(list) == 0) return -1; // 从list中移除元素. if (element == NULL) { // 移除表头的结点. *data = list->head->data; old_element = list->head; list->head = list->head->next; if (list_size(list) == 1)//如果list只有一个元素,则直接删除尾结点 list->tail = NULL; } else { // 移除非头结点. if (element->next == NULL) return -1; *data = element->next->data; old_element = element->next; element->next = element->next->next; if (element->next == NULL)//移除指定结点后,后继为NULL,则用尾结点指向 list->tail = element; } //释放分配的抽象数据类型. free(old_element); //调整list的长度.* list->size--; return 0; } 注意:list_size、list_head、list_tail、list_is_head、list_is_tail、list_data、list_next 这些宏实现了链表中的一些简单操作,它们提供了快速访问和检测结构体成员的能力, 这些操作的时间复杂度都是O(1) 完整的测试代码如下: // Completed on .10.22 21:00 // Language: C99 // // 版权所有(C)codingwu(mail: oskernel@126.com) // 博客地址:www.cnblogs.com/archimedes/ #include #include #include “list.h” static void print_list(const List *list) { ListElmt *element; int *data, i; fprintf(stdout, “List size is %d ”, list_size(list)); i = 0; element = list_head(list); while (1) { data = list_data(element); fprintf(stdout, “list[%03d]=%03d ”, i, *data); i++; if (list_is_tail(element)) break; else element = list_next(element); } return; } int main(int argc, char **argv) { List list; ListElmt *element; int *data, i; //初始化list list_init(&list, free); element = list_head(&list); for (i = 10; i >0; i--) { if ((data = (int *)malloc(sizeof(int))) == NULL) return 1; *data = i; if (list_ins_next(&list, NULL, data) != 0)//逐个插入元素 return 1; } print_list(&list);//打印初始list element = list_head(&list);//指向头结点 for (i = 0; i < 7; i++) element = list_next(element); data = list_data(element); fprintf(stdout, “Removing an element after the one containing %03d ”, *data); if (list_rem_next(&list, element, (void **)&data) != 0)//删除指定结点 return 1; print_list(&list); fprintf(stdout, “Inserting 011 at the tail of the list ”); *data = 11; if (list_ins_next(&list, list_tail(&list), data) != 0)//插入指定结点 return 1; print_list(&list); fprintf(stdout, “Removing an element after the first element ”); element = list_head(&list); if (list_rem_next(&list, element, (void **)&data) != 0) return 1; print_list(&list); fprintf(stdout, “Inserting 012 at the head of the list ”); *data = 12; if (list_ins_next(&list, NULL, data) != 0) return 1; print_list(&list); fprintf(stdout, “Iterating and removing the fourth element ”); element = list_head(&list); element = list_next(element); element = list_next(element); if (list_rem_next(&list, element, (void **)&data) != 0) return 1; print_list(&list); fprintf(stdout, “Inserting 013 after the first element ”); *data = 13; if (list_ins_next(&list, list_head(&list), data) != 0) return 1; print_list(&list); i = list_is_head(&list, list_head(&list)); fprintf(stdout, “Testing list_is_head...Value=%d (1=OK) ”, i); i = list_is_head(&list, list_tail(&list)); fprintf(stdout, “Testing list_is_head...Value=%d (0=OK) ”, i); i = list_is_tail(list_tail(&list)); fprintf(stdout, “Testing list_is_tail...Value=%d (1=OK) ”, i); i = list_is_tail(list_head(&list)); fprintf(stdout, “Testing list_is_tail...Value=%d (0=OK) ”, i); fprintf(stdout, “Destroying the list ”); list_destroy(&list); return 0; 【数据结构实验线性表】推荐阅读: 福州大学数据结构实验报告-线性表06-24 《数据结构》实验报告——排序05-30 实验数据结构与算法06-23 数据结构上机实验题02-15 北邮数据结构实验三04-16 数据结构图实验总结03-26 数据结构实验3报告doc09-06 数据结构实验c语言版04-10 数据结构二叉树操作验证实验报告12-07 数据结构和算法06-10数据结构实验线性表 篇2
数据结构实验线性表 篇3
线性系统倒立摆实验 篇4
实验室应聘人员问答表 篇5
关于向量的线性表出方法的比较 篇6
实验室资质认定项目表案例 篇7
C实现通用数据结构单链表 篇8