数据结构实验报告1310300Word文档下载推荐.docx
《数据结构实验报告1310300Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告1310300Word文档下载推荐.docx(29页珍藏版)》请在冰豆网上搜索。
3.算法设计(编程思路或流程图或源代码)
内容:
1、顺序表的插入和删除
SqList.OVERFLOW;
L->
listsize=100;
length=0;
returnOK;
}
intCreateList(SqList*L,intn)
{
inti;
length=n;
printf("
请输入%d个整数:
\n"
L->
length);
for(i=0;
i<
L->
length;
i++)
scanf("
%d"
&
elem[i]);
voidTravelList(SqList*L)
printf("
当前顺序表第%d个元素为:
%d\n"
i+1,L->
intInsertList(SqList*L,inti,ElemTypee)
ElemType*newbase,*p,*q;
if(i<
0||i>
(L->
length+1))
returnERROR;
if(L->
length>
=L->
listsize)
{
newbase=(ElemType*)realloc(L->
elem,(100+50)*sizeof(ElemType));
if(!
newbase)
returnERROR;
L->
elem=newbase;
listsize=100+50;
}
p=&
elem[i-1];
for(q=&
elem[L->
length-1];
q>
=p;
q--)
*(q+1)=*q;
*p=e;
length++;
intDelList(SqList*L,inti,ElemType&
x)
ElemType*p,*q;
1||i>
length||L->
length==0)
x=*p;
p;
p++)
*p=*(p+1);
length--;
.cpp
#include<
stdio.()
intn,i;
ElemTypee,x;
SqListsq;
SqList*l=&
sq;
***顺序表的基本操作***\n"
);
计算机12117张航\n\n\n"
***初始化顺序表***\n"
InitList(l);
成功初始化顺序表!
\n\n"
***建立顺序表***\n"
输入要建立顺序表的长度:
scanf("
n);
CreateList(l,n);
成功建立顺序表!
TravelList(l);
***顺序表的插入***\n"
输入插入位置及插入元素:
%d%d"
i,&
e);
InsertList(l,i,e);
成功插入顺序表!
***顺序表的删除***\n"
输入删除位置:
i);
DelList(l,i,x);
成功删除顺序表第%d个元素%d\n"
i,x);
2、有序单链表的合并
LinkList.)
LinkListp,q;
p=L;
for(i=1;
=n;
q=(LinkList)malloc(sizeof(LNode));
printf("
输入第%d个元素:
i);
q->
data);
q->
next=p->
next;
p->
next=q;
p=p->
voidTravelList(LinkListL)
inti=1;
LinkListp;
p=L->
while(p)
第%d个元素为:
i,p->
i++;
voidMergeList(LinkListLa,LinkListLb,LinkListLc)
LinkListpa,pb,pc;
pa=La->
pb=Lb->
Lc=pc=La;
while(pa&
&
pb)
if(pa->
data<
=pb->
data)
{
pc->
next=pa;
pc=pa;
pa=pa->
}
else
next=pb;
pc=pb;
pb=pb->
pc->
next=pa?
pa:
pb;
free(Lb);
LinkListLa,Lb,Lc;
intn1,n2;
La=(LinkList)malloc(sizeof(LNode));
La->
next=NULL;
Lb=(LinkList)malloc(sizeof(LNode));
Lb->
***两个有序单链表的合并操作***\n"
输入第一个单链表的长度:
n1);
非递减顺序输入%d个整数:
n1);
CreateList(La,n1);
第一个单链表中的元素为:
TravelList(La);
输入第二个单链表的长度:
n2);
n2);
CreateList(Lb,n2);
第二个单链表中的元素为:
TravelList(Lb);
正在执行合并操作......\n\n\n"
Lc=La;
MergeList(La,Lb,Lc);
合并后单链表的元素为:
TravelList(Lc);
3、数制转换的算法实现
SqStack.OVERFLOW;
S->
top=S->
base;
stacksize=20;
intPush(SqStack*S,ElemTypee)
if(S->
top-S->
base>
=S->
stacksize)
S->
base=(ElemType*)realloc(S->
base,(20+10)*sizeof(ElemType));
if(!
S->
base)
returnOVERFLOW;
base+S->
stacksize;
stacksize=20+10;
*(S->
top++)=e;
intPop(SqStack*S,ElemType&
top==S->
x=*(--S->
top);
stdio.(intn,intm)
inte;
SqStacksq;
SqStack*s=&
InitStack(s);
while(n)
Push(s,n%m);
n=nm;
while(sq.base!
=sq.top)
Pop(s,e);
e);
voidmain()
intn,m;
***数制转换***\n"
输入一个10进制整数:
输入需要转换的数制:
m);
正在进行转换......\n\n"
10进制数%d转换成%d进制数为:
n,m);
conversion(n,m);
4、快速转置算法的实现
stdio.OK;
voidDisplayMatrix(TSMatrixt)
=t.nums;
%d\t%d\t%d\n"
t.data[i].r,t.data[i].c,t.data[i].e);
intFastTransposeMatrix(TSMatrixt,TSMatrix&
t1)
intcol,i,p,q;
intnum[6];
intcpot[6];
t1.rows=t.cols;
t1.cols=t.rows;
t1.nums=t.nums;
if(t.nums)
for(col=1;
col<
=t.cols;
col++)
num[col]=0;
for(i=1;
num[t.data[i].c]++;
cpot[1]=1;
for(col=2;
cpot[col]=cpot[col-1]+num[col-1];
for(p=1;
p<
col=t.data[p].c;
q=cpot[col];
t1.data[q].r=t.data[p].c;
t1.data[q].c=t.data[p].r;
t1.data[q].e=t.data[p].e;
cpot[col]++;
t1.data[0].r=t1.rows;
t1.data[0].c=t1.cols;
t1.data[0].e=t1.nums;
ElemTypea[5][5];
TSMatrixt,t1;
inti,j;
***5*5稀疏矩阵快速转置操作***\n"
输入25个整数:
5;
for(j=0;
j<
j++)
scanf("
a[i][j]);
CreateMatrix(t,a);
当前稀疏矩阵的三元组顺序表表示为:
DisplayMatrix(t);
\n\n正在进行快速转置操作......\n\n"
FastTransposeMatrix(t,t1);
转置后矩阵的三元组顺序表表示为:
DisplayMatrix(t1);
4.程序调试(实验数据记录——根据程序要求输入几组不同数据,记录程序运行结果,并分析结果,分析程序运行中出现的主要错误。
或对其他程序环境的使用情况的记录。
注:
必须认真书写)
算法1
realloc函数原型是externvoid*realloc(void*mem_address,unsignedintnewsize);
算法2
pc->
等价于if(pa)pc->
next=paelsepc->
free(Lb);
这一句,返回的Lc指向了La,所以不能freeLa。
Lc中的Lb的数据是从Lb->
next开始插入的pb=Lb->
next。
Lb这个指针还指向一个链表头,所以需要free。
算法3
x=*(--S->
此句第一次写成x=--S->
top;
导致编译出错。
top还是一个指针,*(--S->
top)才是指针所指的内容,才可以赋值给整形变量x。
算法4
调试过程中第一个大错误是将intCreateMatrix(TSMatrix&
t,ElemTypea[5][5])写成intCreateMatrix(TSMatrixt,ElemTypea[5][5]),区别在于按值传递和按地址传递。
按照错误的写法,导致程序DisplayMatrix(t)时,输出为空。
因为在main()中CreateMatrix(t,a)时,按值传递不改变参数t的状态,t还是保持TSMatrixt时的未赋值状态,所以输出为空。
修改为按地址传递后,CreateMatrix(t,a)运行一系列操作,形参t发生变化就是实参t发生变化,进而输出正确结果。
调试过程中intFastTransposeMatrix(TSMatrixt,TSMatrix&
t1)函数中
for(p=1;
p++)语句本来写成for(p=1;
p++),这是一个很微小的错误,误把变量搞错。
但是这个小错误却导致FastTransposeMatrix(t,t1)运行结果不正确:
执行DisplayMatrix(t1),只有t1.data[0]~t1.data[5]正确输出,其余t1.data[]都是未知。
经过长时间分析检查发现这个错误并改正。
这说明写代码一定要认真仔细,这样才能尽可能避免话费大量的时间来发现小错误。
另外写本算法时还有若干小错误。
5.讨论(通过实验的一些体会、学会的知识和技能等)
见4.程序调试。
计算机科学与技术班级:
二叉树的基本应用实验日期20131120
2.实验目的:
(1)理解树这种数据结构。
(2)掌握二叉树二叉链表这种存储结构。
(3)完成二叉树各种基本运算的算法。
(1)实现二叉树创建的算法。
(2)实现二叉树各种遍历算法。
(3)实现二叉树其他操作的算法,包括:
统计叶子结点的个数、求二叉树的深度、线索二叉树等。
3.算法设计(编程思路或流程图)
1、二叉树创建的算法
BiTNode.OK;
voidLevelBiTree(BiTreeT)
BiTreeQueue[20],b;
intfront,rear;
front=rear=0;
if(T)
Queue[rear]=T;
rear=(rear+1)%20;
while(front!
=rear)
b=Queue[front];
%2c"
b->
front=(front+1)%20;
if(b->
lchild!
=NULL)
{
Queue[rear]=b->
lchild;
rear=(rear+1)%20;
}
rchild!
rchild;
BiTreeT=NULL;
***二叉树的建立与输出***\n"
先序遍历顺序输入二叉树的字符序列:
CreateBiTree(T);
层次遍历输出当前二叉树:
LevelBiTree(T);
2、叶子结点统计的算法
BiTNode
stdio.;
if(T==NULL)
n=0;
elseif(T->
lchild==NULL&
T->
rchild==NULL)
n=1;
else
n=leafcount(T->
lchild)+leafcount(T->
rchild);
returnn;
***统计二叉树的叶子结点***\n"
当前二叉树的叶子结点数是:
leafcount(T));
3、二叉树深度统计算法
BiTNode.ERROR;
else
dep1=depth(T->
lchild);
dep2=depth(T->
returndep1>
dep2?
dep1+1:
dep2+1;
***二叉树深度的统计***\n"
二叉树的深度是:
depth(T));
BiTNode.()中T赋值后LevelBiTree(T)为空,原因是按值传递形参T和实参T占用不同内存单元,调用CreateBiTree()时,形参发生变化然后所在内存空间被释放,而实参至始至终没发生变化。
将函数按照按地址传递定义后,问题迎刃而解。
通过算法2、3,我对递归回溯有了更深的体会。
121班
图的基本实现与应用实验日期20121204
3.实验目的:
(1)理解图这种数据结构。
(2)掌握邻接矩阵、邻接表这种存储结构的实现方法。
(3)完成图的遍历的算法。
(1)实现图的邻接矩阵与邻接表结构的转换。
(必做)
(2)实现图遍历的算法。
(3)实现图的拓扑排序的算法。
(4)实现图的最短路径的算法
3.算法设计(编程思路或流程图)
1、图的邻接矩阵和邻接表创建的算法
stdio."
G.vexnum,&
G.arcnum);
G.vexnum;
输入顶点%d的值:
i+1);
G.vexs[i]);
fflush(stdin);