数据结构课程设计之稀疏矩阵实现与应用1

数据结构课程设计之稀疏矩阵实现与应用1
数据结构课程设计之稀疏矩阵实现与应用1

数据结构课程设计报告

题目:十字链表成为存储结构,实现稀疏矩阵的求和运算

学生姓名:张旋

班级:软件三班学号:201213040304

指导教师: 吴小平

一、需求分析

1.问题描述:

要求:十字链表下的稀疏矩阵的加、转、乘的实现。

2.基本功能

实现十字链表下的转置,乘法,加法运算。

3.输入输出

(1)设计函数建立稀疏矩阵,初始化值。

(2)设计函数输出稀疏矩阵的值。

(3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。

(4)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。

(5)构造函数进行稀疏矩阵的转置,并输出结果。

(6)退出系统。

二、概要设计

1.设计思路:

本实验要求在三元组,十字链表下实现稀疏矩阵的加、转、乘。首先要进行矩阵的初始化操作,定义三元组和十字链表的元素对象。写出转置,加法,乘法的操作函数。通过主函数调用实现在一个程序下进行矩阵的运算操作。

2.数据结构设计:

抽象数据类型稀疏矩阵的定义如下:

ADT SparseMatrix{

数据对象:D={aij | i=1,2,…,m; j=1,2,..,n;

aij∈Elemset, m和n分别称为矩阵的行数和列数。}

数据关系:R={Row,Col}

Row={ | 1<=i<=m, 1<=j<=n-1}

Col= { | 1<=i<=m-1, 1<=j<=n}

基本操作:

CreateSMatrix(&M);

操作结果:创建稀疏矩阵M。

DestroySMatrix(&M);

初始条件:稀疏矩阵M存在。操作结果:销毁稀疏矩阵M。

PrintSMatrix(M);

初始条件:稀疏矩阵M存在。操作结果:输出稀疏矩阵M。

AddSMatrix(M,N,&Q);

初始条件:稀疏矩阵M与N的行数和列数对应相等操作结果:求稀疏矩阵的和Q=M+N。

MultSMatrix(M,N,&Q);

初始条件:稀疏矩阵M的列数等于N的行数。操作结果:求稀疏矩阵乘积Q=M*N。

TransposeSMatrix(M,&T);

初始条件:稀疏矩阵M存在。操作结果:求稀疏矩阵M的转置矩阵T。

}ADT SparseMatrix

3.软件结构设计:

(1)主程序模块:

Void main(){

初始化;

do {

接受命令;

处理命令;

}while(“命令”=“退出”);

}

(2)稀疏矩阵模块

实现矩阵的相加bool AddSMatrix();

实现矩阵的相乘bool MultSMatrix();

实验矩阵的转置bool TransposeSMatrix();

(3)十字链表模块

创建十字链表bool CreateSMatrix_OL(CrossList & M);

输出十字链表bool OutPutSMatrix_OL(CrossList T);

(4)

主程序模块

稀疏矩阵模块

十字链表模块

三、详细设计

1. 定义程序中所有用到的数据及其数据结构,及其基本操作的实现;typedef struct {

int i, j;

int e;

} Triple; // 定义三元组的元素

typedef struct {

Triple data[MAXSIZE + 1];

int mu, nu, tu;

} TSMatrix; // 定义普通三元组对象

typedef struct {

Triple data[MAXSIZE + 2];

int rpos[MAXROW + 1];

int mu, nu, tu;

} RLSMatrix; // 定义带链接信息的三元组对象

typedef struct OLNode { // 定义十字链表元素

int i, j;

int e;

struct OLNode *right, *down; // 该非零元所在行表和列表的后继元素

} OLNode, *OLink; // 定义十字链表元素

typedef struct { // 定义十字链表对象结构体

OLink *rhead, *chead;

int mu, nu, tu; // 系数矩阵的行数,列数,和非零元素个数

} CrossList; // 定义十字链表对象结构体

2.主函数

int main()

{

int t;

cout.fill('*');

cout << setw(80) << '*';

cout.fill(' ');

cout << setw(50) << "***欢迎使用矩阵运算程序***" << endl; //输出头菜单 cout.fill('*');

cout << setw(80) << '*';

cout.fill(' ');

cout << " 请选择要进行的操作:" << endl;

cout << " 1:矩阵的转置。" << endl;

cout << " 2:矩阵的加法。" << endl;

cout << " 3:矩阵的乘法。" << endl;

cout << " 4:退出程序。" << endl;

while(t)

{

cout<<"请输入您要进行的操作:"<

cin>>t;

switch(t)

{

case 1:

TransposeSMatrix(); //调用矩阵转置函数

break;

case 2:

AddSMatrix(); //调用矩阵相加函数

break;

case 3:

MultSMatrix(); //调用矩阵相乘函数

break;

case 4:

t=0;

break;

}

}

return 0;

}

矩阵的转置函数

bool TransposeSMatrix() // 求矩阵的转置矩阵

{

TSMatrix M, T; //定义预转置的矩阵

InPutTSMatrix(M, 0); //输入矩阵

int num[MAXROW + 1];

int cpot[MAXROW + 1]; // 构建辅助数组

int q, p, t;

T.tu = M.tu;

T.mu = M.nu;

T.nu = M.mu;

if (T.tu)

{

for (int col = 1; col <= M.nu; col++) num[col] = 0;

for (t = 1; t <= M.tu; t++) ++num[M.data[t].j];

cpot[1] = 1;

for (int i = 2; i <= M.nu; i++) cpot[i] = cpot[i - 1] + num[i - 1]; // 求出每一列中非零元素在三元组中出现的位置

for (p = 1; p <= M.tu; p++)

{

int col = M.data[p].j;

q = cpot[col];

T.data[q].i = M.data[p].j;

T.data[q].j = M.data[p].i;

T.data[q].e = M.data[p].e;

++cpot[col];

}

}

cout << "输入矩阵的转置矩阵为" << endl;

OutPutSMatrix(T);

return true;

}

bool Count(RLSMatrix &T) {

int num[MAXROW + 1];

for (int row = 1; row <= T.mu; row++) num[row] = 0;

for (int col = 1; col <= T.tu; col++) ++num[T.data[col].i];

T.rpos[1] = 1;

for (int i = 2; i <= T.mu; i++) T.rpos[i] = T.rpos[i - 1] + num[i - 1]; // 求取每一行中非零元素在三元组中出现的位置

return true;

}

矩阵的乘法函数

bool MultSMatrix() // 两个矩阵相乘

{

RLSMatrix M, N, Q; // 构建三个带“链接信息”的三元组表示的数组

InPutTSMatrix(M, 1); // 用普通三元组形式输入数组

InPutTSMatrix(N, 1);

Count(M);

Count(N);

cout << "输入的两矩阵的乘矩阵为:" << endl;

if (M.nu != N.mu) return false;

Q.mu = M.mu;

Q.nu = N.nu;

Q.tu = 0; // Q初始化

int ctemp[MAXROW + 1]; // 辅助数组

int arow, tp, p, brow, t, q, ccol;

if (M.tu * N.tu) // Q是非零矩阵

{

for (arow = 1; arow <= M.mu; arow++)

{

///memset(ctemp,0,N.nu);

for (int x = 1; x <= N.nu; x++) // 当前行各元素累加器清零

ctemp[x] = 0;

Q.rpos[arow] = Q.tu + 1; // 当前行的首个非零元素在三元组中的位置为此行前所有非零元素+1

if (arow < M.mu) tp = M.rpos[arow + 1];

else tp = M.tu + 1;

for (p = M.rpos[arow]; p < tp; p++) // 对当前行每个非零元素进行操作

{

brow = M.data[p].j; // 在N中找到i值也操作元素的j值相等的行

if (brow < N.mu) t = N.rpos[brow + 1];

else t = N.tu + 1;

for (q = N.rpos[brow]; q < t; q++) // 对找出的行当每个非零元素进行操作

{

ccol = N.data[q].j;

ctemp[ccol] += M.data[p].e * N.data[q].e; // 将乘得到对应值放在相应的元素累加器里面

}

}

for (ccol = 1; ccol <= Q.nu; ccol++) // 对已经求出的累加器中的值压缩到Q中

if (ctemp[ccol])

{

if (++Q.tu > MAXSIZE) return false;

Q.data[Q.tu].e = ctemp[ccol];

Q.data[Q.tu].i = arow;

Q.data[Q.tu].j = ccol;

}

}

}

OutPutSMatrix(Q);

return true;

}

矩阵的加法函数

bool AddSMatrix() //矩阵的加法

{

CrossList M, N; // 创建两个十字链表对象,并初始化

CreateSMatrix_OL(M);

CreateSMatrix_OL(N);

cout << "输入的两矩阵的和矩阵为:" << endl;

OLink pa, pb, pre, hl[MAXROW + 1]; //定义辅助指针,pa,pb分别为M,N当前比较的元素,pre为pa的前驱元素

for (int x = 1; x <= M.nu; x++) hl[x] = M.chead[x];

for (int k = 1; k <= M.mu; k++) // 对M的每一行进行操作

{

pa = M.rhead[k];

pb = N.rhead[k];

pre = NULL;

while (pb) // 把N中此行的每个元素取出

{

OLink p;

if (!(p = (OLink) malloc(sizeof (OLNode)))) exit(0); // 开辟新节点,存储N中取出的元素

p->e = pb->e;

p->i = pb->i;

p->j = pb->j;

if (NULL == pa || pa->j > pb->j) // 当M此行已经检查完或者pb因该放在pa前面

{

if (NULL == pre)

M.rhead[p->i] = p;

else

pre->right = p;

p->right = pa;

pre = p;

if (NULL == M.chead[p->j]) // 进行列插入

{

M.chead[p->j] = p;

p->down = NULL;

}

else

{

p->down = hl[p->j]->down;

hl[p->j]->down = p;

}

hl[p->j] = p;

pb = pb->right;

}

else

if ((NULL != pa) && pa->j < pb->j) // 如果此时的pb元素因该放在pa后面,则取以后的pa再来比较

{

pre = pa;

pa = pa->right;

}

else

if (pa->j == pb->j) // 如果pa,pb位于同一个位置上,则将值相加{

pa->e += pb->e;

if (!pa->e)

{ // 如果相加后的和为0,则删除此节点,同时改变此元素坐在行,列的前驱元素的相应值

if (NULL == pre) // 修改行前驱元素值

M.rhead[pa->i] = pa->right;

else

pre->right = pa->right;

p = pa;

pa = pa->right;

if (M.chead[p->j] == p) M.chead[p->j] = hl[p->j] = p->down; // 修改列前驱元素值

else

hl[p->j]->down = p->down;

free(p);

pb = pb->right;

}

else

{

pa = pa->right;

pb = pb->right;

}

}

}

}

OutPutSMatrix_OL(M);

return true;

}

