数据结构实验四字符串稀疏矩阵实验.docx

上传人:b****6 文档编号:7061517 上传时间:2023-01-16 格式:DOCX 页数:17 大小:108.67KB
下载 相关 举报
数据结构实验四字符串稀疏矩阵实验.docx_第1页
第1页 / 共17页
数据结构实验四字符串稀疏矩阵实验.docx_第2页
第2页 / 共17页
数据结构实验四字符串稀疏矩阵实验.docx_第3页
第3页 / 共17页
数据结构实验四字符串稀疏矩阵实验.docx_第4页
第4页 / 共17页
数据结构实验四字符串稀疏矩阵实验.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

数据结构实验四字符串稀疏矩阵实验.docx

《数据结构实验四字符串稀疏矩阵实验.docx》由会员分享,可在线阅读,更多相关《数据结构实验四字符串稀疏矩阵实验.docx(17页珍藏版)》请在冰豆网上搜索。

数据结构实验四字符串稀疏矩阵实验.docx

数据结构实验四字符串稀疏矩阵实验

实验编号:

4四川师大《数据结构》实验报告2016年11月12日

实验四字符串、稀疏矩阵实验_

一.实验目的及要求

(1)熟悉字符串类型的实现方法,并完成串的一些基本操作;

(2)掌握稀疏矩阵的三元组顺序表存储表示,并实现矩阵的转置运算。

二.实验内容

(1)编程实现两个串S1和S2的比较。

(要求自己设计串的存储结构,并编写比较函数,不要调用系统提供的函数)

(2)编程实现稀疏矩阵的三元组顺序表示方法及基本操作的实现(建立、输出、转置等)。

(3)编程实现稀疏矩阵的十字链表存储表示及基本操作的实现(建立、输出等)。

注:

(2)必做,

(1)(3)选做。

三.主要仪器设备及软件

(1)PC机

(2)DevC++,VisualC++,VS2010等

四.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)

(1)编程实现两个串S1和S2的比较。

(要求自己设计串的存储结构,并编写比较函数,不要调用系统提供的函数)

Ø代码部分:

//Main.cpp:

#include"SString.h"

intmain()

{

SStringT1,T2;

inti,n;

T1[0]=T2[0]=0;

cout<<"inputT1size:

";

cin>>n;

T1[0]=n;

cout<<"inputT1data:

";

for(i=1;i<=n;i++)

{

cin>>T1[i];

}

cout<<"inputT2size:

";

cin>>n;

T2[0]=n;

cout<<"inputT2data:

";

for(i=1;i<=n;i++)

{

cin>>T2[i];

}

cout<<"T1"<

return0;

}

//SString.cpp:

#include"SString.h"

charCompare(SStringT1,SStringT2)

