线性表合并运算

线性表合并运算
线性表合并运算

#include

#include

#define INITSIZE 100 //线性表存储空间的初始分配量

#define LISTINCREMENT 10 //线性表存储空间的分配增量

#define OK 1

#define ERROR 0

#define OVERFLOW -1

typedef int ElemType;

typedef int Status;

typedef struct{

ElemType *elem; //存储空间基址

int length; //当前长度

int listsize; //当前分配的存储量(以sizeof(ElemType)为单位)

}SqList;

Status InitList(SqList &L)

{//构造一个空的顺序表L.

L.elem=(ElemType*)malloc(100*sizeof(ElemType));

if(!L.elem)exit(OVERFLOW);

L.length=0;

L.listsize=INITSIZE;

return(OK);

}

void Assign(SqList &L)

{//为顺序表L的各元素赋值。

int i,N;

printf("Please input the Number of the SqList:");

scanf("%d",&N);

printf("Please input the elements:");

for(i=0;i

scanf("%d",&L.elem[i]);

L.length++;

}

}

void MergeList(SqList La,SqList Lb,SqList &Lc){

//已知线性表La和Lb中的数据元素按值非递减排列

//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列ElemType *pa,*pb,*pc,*pa_last,*pb_last;

pa=La.elem;

pb=Lb.elem;

Lc.listsize=Lc.length=La.length+Lb.length;

pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType));

if(!Lc.elem)exit(OVERFLOW);//存储分配失败

pa_last=La.elem+La.length-1;

pb_last=Lb.elem+Lb.length-1;

while(pa<=pa_last&&pb<=pb_last){//归并

if(*pa<=*pb) *pc++=*pa++;

else *pc++=*pb++;

}

while(pa<=pa_last) *pc++=*pa++;//插入La的剩余元素while(pb<=pb_last) *pc++=*pb++;//插入Lb的剩余元素}//MergeList_Sq

void ListTraverse(SqList L){

//遍历顺序表L

int i;

for(i=0;i<=L.length-1;i++);

printf("%d ",L.elem[i]);

printf("\n");

printf("the length is:%d\n",L.length);

}

void main(){

SqList L,L1,L2;

InitList(L1);

Assign(L1);

InitList(L2);

Assign(L2);

MergeList(L1,L2,L);

ListTraverse( L);

}

五、运行结果

Please input the Number of the SqList:5

Please input the elements:2 4 6 8 9

Please input the Number of the SqList:8

Please input the elements:1 3 5 12 34 36 41 46

1 2 3 4 5 6 8 9 12 34 36 41 46

the length is:13

两个线性表合并成一个线性表

#include #include //节点结构 struct LinkList { int data; struct LinkList * next; }; void main() { int a[8]={1,3,4,7,7,8,34,45}; int b[9]={1,2,4,7,9,12,33,43,56}; LinkList *pa=NULL; LinkList *pb=NULL; LinkList *pc=NULL; LinkList *la=NULL;//la,lb,lc保存链表首地址 LinkList *lb=NULL; LinkList *lc=NULL; // 初始化单链表 for(int i=7;i>=0;i--) { pa=(LinkList *) malloc(sizeof(struct LinkList)); pa->data=a[i]; pa->next=la; la=pa; } for(int j=8;j>=0;j--) { pb=(LinkList *) malloc(sizeof(struct LinkList)); pb->data=b[j]; pb->next = lb; lb=pb; } lc=pc=(LinkList *) malloc(sizeof(struct LinkList));//LC指向单链表的头节点 //递增排序 while(pa && pb) {

if( (pa->data) <= (pb->data) ) { pc->next=pa; pc=pc->next; pa=pa->next; } else { pc->next=pb; pc=pc->next; pb=pb->next; } } if(pa) { pc->next=pa; } if(pb) { pc->next=pb; } pc=lc->next; while(pc) { printf("%d\t",*pc); pc=pc->next; } printf("\n"); }

线性表顺序存储结构上的基本运算

实验项目名称:线性表的顺序存储结构上的基本运算 (所属课程:数据结构--用C语言描述) 院系:计算机科学与信息工程学院专业班级:网络工程 姓名:000000 学号:0000000000 实验日期:2016.10.20 实验地点:A-06 406 合作者:指导教师:孙高飞 本实验项目成绩:教师签字:日期: (以下为实验报告正文) 一、实验目的 本次实验的目的掌握顺序表的存储结构形式及其描述和基本运算的实现;掌握动 态链表结构及相关算法设计 实验要求:输入和验证程序例题。正确调试程序,记录程序运行结果。完成实验报 告。 二、实验条件 Windows7系统的电脑,vc++6.0软件,书本《数据结构--用c语言描述》 三、实验内容 3.1 根据41页代码,用c语言定义线性表的顺序存储结构。 3.2 根据42页算法2.1实现顺序表的按内容查找。 3.3 根据43页算法2.2实现顺序表的插入运算。 3.4 根据45页算法2.3实现顺序表的删除运算。 四、实验步骤 3.2实验步骤 (1)编写头文件,创建ElemType。 (2)根据根据41页代码,“用c语言定义线性表的顺序存储结构”定义顺序表。