创建十字链表

bool CreateSMatrix_OL(CrossList & M)// 创建十字链表

{

int x, y, m;

cout << "请输入矩阵的行,列,及非零元素个数" << endl;

cin >> M.mu >> M.nu >> M.tu;

if (!(M.rhead = (OLink*) malloc((M.mu + 1) * sizeof (OLink)))) exit(0); if (!(M.chead = (OLink*) malloc((M.nu + 1) * sizeof (OLink)))) exit(0); for (x = 0; x <= M.mu; x++)

M.rhead[x] = NULL; // 初始化各行,列头指针,分别为NULL

for (x = 0; x <= M.nu; x++)

M.chead[x] = NULL;

cout << "请按三元组的格式输入数组:" << endl;

for (int i = 1; i <= M.tu; i++)

{

cin >> x >> y >> m; // 按任意顺序输入非零元,(普通三元组形式输入) OLink p, q;

if (!(p = (OLink) malloc(sizeof (OLNode)))) exit(0); // 开辟新节点,用来存储输入的新元素

p->i = x;

p->j = y;

p->e = m;

if (M.rhead[x] == NULL || M.rhead[x]->j > y)

{

p->right = M.rhead[x];

M.rhead[x] = p;

}

else

{

for (q = M.rhead[x]; (q->right) && (q->right->j < y); q = q->right); // 查找节点在行表中的插入位置

p->right = q->right;

q->right = p; // 完成行插入

}

if (M.chead[y] == NULL || M.chead[y]->i > x)

{

p->down = M.chead[y];

M.chead[y] = p;

}

else

{

for (q = M.chead[y]; (q->down) && (q->down->i < x); q = q->down); // 查找节点在列表中的插入位置

p->down = q->down;

q->down = p; // 完成列插入

}

}

return true;

}

十字链表的输出

bool OutPutSMatrix_OL(CrossList T)// 输出十字链表,用普通数组形式输出

{

for (int i = 1; i <= T.mu; i++)

{

OLink p = T.rhead[i];

for (int j = 1; j <= T.nu; j++)

{

if ((p) && (j == p->j))

{

cout << setw(3) << p->e;

p = p->right;

} else

cout << setw(3) << "0";

}

cout << endl;

}

return true;

}

3.主要函数的程序流程图,实现设计中主程序和其他子模块的算法,以流程图的形式表示。

矩阵的相加流程图矩阵的相乘流程图

矩阵转置的流程图主函数流程图

4. 画出函数之间的调用关系图。

四、调试分析

1.实际完成的情况说明(完成的功能,支持的数据类型等);

完成了稀疏矩阵的建立,初始化及输出值的操作。

实现三元组,十字链表下的稀疏矩阵的加法,乘法以及转置运算。

2.程序的性能分析,包括时空分析;

能应对一般小的错误输入,如果复杂则自动退出程序

3.上机过程中出现的问题及其解决方案;

1.起始有错误,设定的变量名相同。经检查,改正。

2.一些逻辑错误。经讨论改正。运行出现部分语法错误修正

4.程序中可以改进的地方说明;

程序在运行中一旦出现矩阵数据格式错误如输入汉字,则程序自动退出。需要重新启动。更新程序对更多错误输入情况的分析能力。

5.程序中可以扩充的功能及设计实现假想。

对退出操作的扩充

在主菜单下,用户输入4回车选择退出程序是,询问是否真的退出系统,如果是,则即退出系统,否则显示……continue……并且返回主菜单。为了方便由于误按导致程序退出。在退出时可以增加一段感谢使用本程序的结束语。

五、测试结果

系统运行主界面

输入需要执行的操作1矩阵的转置

输入需要执行的操作2矩阵的加法

输入需要执行的操作3矩阵的乘法

输入错误操作时需要重新选择

退出操作

六、用户手册

1.本程序执行文件为:crosslist.exe

2.进入本系统之后,随即显示系统主菜单界面。用户可在该界面下输入各子菜单前对应的数字并按回车,执行相应子菜单命令

3.执行操作时,按要求输入数字。彼此之间用空格隔开。

4.执行加法运算时,输入的两个矩阵的行必须相同,列数也必须相同。这是基本的矩阵运算常识。

5.执行乘法运算时,第一个矩阵的行数和第二个矩阵的列数相同。

6.当输入错误时请尝试退出程序重新运行。请尽量遵守矩阵运算的规则输入有效的运算。

七、体会与自我评价

我选的上机题目是实现三元组,十字链表下的转置,乘法,加法运算。对这个题目,我觉得有点难,因为我们数据结构这一部分并没有讲,可是选题必须是每人选择一个不许选重。有点无奈吧,当作是考验了。各种资料收集,各种代码整合。各种错误。虽然上机的时间只有短短两个星期,但从中学到了不少知识。数据结构可以说是计算机里一门基础课程,对于以后的学习尤为重要。所以我们一定要把基础学扎实,这两周的上机帮我们重新巩固基础知识,提高了我们专业的动手实践能力。

