广东工业大学数据结构实验报告12届文档格式.docx
《广东工业大学数据结构实验报告12届文档格式.docx》由会员分享,可在线阅读,更多相关《广东工业大学数据结构实验报告12届文档格式.docx(32页珍藏版)》请在冰点文库上搜索。
printf("
\n"
4、实验结果和分析
当输入一个整数的时候,得出的是该整数的所有数字的和
5、实验心得体会
本实验过程中,感觉能用简单的方法实现程序就应该用简单的,一开始我用了多个for循环,感觉没必要,就用了do-while循环,因此保持程序的简洁,精悍是最应该的,过于冗杂的程序不仅臃肿,而且难以分析,分享。
广东工业大学数据结构实验报告
(2)
求两个多项式的相加运算
一、实验目的
熟悉并学会使用多项式的表示方法以及计算方法
二、实验软件环境
VisualStudio2012
三、实验内容
#include<
malloc.h>
#defineMAX20//多项式最多项数
typedefstruct//定义存放多项式的数组类型
doublecoef;
//系数
intexp;
//指数
}PolyArray[MAX];
typedefstructpnode//定义单链表结点类型
structpnode*next;
}PolyNode;
voidDispPoly(PolyNode*L)//输出多项式
boolfirst=true;
//first为true表示是第一项
PolyNode*p=L->
next;
while(p!
=NULL)
{
if(first)
first=false;
elseif(p->
coef>
0)
printf("
+"
if(p->
exp==0)
%g"
p->
coef);
exp==1)
%gx"
else
%gx^%d"
coef,p->
exp);
p=p->
}
voidDestroyList(PolyNode*&
L)//销毁单链表
PolyNode*p=L,*q=p->
while(q!
free(p);
p=q;
q=p->
free(p);
voidCreateListR(PolyNode*&
L,PolyArraya,intn)//尾插法建表
PolyNode*s,*r;
inti;
L=(PolyNode*)malloc(sizeof(PolyNode));
//创建头结点
L->
next=NULL;
r=L;
//r始终指向终端结点,开始时指向头结点
for(i=0;
i<
n;
i++)
s=(PolyNode*)malloc(sizeof(PolyNode));
//创建新结点
s->
coef=a[i].coef;
exp=a[i].exp;
r->
next=s;
//将*s插入*r之后
r=s;
r->
//终端结点next域置为NULL
voidSort(PolyNode*&
head)//按exp域递减排序
PolyNode*p=head->
next,*q,*r;
if(p!
=NULL)//若原单链表中有一个或以上的数据结点
r=p->
//r保存*p结点后继结点的指针
p->
//构造只含一个数据结点的有序表
p=r;
while(p!
{
r=p->
//r保存*p结点后继结点的指针
q=head;
while(q->
next!
=NULL&
&
q->
next->
exp>
p->
exp)
q=q->
//在有序表中找插入*p的前驱结点*q
p->
next=q->
//将*p插入到*q之后
q->
next=p;
p=r;
}
voidAdd(PolyNode*ha,PolyNode*hb,PolyNode*&
hc)//求两有序集合的并
PolyNode*pa=ha->
next,*pb=hb->
next,*s,*tc;
doublec;
hc=(PolyNode*)malloc(sizeof(PolyNode));
//创建头结点
tc=hc;
while(pa!
pb!
if(pa->
pb->
exp)
s=(PolyNode*)malloc(sizeof(PolyNode));
//复制结点
s->
exp=pa->
exp;
s->
coef=pa->
coef;
tc->
tc=s;
pa=pa->
elseif(pa->
exp<
exp=pb->
coef=pb->
pb=pb->
else//pa->
exp
c=pa->
coef+pb->
if(c!
=0)//系数之和不为0时创建新结点
{
s=(PolyNode*)malloc(sizeof(PolyNode));
s->
coef=c;
tc->
}
if(pb!
=NULL)pa=pb;
//复制余下的结点
tc->
pa=pa->
tc->
PolyNode*ha,*hb,*hc;
PolyArraya={{1.2,0},{2.5,1},{3.2,3},{-2.5,5}};
PolyArrayb={{-1.2,0},{2.5,1},{3.2,3},{2.5,5},{5.4,10}};
CreateListR(ha,a,4);
CreateListR(hb,b,5);
原多项式A:
"
DispPoly(ha);
原多项式B:
DispPoly(hb);
Sort(ha);
Sort(hb);
有序多项式A:
有序多项式B:
Add(ha,hb,hc);
多项式相加:
DispPoly(hc);
DestroyList(ha);
DestroyList(hb);
DestroyList(hc);
四、实验结果和分析
五、实验心得体会
本实验过程中,我进一步了解了单链表的各种操作以及对应的函数的使用方法,以及学会熟练调用函数来实现,比较深刻地体会到了使用单链表的好处和方便。
广东工业大学数据结构实验报告(3)
病人看病模拟程序
掌握顺序栈以及循环队列的使用。
typedefstructqnode
intdata;
structqnode*next;
}QNode;
//链队节点类型
typedefstruct
QNode*front,*rear;
}QuType;
//链队类型
voidDestroyqueue(QuType*&
qu)//释放链队
QNode*p,*q;
p=qu->
front;
=NULL)//若链队不空
while(q!
=NULL)//释放队中所有的节点
free(p);
p=q;
q=q->
free(qu);
//释放链队节点
voidSeeDoctor()
intsel,flag=1,find,no;
QuType*qu;
QNode*p;
qu=(QuType*)malloc(sizeof(QuType));
//创建空队
qu->
front=qu->
rear=NULL;
while(flag==1)//循环执行
1:
排队2:
就诊3:
查看排队4.不再排队,余下依次就诊5:
下班请选择:
sel);
switch(sel)
case1:
>
>
输入病历号:
do
{
scanf("
no);
find=0;
p=qu->
while(p!
!
find)
{
if(p->
data==no)
find=1;
else
p=p->
}
if(find)
printf("
输入的病历号重复,重新输入:
}while(find==1);
p=(QNode*)malloc(sizeof(QNode));
//创建节点
data=no;
if(qu->
rear==NULL)//第一个病人排队
qu->
rear=p;
else
rear->
qu->
//将*p节点入队
break;
case2:
if(qu->
front==NULL)//队空
没有排队的病人!
else//队不空
{
p=qu->
病人%d就诊\n"
data);
if(qu->
rear==p)//只有一个病人排队的情况
qu->
front=p->
free(p);
break;
case3:
if(qu->
没有排列的病人!
排队病人:
while(p!
=NULL)
{
printf("
%d"
}
break;
case4:
front==NULL)//队空
else//队不空
病人按以下顺序就诊:
Destroyqueue(qu);
//释放链队
flag=0;
//退出
case5:
front!
=NULL)//队不空
请排队的病人明天就医!
flag=0;
SeeDoctor();
本实验过程中,要求考虑的情况较多,在循环队列中使用指针的使用过程中对空的这种情况还是欠缺考虑,所以以后在进行循环队列使用中务必要记得考虑对空的情况。
广东工业大学数据结构实验报告(4)
文本串加密和解密程序
lgo4-1.cpp
#defineMaxSize100//最多的字符个数
typedefstruct
{chardata[MaxSize];
//定义可容纳MaxSize个字符的空间
intlength;
//标记当前实际串长
}SqString;
voidStrAssign(SqString&
s,charcstr[])//s为引用型参数
{inti;
cstr[i]!
='
\0'
;
s.data[i]=cstr[i];
s.length=i;
voidStrCopy(SqString&
s,SqStringt)//s为引用型参数
t.length;
s.data[i]=t.data[i];
s.length=t.length;
boolStrEqual(SqStrings,SqStringt)
{boolsame=true;
inti;
if(s.length!
=t.length)//长度不相等时返回0
same=false;
else
for(i=0;
s.length;
if(s.data[i]!
=t.data[i])//有一个对应字符不相同时返回0
{same=false;
returnsame;
intStrLength(SqStrings)
returns.length;
SqStringConcat(SqStrings,SqStringt)
{SqStringstr;
str.length=s.length+t.length;
i++)//将s.data[0..s.length-1]复制到str
str.data[i]=s.data[i];
i++)//将t.data[0..t.length-1]复制到str
str.data[s.length+i]=t.data[i];
returnstr;
SqStringSubStr(SqStrings,inti,intj)
intk;
str.length=0;
if(i<
=0||i>
s.length||j<
0||i+j-1>
s.length)
returnstr;
//参数不正确时返回空串
for(k=i-1;
k<
i+j-1;
k++)//将s.data[i..i+j]复制到str
str.data[k-i+1]=s.data[k];
str.length=j;
}
SqStringInsStr(SqStrings1,inti,SqStrings2)
{intj;
SqStringstr;
s1.length+1)//参数不正确时返回空串
for(j=0;
j<
i-1;
j++)//将s1.data[0..i-2]复制到str
str.data[j]=s1.data[j];
s2.length;
j++)//将s2.data[0..s2.length-1]复制到str
str.data[i+j-1]=s2.data[j];
for(j=i-1;
s1.length;
j++)//将s1.data[i-1..s1.length-1]复制到str
str.data[s2.length+j]=s1.data[j];
str.length=s1.length+s2.length;
SqStringDelStr(SqStrings,inti,intj)
{intk;
s.length||i+j>
s.length+1)//参数不正确时返回空串
for(k=0;
k++)//将s.data[0..i-2]复制到str
str.data[k]=s.data[k];
for(k=i+j-1;
k++)//将s.data[i+j-1..s.length-1]复制到str
str.data[k-j]=s.data[k];
str.length=s.length-j;
SqStringRepStr(SqStrings,inti,intj,SqStringt)
s.length||i+j-1>
s.length)//参数不正确时返回空串
k++)//将s.data[0..i-2]复制到str
k++)//将t.data[0..t.length-1]复制到str
str.data[i+k-1]=t.data[k];
str.data[t.length+k-j]=s.data[k];
str.length=s.length-j+t.length;
voidDispStr(SqStrings)
if(s.length>
{for(i=0;
%c"
s.data[i]);
//文件名:
exp4-4.cpp
string.h>
#defineMaxSize100
//串长
externvoidStrAssign(SqString&
char[]);
//在algo4-1.cpp文件中
externvoidDispStr(SqString);
SqStringA,B;
//全局串
SqStringEnCrypt(SqStringp)
inti=0,j;
SqStringq;
while(i<
p.length)
for(j=0;
p.data[i]!
=A.data[j];
j++);
if(j>
=p.length)//在A串