(3)根据42页算法2.1实现顺序表的按内容查找,创建Locate函数。 (4)创建main函数,输入SeqList L的数据元素。 (5)输入要查找的数据元素的值,调用Locate函数,输出结果。 3.3实验步骤 (1)编写头文件,创建ElemType。 (2)根据41页代码,“用c语言定义线性表的顺序存储结构”定义顺序表。 (3)根据43页算法2.2实现顺序表的插入运算,创建InsList函数。 (4)创建printList函数,逐项输出顺序表内的元素及顺序表元素的个数。 (5)创建main函数,输入插入的元素和其位置,调用printLinst函数输出顺序表,调用IntList函数,再次调用printLinst函数输出顺序表。 3.4实验步骤 (1)编写头文件,创建ElemType。 (2)根据根据41页代码,“用c语言定义线性表的顺序存储结构”定义顺序表。 (3)根据45页算法2.3实现顺序表的删除运算,创建DelList函数。 (4)创建printList函数,逐项输出顺序表内的元素及顺序表元素的个数。 (5)创建main函数,输入删除元素的位置,调用printLinst函数输出顺序表,调用DelList函数,再次调用printLinst函数输出顺序表。 五、实验结果 (1)实验3.2顺序表的按内容查找 # include typedef int Elemtype; typedef struct{ Elemtype elem[100]; int last; }SeqList; int Locate(SeqList L,Elemtype e){ int i; i=0;

线性表的基本操作

Status initlist_sq(sqlist &L)//构造一个空的线性表L { L.elem=(elemtype *)malloc(list_init_size * sizeof(elemtype)); if(!L.elem)exit(OVERFLOW); L.length=0; L.listsize= list_init_size; return OK; }//initlist_sq Status destroylist_sq(sqlist &L)//销毁线性表L { L.length=0; L.listsize=0; free(L.elem); return OK; }//destroylist_sq Status clearlist_sq(sqlist &L)//将线性表L重置为空表 { L.length=0; return OK; }//clearlist_sq Status listempty_sq(sqlist L)//判断线性表L是否为空表,是返回TRUE,否返回FALSE { if(L.length==0) return TRUE; else return FALSE; }//listempty_sq Status listlength_sq(sqlist L)//返回线性表L中数据元素个数 { return 0; }//listlength_sq Status getelem_sq(sqlist L,int i,elemtype &e)//用e返回L中的第i个数据元素的值{ e=L.elem[i-1]; return OK;

}//getelem_sq Status locateelem_sq(sqlist L,elemtype e,compare())//在顺序线性表L中查找第1个值与e满足compare()的元素的位序 //若找到,则返回其在L中的位序,否则返回0 { int i=1; elemtype *p=L.elem; while(i<=L.length && !(*compare)(*p++,e)) ++i; if(i<=L.length) return i; else return 0; }//locateelem_sq Status priorelem_sq(sqlist L,elemtype cur_e,elemtype &pre_e) //若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱, //否则操作失败,pre_e无定义 { int i=1; elemtype *p; p=L.elem; for(i=1;i<=L.length;i++) { if((*p++==cur_e) && i!=1) pre_e=L.length[i-1]; else return ERROR; } return OK; }//priorelem_sq Status nextelem_sq(sqlist L,elemtype cur_e,elemtype &next_e) //若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继, //否则操作失败,next_e无定义 { int i=1; elemtype *p; p=L.elem; for(i=1;i<=L.length;i++)

线性表的实现及操作(二)

实验一、线性表的实现及操作(一) 一、实验目的 了解和掌握线性表的顺序存储结构;掌握用C语言上机调试线性表的基本方法;掌握线性表的基本操作:插入、删除、查找以及线性表合并等运算在顺序存储结构和链接存储结构上的运算,以及对相应算法的性能分析。 二、实验要求 给定一段程序代码,程序代码所完成的功能为:(1)建立一个线性表;(2)依次输入数据元素1,2,3,4,5,6,7,8,9,10;(3)删除数据元素5;(4)依次显示当前线性表中的数据元素。假设该线性表的数据元素个数在最坏情况下不会超过100个,要求使用顺序表。 程序中有3处错误的地方,有标识,属于逻辑错误,对照书中的代码仔细分析后,要求同学们修改错误的代码,修改后上机调试得到正确的运行结果。 (1)需求分析: 这份实验报告为所有必做题的实验报告。包括实验一顺序表建立、插入、删除等基本操作,实验二单链表的建立、插入、删除等基本操作,实验四二叉树的基本操作:树的建立、前序、中序、后序遍历及实验六图的遍历:深度优先和广度优先。这四份基础性的实验为改错性质,将每个实验题目中的错误改正过来并通过调试,有助于对基础知识的理解与强化记忆。