在实践的过程中我们应当有良好的规划,每天完成一小部分。尽量减少操作的盲目性,提高我们学习的效率。有个总体的大纲来逐步实现。我也曾经犯过这种错误。每个函数都做出来部分。结果都没做完。所以计划很重要在实验中我们要培养自己独立的思考能力和解决问题的能力。培养这种能力主要看我们对待这次实验的态度。我们要把它当作以后工作时接的项目一样认真对待。积极的朝着更好地一面发展不断的完善程序。不能马马虎虎随便应付一下。通过这次实验我也认识到了数据结构这门课程的重要性,以及C语言功能的强大。它可以令计算机执行各种你想要的操作。当然前提是你的技术水平。使我深刻的认识到要学好数据结构这门课程,为了以后打好坚实的基础。提高自己的动手实践能力,把所学的理论知识和实践相结合。就像古人云,纸上得来终觉浅,得知此事要躬行。为了以后的计算机道路。不断的提高自身的专业素养。奋斗。

也希望在今后的学习生活中向老师学到更多的知识。不断的充实自己。努力改正自己的坏毛病,做个奋发向上的大学生。

源代码:

#include

#include

using namespace std;

const int MAXSIZE = 100; // 定义非零元素的对多个数

const int MAXROW = 10; // 定义数组的行数的最大值

typedef struct {

int i, j;

int e;

} Triple; // 定义三元组的元素

typedef struct {

Triple data[MAXSIZE + 1];

int mu, nu, tu;

} TSMatrix; // 定义普通三元组对象

typedef struct {

Triple data[MAXSIZE + 2];

int rpos[MAXROW + 1];

int mu, nu, tu;

} RLSMatrix; // 定义带链接信息的三元组对象