{

if(T1[0]>T2[0])

{

return'>';

}

elseif(T1[0]

{

return'<';

}

else

{

for(inti=1;i<=T1[0];i++)

{

if(T1[i]>T2[i])

{

return'>';

}

elseif(T1[i]

{

return'<';

}

}

}

return'=';

}

//SString.h:

#include

usingnamespacestd;

constintMAX=255;

typedefunsignedcharSString[MAX+1];

charCompare(SStringT1,SStringT2);

Ø运行结果:

(2)编程实现稀疏矩阵的三元组顺序表示方法及基本操作的实现(建立、输出、转置等)。

Ø代码部分:

//Main.cpp

#include"TSMatrix.h"

intmain(){

TSMatrixT,M;

intcount;

cout<<"输入矩阵的行数,列数,非零元个数:

";

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

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

{

cout<<"请输入第"<

cin>>M.data[count].i>>M.data[count].j>>M.data[count].e;

}

TransposeSMatrix(M,T);

cout<<"ije"<

for(count=1;count<=T.tu;count++)

{

cout<

}

return0;

}

//TSMatrix.cpp

#include"TSMatrix.h"

StatusTransposeSMatrix(TSMatrixM,TSMatrix&T){

intcol,p,q;

T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;

if(T.tu){

q=1;

for(col=1;col<=M.nu;++col)

{

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

{

if(M.data[p].j==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;

++q;

}

}

}

}

returnOK;

}

//TSMatrix.h

#include

usingnamespacestd;

constintMAXSIZE=12500;

constintOK=1;

constintERROR=0;

typedefintElemType;

typedefintStatus;

typedefstruct{

inti,j;

ElemTypee;

}Triple;

typedefstruct{

Tripledata[MAXSIZE+1];

intmu,nu,tu;

}TSMatrix;

StatusTransposeSMatrix(TSMatrixM,TSMatrix&T);

Ø运行结果:

(3)编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列)。

Ø代码部分:

A:

链式储存:

//Main.cpp:

#include"QNode.h"

intmain(){

LinkQueueQ;

InitQueue(Q);

Menu(Q);

DestroyQueue(Q);

return0;

}

//QNode.cpp:

#include"QNode.h"

StatusInitQueue(LinkQueue&Q){

//构造空队列

Q.front=Q.rear=(QueuePrt)malloc(sizeof(QNode));

if(!

Q.front)exit(ERROR);

Q.front->next=NULL;

returnOK;

}

StatusDestroyQueue(LinkQueue&Q){

//销毁队列Q

while(Q.front){

Q.rear=Q.front->next;

free(Q.front);

Q.front=Q.rear;

}

returnOK;

}

StatusEnQueue(LinkQueue&Q,QElemTypee){

//插入元素a为Q的新的队尾元素

QNode*p;

p=(QueuePrt)malloc(sizeof(QNode));

if(!

p)exit(ERROR);

p->data=e;p->next=NULL;

Q.rear->next=p;

Q.rear=p;

returnOK;

}

StatusDeQueue(LinkQueue&Q,QElemType&e){

//删除Q的队头元素,用e返回其值

QNode*p;

if(Q.front==Q.rear)returnERROR;

p=Q.front->next;

e=p->data;

Q.front->next=p->next;

if(Q.rear==p)Q.rear=Q.front;

free(p);

returnOK;

}

StatusQueueEmpty(LinkQueueQ){

//判断对是否为空

if(Q.front==Q.rear)returnERROR;

returnOK;

}

voidMenu(LinkQueue&Q){

//输出选择界面

intselect=1;

QElemTypee;

while(select){

cout<<"--------------------"<

cout<<"请选择以下功能:

"<

cout<<"--------------1,入队"<

cout<<"--------------2,出队"<

cout<<"--------------3,判断队空"<

cout<<"--------------0,退出程序"<

cout<<"请输入你的选择";

cin>>select;

switch(select){

case0:

break;

case1:

cout<<"输入入队数据"<

cin>>e;

if(EnQueue(Q,e)){

cout<<"入队成功"<

}

break;

case2:

if(DeQueue(Q,e)){

cout<

}

break;

case3:

if(QueueEmpty(Q))cout<<"此队不为空"<

elsecout<<"此队为空"<

break;

}

}

}

//QNode.h

#ifndefQNODE_H

#defineQNODE_H

#include

#include

usingnamespacestd;

constintOK=1;

constintERROR=0;

typedefintQElemType;

typedefintStatus;

typedefstructQNode{

QElemTypedata;

structQNode*next;

}QNode,*QueuePrt;

typedefstruct{

QueuePrtfront;

QueuePrtrear;

}LinkQueue;

StatusInitQueue(LinkQueue&Q);//构造空队列

StatusDestroyQueue(LinkQueue&Q);//销毁队列Q

StatusEnQueue(LinkQueue&Q,QElemTypee);//插入元素a为Q的新的队尾元素

StatusDeQueue(LinkQueue&Q,QElemType&e);//删除Q的队头元素,用e返回其值

StatusQueueEmpty(LinkQueueQ);//判断对是否为空

voidMenu(LinkQueue&Q);//输出选择界面

#endif

Ø运行结果:

B顺序存储:

Ø代码部分:

//main.cpp:

#include"SqQueue.h"

intmain(){

SqQueueQ;

if(InitQueue(Q)){

cout<<"创建队成功"<

Menu(Q);

DestroyQueue(Q);

}

return0;

}

//SqQueue.cpp:

#include"SqQueue.h"

StatusInitQueue(SqQueue&Q){

//创建空队列

Q.base=(QElemType*)malloc(MAXSIZE*sizeof(QElemType));

if(!

Q.base)exit(ERROR);

Q.front=Q.rear=0;

returnOK;

}

StatusEnQueue(SqQueue&Q,QElemTypee){

//插入元素e为Q的新队尾元素

if(((Q.rear+1)%MAXSIZE)==Q.front)returnERROR;

Q.base[Q.rear]=e;

Q.rear=(Q.rear+1)%MAXSIZE;

returnOK;

}

StatusDeQueue(SqQueue&Q,QElemType&e){

//删除Q的对头元素,用e返回其值。

if(Q.front==Q.rear)returnERROR;

e=Q.base[Q.front];

Q.front=(Q.front+1)%MAXSIZE;

returnOK;

}

StatusSqQueueEmpty(SqQueueQ){

//判断Q是否为空

if(Q.front==Q.rear)returnERROR;

returnOK;

}

StatusDestroyQueue(SqQueue&Q){

//销毁栈

Q.front=Q.rear=0;

free(Q.base);

returnOK;

}

voidMenu(SqQueue&Q){

//输出选择菜单

intselect=1;

QElemTypee;

while(select){

cout<<"----------------------------------"<

cout<<"请选择一下功能:

"<

cout<<"1,入队"<

cout<<"2,出队"<

cout<<"3,判断是否为空"<

cout<<"0,退出程序"<

cout<<"你的选择是:

";

cin>>select;

switch(select){

case0:

break;

case1:

cout<<"输入插入的数据:

";

cin>>e;

if(EnQueue(Q,e)){

cout<<"入队成功"<

}

elsecout<<"队满"<

break;

case2:

if(DeQueue(Q,e)){

cout<

}

elsecout<<"队空"<

break;

case3:

if(SqQueueEmpty(Q)){

cout<<"队未空"<

}

elsecout<<"队空"<

break;

}

}

}

//SqQueue.h:

#ifndefSQQUEUE_H

#defineSQQUEUE_H

#include

#include

usingnamespacestd;

constintMAXSIZE=100;

constintMORE=100;

constintOK=1;

constintERROR=0;

typedefintQElemType;

typedefintStatus;

typedefstruct{

QElemType*base;

intfront;

intrear;

}SqQueue;

StatusInitQueue(SqQueue&Q);//创建空队列

StatusEnQueue(SqQueue&Q,QElemTypee);//插入元素e为Q的新队尾元素

StatusDeQueue(SqQueue&Q,QElemType&e);//删除Q的对头元素,用e返回其值。

StatusSqQueueEmpty(SqQueueQ);//判断Q是否为空

StatusDestroyQueue(SqQueue&Q);//销毁栈

voidMenu(SqQueue&Q);//输出选择菜单

#endif

Ø运行结果:

(3)编程实现稀疏矩阵的十字链表存储表示及基本操作的实现(建立、输出等)。

Ø代码部分:

//CrossList.h

#include

#include

#defineOK1;

#defineERROR1;

typedefintElemType;

typedefintStatus;

typedefstructOLNode{

inti,j;

ElemTypee;

structOLNode*right,*down;

}OLNode,*OLink;

typedefstruct{

OLink*rhead,*chead;

intmu,nu,tu;

}CrossList;

StatusCreateSMatrix_OL(CrossList&M);

//CrossList.cpp

#include"CrossList.h"

StatusCreateSMatrix_OL(CrossList&M){

intm,n,t,i,j,e,k;

OLNode*p,*q;

//if(M)free(M);

printf("mu,nu,tu:

");

scanf("%d%d%d",&m,&n,&t);

M.mu=m;M.nu=n;M.tu=t;

M.rhead=(OLink*)malloc((m+1)*sizeof(OLink));

if(!

M.rhead)returnERROR;

if(!

(M.chead=(OLink*)malloc((n+1)*sizeof(OLink))))returnERROR;

for(k=1;k<=M.mu;k++)M.rhead[k]=NULL;

for(k=1;k<=M.nu;k++)M.chead[k]=NULL;

printf("inputije:

");

for(scanf("%d%d%d",&i,&j,&e);i!

=0;scanf("%d%d%d",&i,&j,&e)){

p=(OLNode*)malloc(sizeof(OLink));

if(!

p)returnERROR;

p->i=i;p->j=j;p->e=e;

if(M.rhead[i]==NULL||M.rhead[i]->j>j){

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

else{

for(q=M.rhead[i];(q->right)&&q->right->jright);

p->right=q->right;q->right=p;}

if(M.chead[j]==NULL||M.chead[j]->i>i){

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

else{

for(q=M.chead[j];(q->down)&&q->down->idown);

p->down=q->down;q->down=p;}

printf("inputije:

");

}

returnOK;

}

//main.cpp

#include"CrossList.h"

intmain(){

CrossListM;

OLNode*q;

CreateSMatrix_OL(M);

printf("ije\n");

for(inti=1;i<=M.nu;i++){

if(M.chead[i]!

=NULL)

{

q=M.chead[i];

while(q)

{

printf("%5d%5d%5d\n",q->i,q->j,q->e);

q=q->down;

}

}

}

return0;

}

Ø运行结果:

五.实验结果的分析与评价(该部分如不够填写,请另加附页)

1.稀疏矩阵的存储比较难理解。

储存过程较为复杂,但是用与各种计算时比较方便。

注:

实验成绩等级分为(90-100分)优,(80-89分)良,(70-79分)中,(60-69分)及格,(59分)不及格。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1