(2)概要设计: 实验一为对顺序线性表实现插入,删除,查找等基本操作。 需要用到的语句包括void ListInitiate(SeqList *L) int ListInsert(SeqList *L, int i, DataType x) int ListDelete(SeqList *L, int i, DataType *x) int ListGet(SeqList L, int i, DataType *x)等。 实验二是对单链表进行建立,插入,删除等基本操作。 需要的语句为void ListInitiate(SeqList *L) int ListInsert(SeqList *L, int i, DataType x) int ListDelete(SeqList *L, int i, DataType *x) int ListGet(SeqList L, int i, DataType *x)等。 实验四为二叉树,要求建立一个二叉树,并实现前序,中序及后序的遍历。所需语句包括void ListInitiate(SeqList *L) int ListInsert(SeqList *L, int i, DataType x) int ListDelete(SeqList *L, int i, DataType *x) int ListGet(SeqList L, int i, DataType *x)等。 实验六的内容是图的遍历包括邻接矩阵和邻接链表两种方法。 三、程序代码 (更正后的代码) #include #define MaxSize 100 typedef int DataType; typedef struct { DataType list[MaxSize]; int size;

线性代数基本定理-新版.pdf

线性代数基本定理一、矩阵的运算 1.不可逆矩阵的运算不满足消去律AB=O,A 也可以不等于 O 11-1-1?è???÷1-1-11?è???÷=0000?è?? ? ÷ 2.矩阵不可交换 (A+B)2=A 2+AB+BA+B 2 (AB)k =ABABABAB ...A B 3.常被忽略的矩阵运算规则 (A+B)T =A T +B T (l A)T =l A T

4.反称矩阵对角线元素全为0 4.矩阵逆运算的简便运算 (diag(a 1,a 2 ,...,a n ))-1=diag( 1 a 1 , 1 a 2 ,..., 1 a n ) (kA)-1=1 k A-1 方法 1.特殊矩阵的乘法 A.对角矩阵乘以对角矩阵,结果仍为对角矩阵。且: B.上三角矩阵乘以上三角矩阵,结果为上三角矩阵2.矩阵等价的判断 A@B?R(A)=R(B) 任何矩阵等价于其标准型

3.左乘初等矩阵为行变换,右乘初等矩阵为列变换如:m*n 的矩阵,左乘 m 阶为行变换,右乘 n 阶为列变换 4. 给矩阵多项式求矩阵的逆或证明某个矩阵可逆如:A 2 -A-2I =O ,证明(A+2I)可逆。把2I 项挪到等式右边,左边凑出含有 A+2I 的一个多项式, 在确保A 平方项与 A 项的系数分别为原式的系数情况下,看I 项多加或少加了几个。5.矩阵的分块进行计算加法:分块方法完全相同 矩阵乘法(以A*B 为例):A 的列的分法要与B 行的分法一 致,如: 如红线所示:左边矩阵列分块在第 2列与第3列之间,那么,右边矩阵分 块在第二行与第三行之间 1-1003-1000100002-1 é? êêêêù?úúúú1000-1000013-1021 4 é? ê êêêù? úúúú

实现顺序表各种基本运算的算法

实现顺序表各种基本运算的算法 要求:编写一个程序(algo2_1.cpp)实现顺序表的各种基本操作,并在此基础上设计一个主程序(exp2_1.cpp)完成如下功能: (1)初始化顺序表L (2)依次采用尾插法插入a,b,c,d,e元素 (3)输出顺序表L (4)输出顺序表L的长度 (5)判断顺序表L是否为空 (6)输出顺序表L的第3个元素 (7)输出元素a的位置 (8)在第4个元素位置上插入f元素 (9)输出顺序表L (10)删除L的第3个元素 (11)输出顺序表L (12)释放顺序表L /*文件名:exp2-1.cpp*/ #include #include #define MaxSize 50 typedef char ElemType; typedef struct { ElemType elem[MaxSize]; int length; } SqList; extern void InitList(SqList *&L); extern void DestroyList(SqList *L); extern int ListEmpty(SqList *L); extern int ListLength(SqList *L); extern void DispList(SqList *L); extern int GetElem(SqList *L,int i,ElemType &e); extern int LocateElem(SqList *L, ElemType e); extern int ListInsert(SqList *&L,int i,ElemType e); extern int ListDelete(SqList *&L,int i,ElemType &e); void main() { SqList *L; ElemType e; printf("(1)初始化顺序表L\n"); InitList(L); printf("(2)依次采用尾插法插入a,b,c,d,e元素\n"); ListInsert(L,1,'a'); ListInsert(L,2,'b');