typedef struct OLNode { // 定义十字链表元素

int i, j;

int e;

struct OLNode *right, *down; // 该非零元所在行表和列表的后继元素} OLNode, *OLink; // 定义十字链表元素

typedef struct { // 定义十字链表对象结构体

OLink *rhead, *chead;

int mu, nu, tu; // 系数矩阵的行数,列数,和非零元素个数

} CrossList; // 定义十字链表对象结构体

template

bool InPutTSMatrix(P & T, int y) { //输入矩阵,按三元组格式输入cout << "输入矩阵的行,列和非零元素个数:" << endl;

cin >> T.mu >> T.nu >> T.tu;

cout << "请输出非零元素的位置和值:" << endl;

for (int k = 1; k <= T.tu; k++)

cin >> T.data[k].i >> T.data[k].j >> T.data[k].e;

return true;

}

template

bool OutPutSMatrix(P T) {

int m, n, k = 1;

for (m = 0; m < T.mu; m++) {

for (n = 0; n < T.nu; n++) {

if ((T.data[k].i - 1) == m && (T.data[k].j - 1) == n) {

cout.width(4);

cout << T.data[k++].e;

} else {

cout.width(4);

cout << "0";

}

}

cout << endl;

}

return true;

}// 输出矩阵,按标准格式输出

bool TransposeSMatrix() // 求矩阵的转置矩阵

{

TSMatrix M, T; //定义预转置的矩阵

InPutTSMatrix(M, 0); //输入矩阵

int num[MAXROW + 1];

int cpot[MAXROW + 1]; // 构建辅助数组

int q, p, t;

T.tu = M.tu;

T.mu = M.nu;

T.nu = M.mu;

if (T.tu)

{

for (int col = 1; col <= M.nu; col++) num[col] = 0;

for (t = 1; t <= M.tu; t++) ++num[M.data[t].j];

cpot[1] = 1;

for (int i = 2; i <= M.nu; i++) cpot[i] = cpot[i - 1] + num[i - 1]; // 求出每一列中非零元素在三元组中出现的位置

for (p = 1; p <= M.tu; p++)

{

int col = M.data[p].j;

q = cpot[col];

T.data[q].i = M.data[p].j;

T.data[q].j = M.data[p].i;

T.data[q].e = M.data[p].e;

++cpot[col];

}

}

cout << "输入矩阵的转置矩阵为" << endl;

OutPutSMatrix(T);

return true;

}

bool Count(RLSMatrix &T) {

int num[MAXROW + 1];

for (int row = 1; row <= T.mu; row++) num[row] = 0;

for (int col = 1; col <= T.tu; col++) ++num[T.data[col].i];

T.rpos[1] = 1;

for (int i = 2; i <= T.mu; i++) T.rpos[i] = T.rpos[i - 1] + num[i - 1]; // 求取每一行中非零元素在三元组中出现的位置

return true;

}

bool MultSMatrix() // 两个矩阵相乘

{

RLSMatrix M, N, Q; // 构建三个带“链接信息”的三元组表示的数组

InPutTSMatrix(M, 1); // 用普通三元组形式输入数组

InPutTSMatrix(N, 1);

Count(M);

Count(N);

cout << "输入的两矩阵的乘矩阵为:" << endl;

if (M.nu != N.mu) return false;

Q.mu = M.mu;

Q.nu = N.nu;

Q.tu = 0; // Q初始化

int ctemp[MAXROW + 1]; // 辅助数组

int arow, tp, p, brow, t, q, ccol;

if (M.tu * N.tu) // Q是非零矩阵

{

for (arow = 1; arow <= M.mu; arow++)

{

///memset(ctemp,0,N.nu);

for (int x = 1; x <= N.nu; x++) // 当前行各元素累加器清零

ctemp[x] = 0;

Q.rpos[arow] = Q.tu + 1; // 当前行的首个非零元素在三元组中的位置为此行前所有非零元素+1

if (arow < M.mu) tp = M.rpos[arow + 1];

else tp = M.tu + 1;

for (p = M.rpos[arow]; p < tp; p++) // 对当前行每个非零元素进行操作

{

brow = M.data[p].j; // 在N中找到i值也操作元素的j值相等的行

if (brow < N.mu) t = N.rpos[brow + 1];

else t = N.tu + 1;

for (q = N.rpos[brow]; q < t; q++) // 对找出的行当每个非零元素进行操作

{

ccol = N.data[q].j;

ctemp[ccol] += M.data[p].e * N.data[q].e; // 将乘得到对应值放在相应的元素累加器里面

}

}

for (ccol = 1; ccol <= Q.nu; ccol++) // 对已经求出的累加器中的值压缩到Q中if (ctemp[ccol])

{

if (++Q.tu > MAXSIZE) return false;

Q.data[Q.tu].e = ctemp[ccol];

Q.data[Q.tu].i = arow;

Q.data[Q.tu].j = ccol;

}

}

}

OutPutSMatrix(Q);

return true;

}

bool CreateSMatrix_OL(CrossList & M)// 创建十字链表

{

int x, y, m;

cout << "请输入矩阵的行,列,及非零元素个数" << endl;

cin >> M.mu >> M.nu >> M.tu;

if (!(M.rhead = (OLink*) malloc((M.mu + 1) * sizeof (OLink)))) exit(0);

if (!(M.chead = (OLink*) malloc((M.nu + 1) * sizeof (OLink)))) exit(0);

for (x = 0; x <= M.mu; x++)

M.rhead[x] = NULL; // 初始化各行,列头指针,分别为NULL

for (x = 0; x <= M.nu; x++)

M.chead[x] = NULL;

cout << "请按三元组的格式输入数组:" << endl;

for (int i = 1; i <= M.tu; i++)

{

cin >> x >> y >> m; // 按任意顺序输入非零元,(普通三元组形式输入)

OLink p, q;

if (!(p = (OLink) malloc(sizeof (OLNode)))) exit(0); // 开辟新节点,用来存储输入的新元素

p->i = x;

p->j = y;

p->e = m;

if (M.rhead[x] == NULL || M.rhead[x]->j > y)

{

p->right = M.rhead[x];

M.rhead[x] = p;

}

else

{

for (q = M.rhead[x]; (q->right) && (q->right->j < y); q = q->right); // 查找节点在行表中的插入位置

p->right = q->right;

q->right = p; // 完成行插入

}

if (M.chead[y] == NULL || M.chead[y]->i > x)

{

p->down = M.chead[y];

M.chead[y] = p;

}

else

{

for (q = M.chead[y]; (q->down) && (q->down->i < x); q = q->down); // 查找节点在列表中的插入位置

p->down = q->down;

q->down = p; // 完成列插入

}

}

return true;

}

bool OutPutSMatrix_OL(CrossList T)// 输出十字链表,用普通数组形式输出

{

for (int i = 1; i <= T.mu; i++)

{

OLink p = T.rhead[i];

for (int j = 1; j <= T.nu; j++)

{

if ((p) && (j == p->j))

{

cout << setw(3) << p->e;

p = p->right;

} else

cout << setw(3) << "0";

}

cout << endl;

}

return true;

数据结构与算法 特殊矩阵和稀疏矩阵

常熟理工学院 《数据结构与算法》实验指导与报告书 _2017-2018_____学年第__1__ 学期 专业:物联网工程 实验名称:特殊矩阵和稀疏矩阵 实验地点: N6-210 指导教师:聂盼红 计算机科学与工程学院 2017

实验五特殊矩阵和稀疏矩阵 【实验目的】 1、掌握数组的结构类型(静态的内存空间配置);通过数组的引用下标转换成该数据在内存中的地址; 2、掌握对称矩阵的压缩存储表示; 3、掌握稀疏矩阵的压缩存储-三元组表表示,以及稀疏矩阵的转置算法。 【实验学时】 2学时 【实验预习】 回答以下问题: 1、什么是对称矩阵?写出对称矩阵压缩存储sa[k]与aij之间的对应关系。 若n阶矩阵A中的元素满足下述性质:a ij=a ji,则称为n阶对称矩阵。 sa[k]与矩阵元素a ij之间存在着一一对应的关系: 若i>=j,k=i*(i+1)/2+j; 若i=j。 对称矩阵为3,9,1,4,7 9,5,2,5,8 1,2,5,2,4 4,5,2,1,7 7,8,4,7,9

数据结构课程设计

1.一元稀疏多项式计算器 [问题描述] 设计一个一元稀疏多项式简单计算器。 [基本要求] 输入并建立多项式; 输出多项式,输出形式为整数序列:n, c1, e1, c2, e2,……, cn, en ,其中n是多项式的项数,ci, ei分别是第i项的系数和指数,序列按指数降序排序; 多项式a和b相加,建立多项式a+b; 多项式a和b相减,建立多项式a-b; [测试数据] (2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9-x+12x-3) (1+x+x2+x3+x4+x5)+(-x3-x4)=(x5+x2+x+1) (x+x3)+(-x-x3)=0 (x+x2+x3)+0=(x3+x2+x) [实现提示] 用带头结点的单链表存储多项式,多项式的项数存放在头结点中。 2.背包问题的求解 [问题描述] 假设有一个能装入总体积为T的背包和n件体积分别为w1, w2, …,wn的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+…+wn=T,要求找出所有满足上述条件的解。例如:当T=10,各件物品的体积为{1,8,4,3,5,2}时,可找到下列4组解:(1,4,3,2)、(1,4,5)、(8,2)、(3,5,2) [实现提示] 可利用回溯法的设计思想来解决背包问题。首先,将物品排成一列,然后顺序选取物品转入背包,假设已选取了前i件物品之后背包还没有装满,则继续选取第i+1件物品,若该件物品“太大”不能装入,则弃之而继续选取下一件,直至背包装满为止。但如果在剩余的物品中找不到合适的物品以填满背包,则说明“刚刚”装入背包的那件物品“不合适”,应将它取出“弃之一边”,继续再从“它之后”的物品中选取,如此重复,直至求得满足条件的解,或者无解。 由于回溯求解的规则是“后进先出”因此自然要用到栈。 3.完全二叉树判断 用一个二叉链表存储的二叉树,判断其是否是完全二叉树。 4.最小生成树求解(1人) 任意创建一个图,利用克鲁斯卡尔算法,求出该图的最小生成树。 5.最小生成树求解(1人) 任意创建一个图,利用普里姆算法,求出该图的最小生成树。 6.树状显示二叉树 编写函数displaytree(二叉树的根指针,数据值宽度,屏幕的宽度)输出树的直观示意图。输出的二叉树是垂直打印的,同层的节点在同一行上。 [问题描述] 假设数据宽度datawidth=2,而屏幕宽度screenwidth为64=26,假设节点的输出位置用 (层号,须打印的空格数)来界定。 第0层:根在(0,32)处输出;

数据结构实验稀疏矩阵计算器

‘ 实验报告 题目:稀疏矩阵运算器 班级:14电子商务平台建设班完成日期:2015.11.2 学号:姓名:孙少辉 学号:姓名:杨德龙 学号:姓名:柴益新 一:需求分析 稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏“特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。 【基本要求】 以“带行逻辑链接信息“的三元组顺序表示稀疏矩阵,实现两个矩阵相加、相减和相乘运算。稀疏矩阵的输入采用三元组表示,而运算结果的矩阵则以通常阵列形式列出。 【项目约束】 1.首先应输入矩阵的行数和列数,并判断给出的两个矩阵 行、列数对于所要求作的运算是否相匹配。可设矩阵的行数和 列数均不超过20。 2.程序可以对三元组的输入顺序加以限制,例如,按行优 先。注意研究教科书5.3.2节中的算法,以便提高计算效率。

3.在用三元组稀疏矩阵时,相加或相减所得结果矩阵应该另生 成,乘积矩阵也可用二维数组存放。 三:详细设计 1:数据结构的定义 元素类型、变量、指针类型 (1)项目数据表: 3.2子函数 3:函数调用关系 无函数调用关系,只有一个主函数 四:调试分析 三元组顺序的输入规则。以0 0 0 作为输入的结束信号。完成实现稀疏矩阵的相加、相减、相乘的运算。 五:用户使用说明 (1)首先运行文件系统 1.首先定义要运算的第一个稀疏矩阵的行列数

定义完成之后输入另一个要运算的稀疏矩阵的行列。 (2)输入信息: 如下图所示输入两个矩阵的元素

所有输入信息以及运算方法输入完成之后。回车直接算出结果(3)输出信息:

六、源代码 /** ***项目名称:稀疏矩阵的运算 ***设计者:杨德龙,柴益新,孙少辉 ***时间:2015.11.02 ***实现目标:实现矩阵的加法,减法,乘法;***/ #include #include int main() { //定义二维数组及用到的各种变量 int a[20][20];

矩阵理论中的矩阵分析的实际应用论文

矩阵分析在同步捕获性能研究新应用 摘要:该文提出了一种利用概率转移矩阵计算捕获传输函数的方法,通过将以往分析方法中的流程图转换为概率转移矩阵,仅需知道一步转移概率矩阵,利用现代计算机编程语言(如MAPLE,MATLAB等)的符号运算功能,即可得到捕获系统的传输函数:通过对传输函数求导,可计算平均捕获时间。矩阵分析方法可完整地计算出捕获系统的传输函数,可弥补流程图方法在分析传统连续搜索捕获方案的传输函数时所忽略的项;可纠正流程图方法在分 析非连续搜索捕获方案的传输函数时所引起的误差。 关键词:CDMA;矩阵分析;传输函数;流程图;捕获 A Novel Acquisition Performance Evaluation Approach Based on Matrix Analysis Abstract:A novel acquisition performance analysis approach is proposed based on matrix analysis.Given the first step transition probability matrix,the transfer function of acquisition system can be obtained by utilizing the symbol operation function of computer programming such as MAPLE,MATLAB and so on,and the mean acquisition time can be computed by differentiating the transfer function.The transfer function of acquisition system can be computed perfectly by matrix analysis,it not only complements the items neglected in that of conventional serial acquisition scheme but also corrects the error items in that of nonconsecutive acquisition scheme.

数据结构课程设计报告模板

课程设计说明书 课程名称:数据结构 专业:班级: 姓名:学号: 指导教师:成绩: 完成日期:年月日

任务书 题目:黑白棋系统 设计内容及要求: 1.课程设计任务内容 通过玩家与电脑双方的交替下棋,在一个8行8列的方格中,进行棋子的相互交替翻转。反复循环下棋,最后让双方的棋子填满整个方格。再根据循环遍历方格程序,判断玩家与电脑双方的棋子数。进行大小判断,最红给出胜负的一方。并根据y/n选项,判断是否要进行下一局的游戏。 2.课程设计要求 实现黑白两色棋子的对峙 开发环境:vc++6.0 实现目标: (1)熟悉的运用c语言程序编写代码。 (2)能够理清整个程序的运行过程并绘画流程图 (3)了解如何定义局部变量和整体变量; (4)学会上机调试程序,发现问题,并解决 (5)学习使用C++程序来了解游戏原理。 (6)学习用文档书写程序说明

摘要 本文的研究工作在于利用计算机模拟人脑进行下黑白棋,计算机下棋是人工智能领域中的一个研究热点,多年以来,随着计算机技术和人工智能技术的不断发展,计算机下棋的水平得到了长足的进步 该程序的最终胜负是由棋盘上岗双方的棋子的个数来判断的,多的一方为胜,少的一方为负。所以该程序主要运用的战术有削弱对手行动战术、四角优先战术、在游戏开局和中局时,程序采用削弱对手行动力战术,即尽量减少对手能够落子的位置;在游戏终局时则采用最大贪吃战术,即尽可能多的吃掉对手的棋子;而四角优先战术则是贯穿游戏的始终,棋盘的四角围稳定角,不会被对手吃掉,所以这里是兵家的必争之地,在阻止对手进角的同时,自己却又要努力的进角。 关键词:黑白棋;编程;设计

矩阵的简单应用1

2.6矩阵的简单应用(1) 学习目标: 1、初步了解高阶矩阵; 2、了解矩阵的简单应用。 活动过程: 活动一:矩阵在数学领域中的简单应用 例1:已知盒子A 中装有3只大小和重量相同的小球,其中2只黑色,1只白色;盒子B 中 装有5只大小和重量相同的小球,其中3只黑色,2只白色。假定A ,B 两个盒子很难分辨,而且可以任取一个,现在要求先取一个盒子,那么从中摸到一只黑色小球的概率有多大? 例2:如图所示的是A ,B ,C 这3个城市间的交通情况,小月想从其中某一个城市出发直 达另一个城市,她可以有几种选择? 小结:网络图,结点,一级路矩阵,二级路矩阵的定义。 例3:已知一级路矩阵???? ??????002001210表示一个网络图,它的结点分别是A ,B ,C ,试画出满足条件的一个网络图。

活动二:矩阵在实际生产、生活中的简单应用 例4:某运动服销售店经销A,B,C,D4种品牌的运动服,其中尺寸分别有S(小号)、M (中号)、L(大号)、XL(特大号)4种,一天内,该店的销售情况如表所示(单位:件): 假设不同品牌的运动服的平均利润是A为20元/件,B为15元/件,C为30元/件,D为25元/件,问:M号的运动服在这天获得的总利润是多少? 活动五:课堂小结与自主检测 1、已知某蛋糕厂生产甲、乙、丙3种蛋糕,其配料用量分别如下表(单位:kg)。已知水 果、奶油、白糖、面粉的单价分别为5,8,2,2.5,(单位:元/kg),试计算甲、乙、丙3

2、写出图示网络表示的一级路矩阵(图(2)的圆圈表示自己到自己有一条路)。 图(1) 3、假设某市的天气分为晴和阴两种状态,若今天晴,则明天晴的概率为43,阴的概率为41 ;若今天阴,则明天晴的概率为31,阴的概率为32 。这些概率可以通过观察某市以往几年 每天天气的变化趋势来确定,通常将用矩阵来表示的这种概率叫做转移概率,对应的矩阵叫做转移矩阵,而将这种以当前状态来预测下一时段状态的概率模型称做马尔可夫链。下面给出的是转移矩阵M 和其对应的马尔可夫变换图。问:如果清晨天气预报报告今天阴的概率为21,那么明天的天气预报会是什么?后天呢? ?? ??? ? = 3 24 13143M 阴 晴阴晴明天今天 (1) (2) 4、现有甲、乙两种细菌,它们会相互突变。每1min ,甲种细菌突变为乙种细菌的概率为0.3,乙种细菌突变为甲种细菌的概率为0.9,而未突变的细菌仍然是原来的细菌。已知开始时有甲种细菌300万个,乙种细菌500万个。 (1)细菌突变的转移矩阵是多少? (2)3min 后,甲种和乙种细菌各是多少? 4 3 32

数据结构课程设计之稀疏矩阵实现与应用1

数据结构课程设计报告 题目:十字链表成为存储结构,实现稀疏矩阵的求和运算 学生姓名:张旋 班级:软件三班学号:201213040304 指导教师: 吴小平

一、需求分析 1.问题描述: 要求:十字链表下的稀疏矩阵的加、转、乘的实现。 2.基本功能 实现十字链表下的转置,乘法,加法运算。 3.输入输出 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (5)构造函数进行稀疏矩阵的转置,并输出结果。 (6)退出系统。 二、概要设计 1.设计思路: 本实验要求在三元组,十字链表下实现稀疏矩阵的加、转、乘。首先要进行矩阵的初始化操作,定义三元组和十字链表的元素对象。写出转置,加法,乘法的操作函数。通过主函数调用实现在一个程序下进行矩阵的运算操作。 2.数据结构设计: 抽象数据类型稀疏矩阵的定义如下: ADT SparseMatrix{ 数据对象:D={aij | i=1,2,…,m; j=1,2,..,n; aij∈Elemset, m和n分别称为矩阵的行数和列数。} 数据关系:R={Row,Col} Row={ | 1<=i<=m, 1<=j<=n-1} Col= { | 1<=i<=m-1, 1<=j<=n} 基本操作: CreateSMatrix(&M); 操作结果:创建稀疏矩阵M。 DestroySMatrix(&M); 初始条件:稀疏矩阵M存在。操作结果:销毁稀疏矩阵M。 PrintSMatrix(M); 初始条件:稀疏矩阵M存在。操作结果:输出稀疏矩阵M。 AddSMatrix(M,N,&Q); 初始条件:稀疏矩阵M与N的行数和列数对应相等操作结果:求稀疏矩阵的和Q=M+N。 MultSMatrix(M,N,&Q); 初始条件:稀疏矩阵M的列数等于N的行数。操作结果:求稀疏矩阵乘积Q=M*N。 TransposeSMatrix(M,&T); 初始条件:稀疏矩阵M存在。操作结果:求稀疏矩阵M的转置矩阵T。 }ADT SparseMatrix 3.软件结构设计:

简单实用的基于Java的矩阵类

简单实用的Java矩阵基本操作。包括新建、打印、加、减、乘、转置、求逆运算。import java.util.Random; public class Matrix { public int row; public int rank; public double[][] mat; public Matrix(int a, int b) { row = a; rank = b; mat = new double[row][rank]; } public void New(){ Random rand=new Random(); for (int i = 0; i < row; i++) for (int j = 0; j < rank; j++) mat[i][j]=rand.nextInt(100); } public void Output() { System.out.println("Matrix=:"); for (int i = 0; i < row; i++) { for (int j = 0; j < rank; j++) System.out.print(mat[i][j] + " "); System.out.println(); } System.out.println(); } public Matrix Plus(Matrix a) { Matrix c=new Matrix(row,rank); if (a.row == row && a.rank == rank) { for (int i = 0; i < row; i++) for (int j = 0; j < rank; j++) c.mat[i][j] = mat[i][j] + a.mat[i][j]; } else { System.out.println("matrixAdd error!"); } return c; } public Matrix Minus(Matrix a) { Matrix c=new Matrix(row,rank); if (a.row == row && a.rank == rank) {

数据结构实验报告稀疏矩阵运算

教学单位计算机科学与技术 学生学号 5 数据结构 课程设计报告书 题目稀疏矩阵运算器 学生豹 专业名称软件工程 指导教师志敏

实验目的:深入研究数组的存储表示和实现技术,熟悉广义表存储结构的特性。 需要分析:稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。要求以带“行逻辑信息”的三元组顺序表存储稀疏矩阵,实现两矩阵的相加、相减、相乘等运算。输入以三元组表示,输出以通常的阵列形式列出。 软件平台:Windows 2000,Visual C++ 6.0或WINTC 概要设计:ADT Array { 数据对象: D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系: R = { ROW, COL } ROW = {| 0≤i≤b1-2, 0≤j≤b2-1} COL = {| 0≤i≤b1-1, 0≤ j≤b2-2} 基本操作: CreateSMatrix(&M); //操作结果:创建稀疏矩阵M. Print SMatrix(M); //初始化条件: 稀疏矩阵M存在. //操作结果:输出稀疏矩阵M. AddSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵M与N的行数和列数对应相等. //操作结果:求稀疏矩阵的和Q=M+N. SubSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵M与N的行数和列数对应相等. //操作结果:求稀疏矩阵的差Q=M-N. MultSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵M的列数等于N的行数. //操作结果:求稀疏矩阵的乘积Q=M*N. } ADT Array

数据结构课程设计报告

《数据结构课程设计》报告 题目:课程设计题目2教学计划编制 班级:700 学号:09070026 姓名:尹煜 完成日期:2011年11月7日

一.需求分析 本课设的任务是根据课程之间的先后的顺序,利用拓扑排序算法,设计出教学计划,在七个学期中合理安排所需修的所有课程。 (一)输入形式:文件 文件中存储课程信息,包括课程名称、课程属性、课程学分以及课程之间先修关系。 格式:第一行给出课程数量。大于等于0的整形,无上限。 之后每行按如下格式“高等数学公共基础必修6.0”将每门课程的具体信息存入文件。 课程基本信息存储完毕后,接着给出各门课程之间的关系,把每门课程看成顶点,则关系即为边。 先给出边的数量。大于等于0的整形。 默认课程编号从0开始依次增加。之后每行按如下格式“1 3”存储。此例即为编号为1的课程与编号为3的课程之间有一条边,而1为3的前驱,即修完1课程才能修3课程。 例: (二)输出形式:1.以图形方式显示有向无环图

2.以文本文件形式存储课程安排 (三)课设的功能 1.根据文本文件中存储的课程信息(课程名称、课程属性、课程学分、课程之间关系) 以图形方式输出课程的有向无环图。 拓展:其显示的有向无环图可进行拖拽、拉伸、修改课程名称等操作。 2.对课程进行拓扑排序。 3.根据拓扑排序结果以及课程的学分安排七个学期的课程。 4.安排好的教学计划可以按图形方式显示也可存储在文本文件里供用户查看。 5.点击信息菜单项可显示本人的学好及姓名“09070026 尹煜” (四)测试数据(见六测设结果)

二.概要设计 数据类型的定义: 1.Class Graph即图类采用邻接矩阵的存储结构。类中定义两个二维数组int[][] matrix 和Object[][] adjMat。第一个用来标记两个顶点之间是否有边,为画图服务。第二个 是为了实现核心算法拓扑排序。 2.ArrayList list用来存储课程信息。DrawInfo类是一个辅助画图的类,其中 包括成员变量num、name、shuxing、xuefen分别代表课程的编号、名称、属性、 学分。ArrayList是一个DrawInfo类型的数组,主要用来在ReadFile、DrawG、DrawC、SaveFile、Window这些类之间辅助参数传递,传递课程信息。 3.Class DrawInfo, 包括int num;String name;String shuxing;float xuefen;四个成员变量。 4.Class Edge包括int from;int to;double weight;三个成员变量。 5.Class Vertex包括int value一个成员变量。 主要程序的流程图: //ReadFile.java

矩阵分解及其简单应用

矩阵分解是指将一个矩阵表示为结构简单或具有特殊性质若干矩阵之积或之和,大体分为三角分解、分解、满秩分解和奇异值分解.矩阵地分解是很重要地一部分内容,在线性代数中时常用来解决各种复杂地问题,在各个不同地专业领域也有重要地作用.秩亏网平差是测量数据处理中地一个难点,不仅表现在原理方面,更表现在计算方面,而应用矩阵分解来得到未知数地估计数大大简化了求解过程和难度. 矩阵地三角分解 如果方阵可表示为一个下三角矩阵和一个上三角矩阵之积,即,则称可作三角分解.矩阵三角分解是以消去法为根据导出地,因此矩阵可以进行三角分解地条件也与之相同,即矩阵地前个顺序主子式都不为,即.所以在对矩阵进行三角分解地着手地第一步应该是判断是否满足这个前提条件,否则怎么分解都没有意义.矩阵地三角分解不是唯一地,但是在一定地前提下,地分解可以是唯一地,其中是对角矩阵.矩阵还有其他不同地三角分解,比如分解和分解,它们用待定系数法来解求地三角分解,当矩阵阶数较大地时候有其各自地优点,使算法更加简单方便.资料个人收集整理,勿做商业用途 矩阵地三角分解可以用来解线性方程组.由于,所以可以变换成,即有如下方程组:资料个人收集整理,勿做商业用途 先由依次递推求得,,……,,再由方程依次递推求得,,……,. 资料个人收集整理,勿做商业用途 必须指出地是,当可逆矩阵不满足时,应该用置换矩阵左乘以便使地个顺序主子式全不为零,此时有:资料个人收集整理,勿做商业用途 这样,应用矩阵地三角分解,线性方程组地解求就可以简单很多了. 矩阵地分解 矩阵地分解是指,如果实非奇异矩阵可以表示为,其中为正交矩阵,为实非奇异上三角矩阵.分解地实际算法各种各样,有正交方法、方法和方法,而且各有优点和不足.资料个人收集整理,勿做商业用途 .正交方法地分解 正交方法解求分解原理很简单,容易理解.步骤主要有:)把写成个列向量(,,……,),并进行正交化得(,,……,);) 单位化,并令(,,……,),(,,……,),其中;). 这种方法来进行分解,过程相对较为复杂,尤其是计算量大,尤其是阶数逐渐变大时,就显得更加不方便.资料个人收集整理,勿做商业用途 .方法地分解 方法求分解是利用旋转初等矩阵,即矩阵()来得到地,()是正交矩阵,并且(()).()地第行第列 和第行第列为,第行第列和第行第列分别为和,其他地都为.任何阶实非奇异矩阵可通过左连乘()矩阵(乘积为)化为上三角矩阵,另,就有.该方法最主要地是在把矩阵化为列向量地基础上找出和,然后由此把矩阵地一步步向上三角矩阵靠近.方法相对正交方法明显地原理要复杂得多,但是却计算量小得多,矩阵()固有地性质很特别可以使其在很多方面地应用更加灵活.资料个人收集整理,勿做商业用途 .方法地分解 方法分解矩阵是利用反射矩阵,即矩阵,其中是单位列向量,是正交矩阵,.可以证明,两个矩阵地乘积就是矩阵,并且任何实非奇异矩阵可通过连乘矩阵(乘积为)化为上三角矩阵,则.这种方法首要地就是寻找合适地单位列向量去构成矩阵,

数据结构稀疏矩阵基本运算实验报告

课程设计 课程:数据结构 题目:稀疏矩阵4 三元组单链表结构体(行数、列数、头) 矩阵运算重载运算符优 班级: 姓名: 学号: 设计时间:2010年1月17日——2010年5月XX日 成绩: 指导教师:楼建华

一、题目 二、概要设计 1.存储结构 typedef struct{ int row,col;//行,列 datatype v;//非0数值 }Node; typedef struct{ Node data[max];//稀疏矩阵 int m,n,t;//m 行,n 列,t 非0数个数 … … 2.基本操作 ⑴istream& operator >>(istream& input,Matrix *A)//输入 ⑵ostream& operator <<(ostream& output,Matrix *A){//输出 ⑶Matrix operator ~(Matrix a,Matrix b)//转置 ⑷Matrix operator +(Matrix a,Matrix b)//加法 ⑸Matrix operator -(Matrix a,Matrix b)//减法 ⑹Matrix operator *(Matrix a,Matrix b)//乘法 ⑺Matrix operator !(Matrix a,Matrix b)//求逆 三、详细设计 (1)存储要点 position[col]=position[col-1]+num[col-1]; 三元组表(row ,col ,v) 稀疏矩阵((行数m ,列数n ,非零元素个数t ),三元组,...,三元组) 1 2 3 4 max-1

数据结构课程设计

《数据结构》 课程设计报告 学号 姓名 班级 指导教师 安徽工业大学计算机学院 2010年6月

建立二叉树和线索二叉树 1.问题描述: 分别用以下方法建立二叉树并用图形显示出来: 1)用先序遍历的输入序列 2)用层次遍历的输入序列 3)用先序和中序遍历的结果 2.设计思路: 分三个方式去实现这个程序的功能,第一个实现先序遍历的输入数列建立二叉树;第二个是用层次遍历的方法输入序列;第三个是用先序和后序遍历的结果来建立二叉树;三种方法建立二叉树后都进行输出。关键是将这三个实现功能的函数写出来就行了;最后对所建立的二叉树进行中序线索化,并对此线索树进行中序遍历(不使用栈)。 3.数据结构设计: 该程序的主要目的就是建立二叉树和线索二叉树,所以采用树的存储方式更能完成这个程序; 结点的结构如下: typedef struct bnode { DataType data; int ltag,rtag; struct bnode *lchild, *rchild; } Bnode, *BTree; 4.功能函数设计: BTree CreateBinTree() 用先序遍历的方法讲二叉树建立; BTree CREATREE() 用队列实现层次二叉树的创建; void CreatBT(); 用先序和中序遍历的结果建立二叉树; void InThread(BTree t,BTree pre) 中序线索化; 5.编码实现: #include #include #define max 100 typedef struct bnode { char data; int ltag,rtag; struct bnode *lchild,*rchild; }Bnode,*BTree; BTree Q[max]; BTree CREATREE() { char ch; int front=1,rear=0;

数据结构三元组表存储结构实现稀疏矩阵应用课程方案实验报告

高二《数系的扩充与复数的概念》说课稿 高二《数系的扩充与复数的概念》说稿 《数系的扩充与复数的概念》是北师大版普通高中程标准数学实验教材选修1-2第四第一节的内容,大纲时安排一时。主要包括数系概念的发展简介,数系的扩充,复数相关概念、分类、相等条,代数表示和几何意义。 复数的引入是中学阶段数系的又一次扩充,引入复数以后,这不仅可以使学生对于数的概念有一个初步的、完整的认识,也为进一步学习数学打下了基础。通过本节学习,要使学生在问题情境中了解数系扩充的过程以及引入复数的必要性,学习复数的一些基本知识,体会人类理性思维在数系扩充中的作用。 在学习了这节以后,学生首先能知道数系是怎么扩充的,并且这种扩充是必要的,虚数单位公开《数系的扩充与复数的概念》说稿在数系扩充过程中的作用,而复数就是一个实数加上一个实数乘以公开《数系的扩充与复数的概念》说稿。学生能清楚的知道一个复数什么时候是虚数,什么时候是纯虚数,两个复数相等的充要条是什么。让学生在经历一系列的活动后,完成对知识的探索,变被动地“接受问题”为主动地“发现问题”,加强学生对知识应用的灵活性,深化学生对复数的认识,从而提高分析问题和解决问题的能力。 教学目标为:1.在问题情境中了解数系的扩充过程。体会实际需求与数学内部的矛盾(数的运算规则、方程求根)在数系扩充过程中的

作用,感受人类理性思维的作用以及数与现实世界的联系。. 2.理解复数的有关概念、数系间的关系、和几何表示。 3.掌握复数的分类和复数相等的条。 4体会类比、转化、数形结合思想在数学发现和解决数学问题中的作用。 教学重点为认识i的意义、复数的有关概念以及复数相等的条. 教学难点为复数相关概念的理解和复数的几何意义的理解 复数的概念是整个复数内容的基础,复数的有关概念都是围绕复数的代数表示形式展开的。虚数单位、实部、虚部的命名,复数想等的充要条,以及虚数、纯虚数等概念的理解,都应促进对复数实质的理解,即复数实际上是一有序实数对。类比实数可以用数轴表示,把复数在直角坐标系中表示出,就得到了复数的几何表示,这就把数和形有机的结合了起。 在学习本节的过程中,复数的概念如果单纯地讲解或介绍会显得较为枯燥无味,学生不易接受,教学时,采用讲解已学过的数集的扩充的历史,让学生体会到数系的扩充是生产实践的需要,也是数学学科自身发展的需要;介绍数的概念的发展过程,使学生对数的形成、发展的历史和规律,各种数集中之间的关系有着比较清晰、完整的认识从而让学生积极主动地建构虚数的概念、复数的概念、复数的分类。由于学生对数系扩充的知识不熟悉,对了解实数系扩充到复数系的过程有困难,也就是对虚数单位公开《数系的扩充与复数的概念》说稿的引入难以理解。另外虚数单位公开《数系的扩充与复数的概念》说

矩阵变换及应用开题报告

鞍山师范学院 数学系13届学生毕业设计(论文)开题报告 课题名称:浅谈矩阵的变换及其应用 学生姓名:李露露 专业:数学与应用数学 班级:10级1班 学号:30 指导教师:裴银淑 2013年12月26日

一、选题意义 1、理论意义: 矩阵是数学中的一个重要内容,是线性代数核心。矩阵的变换是矩阵中一种十分重要的运算,它在解线性方程组求逆矩阵及矩阵理论的探讨中都可起到非常重要的作用。很多复杂、繁琐的问题经过变换都可以化为简单、易于解决的问题。因此,矩阵变换是研究代数问题的一个重要工具。 2、现实意义: 矩阵变换在物理、力学、信号与信息处理、通信、电子、系统、控制、模式识别、土木、电机、航空航天等众多学科中式最富创造性和灵活性,并起着不可代替的作用。 二、论文综述 1、国内外有关研究的综述: 矩阵不仅是个数学学科,而且也是许多理工学科的重要数学工具,因此国内外有许多有关于矩阵的研究。英国数学家西尔维斯特首先使用了“矩阵”一词,他与矩阵论的创立者凯莱一起发展了行列式理论。1858年,凯莱发表了关于矩阵的第一篇论文《矩阵论的研究报告》。自此以后,国内外有了许多关于矩阵的研究。在张贤达所著的《矩阵分析与应用》一书中,就有关于矩阵变换的内容,在第一章中有关于矩阵初等变换的内容,并有初等变换在矩阵方程中的应用,在第四章中也提到了Householder变换和Givens旋转。美国著名的约翰斯.霍普金斯大学的RogerA.Horn和威廉姆和玛丽学院的CharlesR.Johnson联合编著的《矩阵分析》也有关于矩阵变换的内容,此书主要涉及的是矩阵变换的应用。国内外关于矩阵变换的研究都取得了很大的进展,为矩阵知识所涉及的各个领域都作出了巨大贡献。 2 、本人对以上综述的评价:

数据结构课程设计

一、高校社团管理 在高校中,为了丰富学生的业余生活,在学校的帮助下,会成立许多社团,少则几个,多则几十个。为了有效管理这些社团,要求编写程序实现以下功能:1.社团招收新成员; 2.修改社团相应信息 3.老成员离开社团 4.查询社团情况; 5.统计社团成员数; 二、简单文本编辑器 设计一个文本编辑器,允许将文件读到内存中,也就是存储在一个缓冲区中。这个缓冲区将作为一个类的内嵌对象实现。缓冲区中的每行文本是一个字符串,将每行存储在一个双向链表的结点中,要求设计在缓冲区中的行上执行操作和在单个行中的字符上执行字符串操作的编辑命令。 基本要求: 包含如下命令列。可用大写或小写字母输入。 R:读取文本文件到缓冲区中,缓冲区中以前的任何内容将丢失,当前行是文件的第一行; W:将缓冲区的内容写入文本文件,当前行或缓冲区均不改变。 I:插入单个新行,用户必须在恰当的提示符的响应中键入新行并提供其行号。 D:删除当前行并移到下一行; F:可以从第1行开始或从当前行开始,查找包含有用户请求的目标串的第一行; C:将用户请求的字符串修改成用户请求的替换文本,可选择是仅在当前行中有效的还是对全文有效的。 Q:退出编辑器,立即结束; H:显示解释所有命令的帮助消息,程序也接受?作为H的替代者。 N:当前行移到下一行,也就是移到缓冲区的下一行; P:当前行移到上一行,也就是移到缓冲区的上一行;

B:当前行移到开始处,也就是移到缓冲区的第一行; E:当前行移到结束处,也就是移到缓冲区的最后一行; G:当前行移到缓冲区中用户指定的行; V:查看缓冲区的全部内容,打印到终端上。 三、电话客户服务模拟 一个模拟时钟提供接听电话服务的时间(以分钟计),然后这个时钟将循环的 自增1(分钟)直到达到指定时间为止。在时钟的每个"时刻",就会执行一次检查来看看对当前电话服务是否已经完成了,如果是,这个电话从电话队列中删除,模 拟服务将从队列中取出下一个电话(如果有的话)继续开始。同时还需要执行一个检查来判断是否有一个新的电话到达。如果是,其到达时间被记录下来,并为其产生一个随机服务时间,这个服务时间也被记录下来,然后这个电话被放入电话队列中,当客户人员空闲时,按照先来先服务的方式处理这个队列。当时钟到达指定时间时,不会再接听新电话,但是服务将继续,直到队列中所偶电话都得到处理为止。 基本要求: (1)程序需要的初始数据包括:客户服务人员的人数,时间限制,电话的到达速率,平均服务时间 (2)程序产生的结果包括:处理的电话数,每个电话的平均等待时间 四、停车场管理 设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。在停车场内,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端)。若停车场内已停满n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出停车场为它让路,待该辆车开出大门后,其他车辆再按原次序返回车场。每辆车离开停车场时,应按其停留时间的交费(从进入便道开始计时)。在这里假设汽车从便道上开走时不收取任何费用 基本要求: (1)汽车的输入信息格式为(到达/离去的标识,汽车牌照号码,到达/离去的时间)

