数组和广义表学习Word文档格式.docx
《数组和广义表学习Word文档格式.docx》由会员分享,可在线阅读,更多相关《数组和广义表学习Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
1先实现了一位动态数组的存储
#include<
iostream>
usingnamespacestd;
voidmain()
{
int*a,n=10;
inti;
a=(int*)calloc(n,sizeof(int));
for(i=0;
i<
n;
i++)
a[i]=i+1;
for(i=0;
cout<
<
a[i]<
"
\t"
;
free(a);
}
通过实现了这个程序学到了更进一步的知道了如何动态申请内存空和释放动态深情的数组内存空间的calloc()函数,其函数原型为(void*)calloc(unsignedn,sizeof(int))。
知道了与malloc函数的区别,更优于malloc;
2实现二维动态数组的存储与输出
#include<
stdlib.h>
int**Creat(introw,intcol)
int**a,i;
a=(int**)calloc(row,sizeof(int));
row;
a[i]=(int*)calloc(col,sizeof(int));
return(a);
voidDestoyArray(int**a,introw)
free(a[i]);
inti,j;
introw=3,col=4,**a;
a=Creat(
row,col);
intc=1;
{
for(j=0;
j<
col;
j++)
{
a[i][j]=c;
c++;
}
}
{
cout<
a[i][j]<
endl;
DestoyArray(a,row);
通过这个程序的实现后对二维数组的存储方法有了更深的理解和认识,更加深了对二维数组存储结构实现方法,同时也对数组的一些基本操作理解和应用。
此程序主要运用双层循环实现对数组的输出格式的美观
3三阶对称矩阵的加法运算
voidAdd(inta[],intb[],intc[],intn)
=n*(n+1)/2-1;
c[i]=a[i]+b[i];
voidPrint(inta[],intn)
inti,j,k;
for(i=1;
=n;
for(j=1;
if(i>
=j)
k=i*(i-1)/2+j-1;
else
k=j*(j-1)/2+i-1;
cout<
a[k]<
\n"
voidmain()
intn=3;
inta[6],b[6],c[6];
cout<
************************************"
请输入你所求的两个对称矩阵,并按照先行后列的顺序"
for(intr=0;
r<
6;
r++)
cin>
>
a[r];
请输入第二个"
for(ints=0;
s<
s++)
b[s];
Add(a,b,c,n);
Print(c,n);
***********************************"
//inta[]={1,2,4,3,5,6},b[]={10,20,40,30,50,60},c[6];
这个程序虽然实现了,但是还有局限性,只能针对已经固定维数的矩阵的加法运算,在这个程序中运用了一个公式
k=i*(i-1)/2+j-1;
((i>
(j<
i)
这个程序中输入的说明不太清除也是一个缺点
4稀疏矩阵的输出与转置
constintMAXSIZE=999;
classMatrix{
typedefstruct
inti,j,e;
}Triple;
Tripledata[MAXSIZE];
intm,n,t;
public:
Matrix(introw,intcol,intvalue);
print();
voidtransposs(Matrix&
tMatrix);
**********************************************"
请输入A矩阵的行数,列数和非零元的个数:
introw,col,value;
//row,col,t分别用来表示行数列数和非零元的个数
cin>
row>
col>
value;
MatrixA(row,col,value);
//创建三元组对象A
***********************************************"
A矩阵为:
A.print();
//输出该矩阵
请再次"
MatrixB(row,col,value);
A的转置矩阵B为:
A.transposs(B);
B.print();
Matrix:
:
Matrix(introw,intcol,intvalue)
m=row;
n=col;
t=value;
请输入数据为:
for(inti=1;
=t;
i++)
data[i].i>
data[i].j>
data[i].e;
}
print()
for(inti=1;
=m;
for(intj=1;
j<
j++)
for(intk=1;
k<
k++)
if(i==data[k].i&
&
j==data[k].j)
{
cout<
data[k].e<
"
break;
}
if(k>
t)cout<
0<
voidMatrix:
transposs(Matrix&
tMatrix)//矩阵的转置
tMatrix.m=n;
tMatrix.n=m;
tMatrix.t=t;
if(tMatrix.t)
intq=1;
for(intcol=1;
col<
col++)
for(intp=1;
p<
p++)
if(data[p].j==col)
tMatrix.data[q].i=data[p].j;
//对调Ij的值
tMatrix.data[q].j=data[p].i;
tMatrix.data[q].e=data[p].e;
++q;
}
这个程序通过输入一组包含非0数的坐标与数值来进行一系列的操作但是这个程序中也有很多不足之处,例如要输入两次数值,暂时无法通过一次输入实现两种操作,即输出稀疏矩阵与输出转置后的矩阵
3学习感受:
通过自学习数组让我更加的了解到了学习方法的重要性,认识到了作为一门动手为主的课程:
数据结构中自己动手编程的重要性和自己实现程序的乐趣。
在其中也不可避免的遇到很多错误,有语法上的,还有很多逻辑错误,不过通过查阅书籍和上网搜索都得到了解决。
让我更加深了对自我学习的信心与认识。
B广义表
掌握广义表的类型定义广义表的存储表示和实现
2学习过程
一般情况下,广义表写成LS=(a1,a2,...,an)其中:
ai或为原子或为广义表。
在线性表的定义中,只限于是单个元素。
而在广义表的定义中,可以是单个元素,也可是广义表,分别称为广义表LS的原子和子表。
习惯上,用大写字母表示广义表的名称,用小写字母表示原子。
广义表是递归定义的线性结构。
广义表的四个特点:
1广义表中的数据元素有相对次序
2广义表的长度为最外层包含的元素个数
3广义表的深度为所含括弧的重数
4广义表可以共享
广义表的基本操作
1InitGList(&
L);
2DestroyGList(&
L)
3CreateGList(&
L,S)
4CopyGList(&
T,L)
GListLength(L);
GListDepth(L);
GListEmpty(L);
GetHead(L);
GetTail(L)
遍历
Traverse_GL(L,Visit())
操作结果:
遍历广义表L,用函数Visit处理每个元素
广义表的存储
结点结构:
Typedefenum{ATOM,LIST}Elemtag;
//ATOM==0;
原子LIST==1;
子表
TypedefstructGLNode{
Elemtagtag;
//标志域;
公共部分,区分原子和表结点
union
{//原子结点和表结点的联合部分
AtomTypeatom;
//atom是原子结点的值域,AtomType由用户定义
structGLNode*hp//表结点的表头指针
};
structGLNode*tp//相当于线性链表的next,指向下一个元素
//结点;
}*Glist;