数据结构_实验1_线性表的基本操作

实验1 线性表的基本操作 一、需求分析 目的: 掌握线性表运算与存储概念,并对线性表进行基本操作。 1.初始化线性表; 2.向链表中特定位置插入数据; 3.删除链表中特定的数据; 4.查找链表中的容; 5.销毁单链表释放空间; 二、概要设计 ●基础题 主要函数: 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 实验步骤: 1,初始化顺序表 2,调用插入函数 3,在顺序表中查找指定的元素 4,在顺序表中删除指定的元素 5,在顺序表中删除指定位置的元素 6,遍历并输出顺序表 ●提高题

要求以较高的效率实现删除线性表中元素值在x到y(x和y自定义)之间的所有元素 方法: 按顺序取出元素并与x、y比较,若小于x且大于y,则存进新表中。 编程实现将两个有序的线性表进行合并,要求同样的数据元素只出现一次。 方法: 分别按顺序取出L1,L2的元素并进行比较,若相等则将L1元素放进L中,否则将L 1,L2元素按顺序放进L。 本程序主要包含7个函数 主函数main() 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 提高题的程序 void Combine(List* L1,List* L2,List* L) void DeleteList3(List* L,int x,int y) 二、详细设计 初始化线性表InitList(List* L,int ms) void InitList(List* L,int ms) { L->list=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); L->size=0; L->MAXSIZE=LIST_INIT_SIZE;

线性表的插入和删除

实验一线性表的基本操作 一、实验目的 掌握线性表的基本操作,插入、删除、查找,以及线性表合并等运算在顺序存储结构上的运算。 二、实验要求 1、认真阅读和掌握本实验的程序。 2、上机运行本程序。 3、保存和打印出程序的运行结果,并结合程序进行分析。 4、按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单 和运行结果 三、实验内容 线性表基本操作的实现。 算法描述:对每一个算法,要写出算法的中文描述。本实验中要求写出在第i 个结点前插入数据为x的结点、删除指定结点、创建一个线性表、打印线性表的算法描述。 四、程序清单 1、sqlist.h文件清单: #include "stdio.h" #include "malloc.h" #define null 0 #define maxsize 1024 typedef char datatype; typedef struct { datatype data[maxsize]; int last; }sequenlist; /*在第i个结点前插入元素x(note:元素从0始计数)*/ int insert(sequenlist *L, datatype x,int i) { int j; if (L->last==maxsize-1)/*如果原线性表已经满了*/ { printf("overflow"); return 0; } else if ((i<0)||(i>L->last)) /*如果输入的i值超出范围*/ { printf("error,please input the right 'i'"); return 0; } else { for(j=L->last; j>=i; j--) /*从第i个元素起,每个元素后移一位*/ L->data[j+1]=L->data[j];

实现顺序表的各种基本运算

实现顺序表的各种基本运算 一、实验目的 了解顺序表的结构特点及有关概念,掌握顺序表的各种基本操作算法思想及其实现。 二、实验内容 编写一个程序,实现顺序表的各种基本运算: 1、初始化顺序表; 2、顺序表的插入; 3、顺序表的输出; 4、求顺序表的长度 5、判断顺序表是否为空; 6、输出顺序表的第i位置的个元素; 7、在顺序表中查找一个给定元素在表中的位置; 8、顺序表的删除;9、释放顺序表 三、算法思想与算法描述简图

四、实验步骤与算法实现 #include<> #include<> #define MaxSize 50 typedef char ElemType; typedef struct {ElemType data[MaxSize]; int length; }SqList;//顺序表类型的定义 void InitList(SqList*&L)//初始化顺序表L {L=(SqList*)malloc(sizeof(SqList)); L->length=0; } void DestroyList(SqList*&L)//释放顺序表L {free(L); } int ListEmpty(SqList*L)//判断顺序表L是否为空集{return(L->length==0); } int Listlength(SqList*L)//返回顺序表L的元素个数{return(L->length); } void DispList(SqList*L)//输出顺序表L {int i; if(ListEmpty(L))return; for(i=0;ilength;i++) printf("%c",L->data[i]);