重庆大学矩阵理论及其应用论文

“矩阵理论及其应用”课程研究报告 科目:矩阵理论及其应用教师:蒋卫生 姓名:学号: 专业:机械电子工程类别:学术 上课时间:2013 年10 月至2013 年12 月 考生成绩: 阅卷评语: 阅卷教师(签名)

最小二乘法问题 摘要:无论在哪个专业领域,都不可避免的要面对测量所得到的一批数据。这些数据看似杂乱无章,但对于特定的时间却是符合特定的规律。而要发现这些规律必须借助一定的手段。矩阵理论作为一门具有强大功能的学科再此发挥了它重要的作用。用矩阵论的理论来处理现代工程技术中的各种问题已经越来越普遍了。在工程技术中引进矩阵理论不仅使理论的表达极为简捷,而且对理论的实质刻画也更为深刻,这一点是不容质疑的,更由于计算机和计算方法的普及发展,不仅为矩阵理论的应用开辟了崭新的研究途径。矩阵理论与方法已成为研究现代工程技术的数学基础。因此,对于数据的处理采用最小二乘法是最恰当不过的了。 关键词:数据处理,矩阵理论,最小二乘法 正文 一、引言 最小二乘法已有近200年的发展历史,它首先由Gauss K F提出并被应用于天文计算中,现已被广泛地用来解决各种技术问题。在过去的30多年里,它已被成功地应用到过程控制系统的参数估计领域,数字计算机技术又使最小二乘原理更有实践价值。参数估计现在模型结构已知时,用实验法所取得的数据来确定表征系统动力学模型中的参数。最小二乘法原理提供了一个数学程序,通过它可以获得一个在最小方差意义下与实践数据拟合最好的模型,它在稳态系统数学模型的回归分析方面应用已很成熟,在动态系统的参数辨识方面也取得了许多重要成果,其参数估计的收敛性质也得到了深入的研究,可以说在参数估计领域中最小二乘方法已达到了完善的程度。 本文讨论的问题如下: 一颗导弹从敌国发射,通过雷达我们观测到了它的飞行轨迹,具体有如下数据:

矩阵的简单应用 (5)

1.掌握网络图、一级路矩阵、二级路矩阵的定义. 2.了解矩阵的简单应用. [基础·初探] 1.矩阵的相关知识 (1)矩阵的概念及表示方法. (2)矩阵的计算:二阶矩阵与平面列向量的乘法,两个二阶矩阵之间的乘法. (3)常见的几何变换:恒等、伸压、反射、旋转、投影及切变变换,掌握它们的矩阵表示. (4)二阶矩阵对应的几何变换均是线性变换. (5)矩阵的乘法的几何意义在于对应变换的复合. (6)矩阵的乘法满足结合律,但不满足交换律、消去律. (7)逆矩阵的概念:掌握哪些(变换对应的)矩阵是可逆的,投影变换矩阵是重要的不可逆矩阵的例子. (8)利用逆矩阵公式或者行列式法求逆矩阵;从几何变换上分析二元一次方程组的解. (9)特征值与特征向量的概念、求法及其应用. 2.网络图与路矩阵 (1)在数学中,通常把像如图2-6-1这样表示关系的图形称为网络图,其中的交点A,B,C称为结点.

图2-6-1 (2)网络图所对应的反映从一个结点直达另一个结点的交通情况的矩阵叫做一级路矩阵,而从某个结点出发,先经过一个结点,再到达另外一个结点的交通情况的矩阵称为二级路矩阵. (3)一级路矩阵与二级路矩阵的区别在于从一个结点到另一个结点是直达,还是间接到达. 右图对应的一级路矩阵M =, 二级路矩阵N =. 3.求解矩阵应用题的方法及技巧 对于应用题,我们要读懂题意,如果还没弄清题意就去做题,则很容易出错.应用题主要考查分析能力、转化能力及运算能力.因此,我们要加强这方面能力的培养与训练,在解与矩阵有关的应用题时,要学会寻找分析问题和解决问题的突破口,在解题中提高自己的综合能力. 4.种群问题的数学模型 教材P 78例6种群问题的数学模型. ???? ??a n +1b n +1=M ??????a n b n =?? ????a b c d ???? ?? a n b n ,其中{a n },{b n }表示两个相互影响的种群X ,Y 随时间段变化的数量.若起初的种群数量β=?????? a 1 b 1,则经过n 个时段后的种群数量 为??????a n +1b n +1,且??????a n +1b n +1=M n ?????? a 1 b 1 .若矩阵M 的特征值λ1,λ 2对应的特征向量分别为 α1, α2,且β=m α1+k α2,m ∈R ,k ∈R ,则???? ??a n +1b n +1=M n ??????a 1b 1=M n β=M n (m α1+k α2)=