线性表的基本操作讲解

实验二线性表的基本操作 一、实验目的 1.掌握用C++/C语言调试程序的基本方法。 2.掌握线性表的顺序存储和链式存储的基本运算,如插入、删除等。 二、实验要求 1.C++/C完成算法设计和程序设计并上机调试通过。 2.撰写实验报告,提供实验结果和数据。 3.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。 三、实验内容: 1. 分析并运行以下各子程序的主要功能。 程序1:顺序存储的线性表和运算 #include #define MAXSIZE 100 int list[MAXSIZE]; int n; /*insert in a seqlist*/ int sq_insert(int list[], int *p_n, int i, int x) {int j; if (i<0 || i>*p_n) return(1); if (*p_n==MAXSIZE) return(2); for (j=*p_n+1; j>i; j--) list[j]=list[j-1]; list[i]=x; (*p_n)++; return(0); } /*delete in a seq list*/ int sq_delete(int list[], int *p_n, int i) {int j; if (i<0 || i>=*p_n) return(1); for (j = i+1; j<=*p_n; j++) list[j-1] = list[j]; (*p_n)--; return(0); } void main() {int i,x,temp; printf("please input the number for n\n"); printf("n="); scanf("%d",&n); for (i=0; i<=n; i++) {printf("list[%d]=",i); scanf("%d",&list[i]);}

实验一 顺序存储线性表的基本运算

实验一VC++软件的熟悉与使用 一、实验目的 1、熟悉VC++控制台程序的建立、编辑、编译、运行步骤。 2、熟悉VC++环境下调试的基本方法。 二、实验原理 在VC++6.0 下建立、编译、调试并运行一个控制台程序,程序的功能描述是:有n个人(1≤n≤100)围成一圈,顺序排号(1~n)。从第一个人开始报数(从1到5报数),凡报到5的人退出圈子,余下的人继续报数,编写程序,实现按退出圈子的先后顺序输出这个序列。程序源代码如下: #include #include void main( ) { int i,k,m,n,number[100],*p; printf(“input count of person:n=”); scanf(“%d”,&n); if(n>100) { printf(“error\n”); exit (0); } p=number; for(i=0;i

{ if(*(p+i)!=0) k++; if(k==5) { printf(“%d:%d->”,m+1,*(p+i)); *(p+i)=0; k=0; m++; if(m%8==0) printf(“\n”); } i++; if (i==n) i=0; } while(*p==0) p++; printf(“%d:%d”,m+1,*p); } 三、实验仪器和设备 1、PC微机 2、Microsoft VC++6.0 四、预习要求 1、根据源程序,画出流程图。 2、C语言源程序的编写方法。 五、实验内容及步骤 1、编写一个控制台程序 在VC++6.0 下建立、编译并运行一个控制台程序,程序的功能描述是:有n个人(1≤n≤100)围成一圈,顺序排号(1~n)。从第一个人开始报数(从1到5报数),凡到5的人退出圈子,余下的人继续报数,编写程序,实现按退出

数据结构与算法(线性表)练习题