矩阵分解及其应用

《线性代数与矩阵分析》课程小论文 矩阵分解及其应用 学生姓名:****** 专业:******* 学号:******* 指导教师:******** 2015年12月

Little Paper about the Course of "Linear Algebra and Matrix Analysis" Matrix Decomposition and its Application Candidate:****** Major:********* StudentID:****** Supervisor:****** 12,2015

中文摘要 将特定类型的矩阵拆解为几个矩阵的乘机称为矩阵的分解。本文主要介绍几种矩阵的分解方法,它们分别是矩阵的等价分解、三角分解、谱分解、奇异值分解和 Fitting 分解等。矩阵的分解理论和方法是矩阵分析中重要的部分,在求解矩阵的特征值、解线性方程组以及实际工程中有着广泛的运用。因此,本文将介绍矩阵等价分解、三角分解、奇异值分解的理论运用以及三角分解的工程运用。 关键词:等价分解,三角分解,奇异值分解,运用

Abstract Many particular types of matrix are split into the product of a matrix of several matrices, which is called decomposition of matrix. In this paper, we introduce some methods of matrix decomposition, which are equivalent decomposition, triangular decomposition, spectral decomposition, singular value decomposition, Fitting decomposition and so on. The decomposition theory and method of matrix is an important part of matrix analysis, which is widely used in solving the characteristic value, solving linear equations and the practical engineering. In this paper, we will introduce the theory of matrix equivalence decomposition, triangular decomposition, singular value decomposition and the engineering application of triangular decomposition. Key words:Equivalent Decomposition, Triangular Decomposition, Singular Value Decomposition, Application

相关文档
最新文档