三、写一个算法合并两个已排序的线性表。(用两种方法:数组表示的线性表(顺序表)和指针表示的线性表(链表)) 要求:1、定义线性表节点的结构,并定义节点的型和位置的型。 2、定义线性表的基本操作 3、在1,2的基础上,完成本题。 4、在main 函数中进行测试:先构建两个有序的线性表,然后合并这两个线性表。 四、已知一个单向链表,试给出复制该链表的算法。 要求:1、定义线性表的节点的结构以及节点的型和位置的型。 2、定义线性表的基本操作 3、在1,2的基础上,完成本题。 4、在main 函数中进行测试:先构建一个线性表,并定义一个空线性表,然后进行复制。 五、写出从一个带表头的单链表中删除其值等于给定值x 的结点的算法函数: int delete(LIST &L, int x);如果x 在该链表中,则删除对应结点,并返回其在链表中的位置(逻辑位置,第一个结点的逻辑位置为1),否则返回-1。 要求:1、定义线性表的节点的结构以及节点的型和位置的型。 2、定义线性表的基本操作 3、在1,2的基础上,完成本题。 4、在main 函数中进行测试:先构建一个线性表,然后调用函数删除值等于给定值的节点。 六、写出一个将两个静态链表(属于同一个存储池)合并的算法函数: void Merge(cursor M, cursor N); 合并的方法是将N 链表中的所有结点添加到M 链表的后面,并将N 链表的表头结点添加到空闲结点链表中。 要求:1、定义静态链表的结点的结构以及结点的型SPACE 以及位置(position )和游标(cursor )的型。 2、定义静态链表的基本操作:void Initialize(); 初始化,将所有存储池中的结点设置为空闲;cursor GetNode(); 从空闲链中获取一个结点;void FreeNode(cursor q); 将结点q 加入到空闲链; void Insert ( elementtype x, position p, cursor M ); 在链表M 中的位置为p 的元素后面添加一个值为x 的结点;void Delete (cursor M, position p ); 在链表M 中删除位置为p 的元素的后一个元素。 3、在1、2的基础上完成本题。 4、在main 函数中进行测试:先构建一个存储池,然后在该存储池中创建两个静态 表,最后将这两个静态表合并。 七、利用指针表示的线性表(链表)表示一个多项式,并实现两个多项式的相加和相乘运算。假设多项式形式为:11 11...)(e e m e m x a x a t a x A m m +++= -- 其中,系数a i ≠0,指数e i 满足e m >e m-1>…>e 2>e 1>=0。 要求:1、定义多项式每一项的结构。 2、定义两个多项式的相加和相乘运算函数。 3、在main 函数中,构建两个多项式,并测试相加和相乘运算。

线性代数知识点总结

《线性代数》复习提纲第一部分:基本要求(计算方面) 四阶行列式的计算; N阶特殊行列式的计算(如有行和、列和相等); 矩阵的运算(包括加、减、数乘、乘法、转置、逆等的混合运算); 求矩阵的秩、逆(两种方法);解矩阵方程; 含参数的线性方程组解的情况的讨论; 齐次、非齐次线性方程组的求解(包括唯一、无穷多解); 讨论一个向量能否用和向量组线性表示; 讨论或证明向量组的相关性; 求向量组的极大无关组,并将多余向量用极大无关组线性表示; 将无关组正交化、单位化; 求方阵的特征值和特征向量; 讨论方阵能否对角化,如能,要能写出相似变换的矩阵及对角阵; 通过正交相似变换(正交矩阵)将对称矩阵对角化; 写出二次型的矩阵,并将二次型标准化,写出变换矩阵; 判定二次型或对称矩阵的正定性。 第二部分:基本知识 一、行列式 1.行列式的定义 用n^2个元素aij组成的记号称为n阶行列式。 (1)它表示所有可能的取自不同行不同列的n个元素乘积的代数和; (2)展开式共有n!项,其中符号正负各半; 2.行列式的计算 一阶|α|=α行列式,二、三阶行列式有对角线法则; N阶(n>=3)行列式的计算:降阶法 定理:n阶行列式的值等于它的任意一行(列)的各元素与其对应的代数余子式乘积的和。

方法:选取比较简单的一行(列),保保留一个非零元素,其余元素化为0,利用定理展开降阶。 特殊情况 上、下三角形行列式、对角形行列式的值等于主对角线上元素的乘积; (2)行列式值为0的几种情况: Ⅰ行列式某行(列)元素全为0; Ⅱ行列式某行(列)的对应元素相同; Ⅲ行列式某行(列)的元素对应成比例; Ⅳ奇数阶的反对称行列式。 二.矩阵 1.矩阵的基本概念(表示符号、一些特殊矩阵――如单位矩阵、对角、对称矩阵等); 2.矩阵的运算 (1)加减、数乘、乘法运算的条件、结果; (2)关于乘法的几个结论: ①矩阵乘法一般不满足交换律(若AB=BA,称A、B是可交换矩阵); ②矩阵乘法一般不满足消去律、零因式不存在; ③若A、B为同阶方阵,则|AB|=|A|*|B|; ④|kA|=k^n|A| 3.矩阵的秩 (1)定义非零子式的最大阶数称为矩阵的秩; (2)秩的求法一般不用定义求,而用下面结论: 矩阵的初等变换不改变矩阵的秩;阶梯形矩阵的秩等于非零行的个数(每行的第一个非零元所在列,从此元开始往下全为0的矩阵称为行阶梯阵)。 求秩:利用初等变换将矩阵化为阶梯阵得秩。 4.逆矩阵 (1)定义:A、B为n阶方阵,若AB=BA=I,称A可逆,B是A的逆矩阵(满足半边也成立); (2)性质:(AB)^-1=(B^-1)*(A^-1),(A')^-1=(A^-1)';(A B的逆矩阵,你懂的)(注意顺序)

线性表的合并

线性表的合并 #include #include #define listinitsize 100 #define OVERFLOW -1 /*线性表的定义*/ typedefstructsqlist { int *a; int length; intlistsize; }sqlist sqlistla,lb,lc; /*建立一个空表*/ sqlistinitlist() { sqlist l; l.a=(int*)malloc(listinitsize*sizeof(int)); if(!l.a) exit(OVERFLOW); l.length=0; l.listsize=listinitsize; return l; } sqlistcreatlist(sqlistl,intnum) { int j; int p; for(j=1;j<=num;j++) { scanf("%d",&p); la.a[j]=p; la.length++; } } /*合并两线性表*/ sqlistaddlist( sqlist la, sqlistlb, sqlistlc)

{ inti=1,j=1,k=1; while(i<=la.length&& j<=lb.length) { if(la.a[i]<=lb.a[j]) { lc.a[k]=lb.a[i]; i++; k++; } { lc.a[k]=la.a[j]; j++; k++; } } while(i<=la.length) { lc.a[k]=la.a[i]; k++; i++; } while(j<=lb.length) { lc.a[k]=lb.a[j]; k++; j++; } lc.length=k-1; returnlc; } /*打印线性表*/ voidprintlist(sqlist l) { inti=1; for(i=1;i<=l.length;i++) printf("%6d",l.a[i]);

顺序表的建立及其基本操作技巧

山东师范大学 实验报告 课程:数据结构班级:2016级通信2班实验序号: 1 姓名:韩明达 学号: 201611030230 实验日期:9.17 题目: 顺序表的建立和运算 一、实验目的和要求 (1)熟悉C语言的上机环境,进一步掌握C语言的结构特点。 (2)掌握线性表的顺序存储结构的定义及基本运算 二、实验环境 Windows10,Visual Studio 2017 三、实验内容及实施 实验内容 1、建立一个顺序表,输入n个元素并输出; 2、查找线性表中的最大元素并输出; 3、在线性表的第i个元素前插入一个正整数x; 4、删除线性表中的第j个元素; 5、将线性表中的元素按升序排列; 【程序流程图】

【程序】 #include #include using namespace std; #define MAXSIZE 100 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef struct { //定义顺序表结构 int data[MAXSIZE]; //存储空间的基地址; int length; //当前表长 }SqList; int InitList(SqList &L) //初始化顺序表 { L.length = 0; //当前长度为0 return OK; } void ShowList(SqList &L) //显示顺序表 { cout << "您构建的顺序表为:" << endl; //提示int i; for (i = 0; i < L.length; i++) { cout << L.data[i] << " ";

线性表的操作算法讲解

数据结构实验报告 课题名称:线性表的操作算法姓名: 班级: 学号:

一、内容提要 1、掌握使用cFree上机调试线性表的基本方法; 2、分别用数组和链表作为存储结构,实现线性表的插入、删除、查找、排序、合并等操作。 二、实验要求 1、设计对线性表进行链式存储操作的内容; 2、写出相应程序; 3、保存和打印出程序的运行结果,并结合程序进行分析; 三、实验目的 1、理解数据结构中单链表的定义和建立。 2、掌握单链表中结点结构的C语言描述。 3、熟练掌握单链表的插入、删除、查找、排序、合并等算法的设计与C语言实现。 4、将理论与实际相结合,切实提高自己的逻辑能力和动手能力。 四、算法流程图 开始 创建 遍插删查查找查找合 历入除找前驱后继并 主函数 输出

结束 五、概要设计 1.界面设置 1.建立顺序表,输入数据元素 2.输出顺序表 3.在i位置插入元素e 4.删除第i个元素,返回其值 5.查找值为e的元素 6.清空顺序表 7.输出指定元素的前驱元素 8.输出指定元素的后继元素 9.将两个非递减的线性表la和lb合并成一个新的非递减的线性表0.结束程序运行 请输入您的选择(1,2,3,4,5,6,7,8,9,0) 2.功能函数说明与定义 //加载头文件 #include #include #define MAXSIZE 100 typedef int ElemType; //定义结构体类型 typedef struct {ElemType a[MAXSIZE]; int length; }SqList; SqList a,la,lb,lc; //以下是9个函数的声明 //顺序表的初始化-置空表 void init(SqList *slt); //创建顺序表 void creat_list(SqList *L); //输出顺序表 void out_list(SqList L); //插入 void insert_sq(SqList *L,int i,ElemType e); //删除 ElemType delete_sq(SqList *L,int i);

线性代数的基本运算

111 第5章 线性代数的基本运算 本章学习的主要目的: 1 复习线性代数中有关行列式、矩阵、矩阵初等变换、向量的线性相关性、线性方程组的求解、相似矩阵及二次型的相关知识. 2学会用MatLab 软件进行行列式的计算、矩阵的基本运算、矩阵初等变换、向量的线性相关性的判别、线性方程组的求解、二次型化标准形的运算. 5.1 行列式 5.1.1 n 阶行列式定义 由2n 个元素),,2,1,(n j i a ij 组成的记号 D=nn n n n n a a a a a a a a a 212222111211 称为n 阶行列式.其值是所有取自不同行不同列的n 个元素的乘积n np 2p 21p 1a a a 的代数和,各项的符号由n 级排列n p p p 21决定,即

112 D= ∑ -n p p p n p p p 21n np 2 p 21 p 1) 21( a a a )1(τ, 其中 ∑n p p p 21表示对所有n 级排列求和, ) ,,,(21n p p p τ是排列 n p p p 21的逆序数. 5.1.2 行列式的性质 (1) 行列式与它的转置行列式相等. (2) 互换行列式的两行(列),行列式变号. (3) 若行列式有两行(列)完全相同,则此行列式为零. (4) 行列式的某一行(列)中所有的元素都乘以同一数k,等于用数k 乘此行列式. (5) 若行列式有两行(列)元素成比例,则此行列式为零. (6) 若行列式的某一列(行)的元素是两数的和,则此行列式等 于对应两个行列式之和.即 nn n n ni n n i i nn n n ni n n i i nn n n ni ni n n i i i i a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a 21'2 1 '22221 '11211212 1 22221 112 1121'2 1 '222221'111211+ =+++ (7) 若行列式的某一行(列)的各元素乘以同一数加到另一行(列)对应的元素上去,行列式不变.

数据结构-实验报告顺序表基本运算

(封面) 学生实验报告 学院:国际经贸学院 课程名称:数据结构 专业班级: 09电子商务 姓名: 学号:

学生实验报告 (经管类专业用) 一、实验目的及要求: 1、目的 通过实验,实现顺序表的各种基本运算。 2、内容及要求 编写一个程序,实现顺序表的各种基本运算,并在此基础上设计一个主程序完成下列功能: (1) 初始化顺序表L (2) 依次采用尾插法插入a,b,c,d,e (3) 输出顺序表L (4) 输出顺序表L长度; (5) 判断顺序表L是否为空; (6) 判断顺序表L 的第3个元素; (7) 输出元素‘a’的位置; (8) 在第4个元素位置上插入‘f’元素; (9) 输出顺序表L (10) 删除L的第3个元素; (11) 输出顺序表L (12) 释放顺序表L 二、仪器用具:

三、实验方法与步骤: 一、查阅顺序表等相关资料,熟悉顺序表基本概念和流程 二、“开展”顺序表实验流程 三、整理实验数据和文档,总结实验的过程,编写实验报告 四、实验结果与数据处理: 1、顺序表的代码: #include #include #define MaxSize 50 typedef char ElemType; typedef struct { ElemType data[MaxSize]; int length; } SqList; void InitList(SqList *&L) { L=(SqList *)malloc(sizeof(SqList)); L->length=0; } void DestroyList(SqList *L) { free(L); } int ListEmpty(SqList *L) { return(L->length==0); } int ListLength(SqList *L) { return(L->length); }

数据结构--线性表的基本运算及多项式的算术运算

数据结构:线性表的基本运算及多项式的算术运算 一、实验目的和要求 实现顺序表和单链表的基本运算,多项式的加法和乘法算术运算。 要求: 能够正确演示线性表的查找、插入、删除运算。实现多项式的加法和乘法运算操作。 二、实验环境(实验设备) X64架构计算机一台,Windows 7操作系统, IDE: Dev C++ 5.11 编译器: gcc 4.9.2 64bit 二、实验原理及内容 程序一:实现顺序表和单链表的实现 本程序包含了四个文件,分别是LinearListMain.cpp,linearlist.h,seqlist.h,singlelist.h。分别是主程序,线性表抽象类,顺序储存线性表的实现,链表储存顺序表的实现。 文件之间的关系图:

本程序一共包含了三个类:分别是LinearList(线性表抽象类),SeqList(顺序储存的线性表),SingleList(链表储存的线性表)。类与类之间的关系图如下: 其实,抽象类LinearList规定了公共接口。分别派生了SeqList类和SingleList。

SingleList类与SingleList类分别实现了LinearList类中的所有接口。 程序代码以及分析: Linearlist类: #include using namespace std; template class LinearList { protected: int n; //线性表的长度 public: virtual bool IsEmpty() const=0; //判读是否是空线性表 virtual int Length() const=0; //返回长度 virtual bool Find(int i,T& x) const=0; //将下标为i的元素储存在x中,成功返回true,否则返回false virtual int Search(T x) const=0; //寻找值是x的元素,找到返回true,否则返回false virtual bool Insert(int i,T x)=0; //在下标为i的元素后面插入x

相关文档
最新文档