数据结构 实习报告Word文件下载.docx
《数据结构 实习报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构 实习报告Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。
operator=(ContactInfo&
r){
No=r.No;
Name=r.Name;
Number=r.Number;
Relation=r.Relation;
return*this;
}
voidset(intno=0,char*name="
"
char*number="
intrelation=0);
voidContactInfo:
:
set(intno,char*name,char*number,intrelation){
No=no;
Name=name;
Number=number;
Relation=relation;
}
voidshowRelation(inti){
switch(i)
{
case1:
cout<
亲人"
;
break;
case2:
朋友"
case3:
同事"
default:
//比较两个元素是否相等
booloperator==(ContactInfo&
r1,ContactInfo&
r2){
if(r1.No==r2.No)
returntrue;
elsereturnfalse;
//输出一个元素
ostream&
operator<
(ostream&
ostr,ContactInfo&
r){
'
'
姓名"
\t'
电话"
与本人关系"
endl;
ostr<
r.Name<
r.Number<
showRelation(r.Relation);
returnostr;
//输入一个元素
istream&
operator>
>
(istream&
istr,ContactInfo&
printf("
%s"
"
名字:
);
r.Name=newchar[20];
scanf("
r.Name);
电话号码:
r.Number=newchar[20];
r.Number);
与本人关系(1、亲人2、朋友3、同事):
cin>
r.Relation;
returnistr;
#endif
SeqList.h<
#ifndefSEQLIST_H
#defineSEQLIST_H
#include"
ContactInfo.h"
//定义顺序表
constintdefaultSize=100;
template<
classT>
classSeqList{
private:
T*data;
//存放数组
intmaxSize;
//最大可容纳表项的项数
intlast;
//当前已存表项数(从0开始)
voidreSize(intnewSize);
//改变数组空间大小
public:
SeqList(intsz=defaultSize);
//构造函数
SeqList(SeqList<
T>
&
L);
//复制构造函数
~SeqList(){delete[]data;
}
//析构函数
intSize()const{returnmaxSize;
//求表最大容量
intLength()const{returnlast+1;
//计算表长
//搜索x在表中位置,函数返回表项序号intSearch(T&
x)const;
//定位第i个表项,函数返回表项序号
intLocate(inti)const;
TGetData(inti)const;
voidSetData(inti,ContactInfo&
x);
boolInsert(inti,ContactInfo&
//插入
boolRemove(inti,T&
x);
//删除
boolIsEmpty()const
{return(last==-1)?
true:
false;
boolIsFull()const
{return(last=maxSize-1)?
voidinput();
voidoutput();
voidPrint(intn);
SeqList<
SeqList(intsz){
if(sz>
0){
maxSize=sz;
last=-1;
data=newT[maxSize];
//创建存储数组
if(data==NULL)
//动态分配失败
{cerr<
"
存储分配错误!
endl;
exit
(1);
}
//取第i个联系人
TSeqList<
GetData(inti)const
{if(i<
1||i>
last+1)
{cerr<
输入的序号不正确!
exit(0);
elsereturndata[i-1];
voidSeqList<
SetData(inti,ContactInfo&
x)
{if(i>
0&
i<
=last+1)
{data[i-1]=x;
cout<
修改成功!
cout<
data[i-1];
}
intSeqList<
Search(T&
x)const{
//在表中顺序搜索与给定值x匹配的表项,找到则函数返回该表项是第几个元素,
//否则函数返回0
for(inti=1;
i<
=last+1;
i++)//顺序搜索
if(data[i-1]==x)returni;
return0;
//搜索失败
template<
Locate(inti)const
{//定位函数:
函数返回第i(1<=i<=1ast+1)个表项的位置,否则函数返回0,表示定位失败。
if(i>
=1&
=last+1)returni;
elsereturn0;
boolSeqList<
Insert(inti,ContactInfo&
x){//将新元素x插入到表中第i(0≤i≤last+1)个表项之后。
插入成功,返回true;
否则返回false;
if(last==maxSize-1)
{cout<
通讯录已满!
returnfalse;
}//表满
if(i<
0||i>
last+1)
{returnfalse;
}//参数i不合理for(intj=last;
j>
=i;
j--)//依次后移
data[j+1]=data[j];
data[i]=x;
//插入
last++;
returntrue;
//插入成功
Remove(inti,T&
x)
{//从表中删除第i(1≤i≤last)个表项,通过引用型
//参数x返回被删元素。
函数返回删除成功信息;
if(last==-1)returnfalse;
//表空
1||i>
last+1)returnfalse;
//参数i不合理
x=data[i-1];
for(intj=i;
j<
=last;
j++)
//依次前移,填补
data[j-1]=data[j];
last--;
已成功删除
联系人!
x;
input()
{cout<
开始建立顺序表,请输入表中的元
素个数:
while(true)
{cin>
last;
if(last<
=maxSize-1)
break;
表元素个数输入有误,范围不能超过:
maxSize<
for(inti=0;
=last;
i++){
cout<
请输入第"
i+1<
个数的
值:
cin>
data[i];
}
output()
通讯录当前已有的联
系人<
last+1<
for(inti=0;
i++)
{
序号"
:
data[i]<
Print(intn)
{
for(inti=1;
i++){/顺序搜索
if(data[i-1].Relation==n)
else
{cout<
你没有这种关
系的联系人!
main.cpp<
SeqList.h"
voidmain()
{SeqList<
ContactInfo>
Cont;
ContactInfocontactor;
ContactInfo*c=newContactInfo;
c->
set(1,"
黄莉"
682740"
1);
Cont.Insert(0,*c);
set(2,"
李丽"
682732"
2);
Cont.Insert(1,*c);
set(3,"
王俪"
682452"
3);
Cont.Insert(2,*c);
delete[]c;
通讯录管理<
0.退出管理系统"
1、添加联系人"
2、查找联系人"
3、修改联系人"
4、删除联系人"
5、打印联系人清单"
当前联系人个数:
Cont.Length()<
intj=100;
while(j){
intnum=Cont.Length();
请选择你要进行的操作:
cin>
j;
switch(j){
case1:
printf("
-------------添加联系人-------------\n"
cin>
contactor;
contactor.No=num+1;
新联系人的序号为:
contactor.No<
cout<
Cont.Insert(num,contactor);
break;
}
case2:
-------------查找联系人-------------\n"
请选择查找方式
(1、按序号2、按姓名):
inti;
i;
if(i==1){
请输入联系人序号:
cin>
contactor.No;
cout<
Cont.GetData(contactor.No)<
\n'
}
elseif(i==2){
请输入联系人姓名:
cin>
contactor.Name;
if(Cont.Search(contactor))cout<
break;
case3:
{
Cont.output();
//通讯录当前已有的联系人
-------------修改联系人-------------\n"
请选择要修改的联系人的序号:
intn=Cont.Search(contactor);
if(n){
请输入修改信息:
Cont.SetData(n,contactor);
else{cout<
输入的序号不存在!
break;
case4:
//通讯录当前已有的联系人
-------------删除联系人-------------\n"
请选择要删除的联系人的序号:
intn=Cont.Search(contactor);
if(n){Cont.Remove(contactor.No,contactor);
}else
{cout<
序号不正确!
case5:
-------------打印联系人清单-------------\n"
请输入打印联系人清单的方式(1、亲人2、朋友3、同事):
contactor.Relation;
Cont.Print(contactor.Relation);
}
case0:
-------------再见!
-------------\n"
default:
---------输入错误!
请重新输入-------------\n"
}
【实验过程】
【实验体会】
这个实验具有较大的综合性,在程序设计中灵活地使用了我们平时所学的知识,我们需要扩展的知识也很多。
我在实验时遇到了不少困难。
一、将联系人记录定义为一个结构(struct)。
虽然我们这次实验是使用顺序表,但是其中的数据元素和我们以前使用的有很大不同,一个数据元素就包括了联系人的所有属性:
{序号,姓名,与本人关系,电话号码}。
最初我很不了解这样的结构,在传值的时候遇到了不少问题,不熟悉这种结构结点的使用。
二、运算符重载。
因为我们将联系人记录定义为一个结构,“=”、“==”、“>
””>
”等符号我们要重新定义,其中遇到了不少问题。
最终我通过耐心调式和参考书籍,还借助C语言的知识,解决了问题。
三、枚举。
“与本人关系”的属性,我想使用枚举,但是没有成功,最后只好使用switch语句代替。
四、灵活使用顺序表函数解决实际操作问题。
通讯簿管理操作大部分可以调用顺序表SeqList类定义的成员函数来实现,这个过程是我真正运用所学知识的过程,我们花了很多时间在以最优的方法运用成员函数解决操作问题上,思维大爆发。
五、界面设计。
通讯簿管理的设计工作主要在界面设计和实现上,我尝试了很多方法让界面变得更美观和人性化。
此次通讯簿管理的程序设计,让我受益匪浅。
2将中缀表达式转换为后缀表达式
【问题描述】表达式转换。
输入的中缀表达式为字符串,转换得到的后缀表达式存入字符数组中并输出。
例如:
a*(x+y)/(b-x)转换后得:
axy+*bx-/
【数据结构】
●定义一个暂时存放运算符的转换工作栈opst。
●中缀表达式字符串char*infix;
●后缀表达式字符串char*postfix;
【算法提示】转换规则:
把运算符移到它的两个操作数后面,删除掉所有的括号。
从头到尾扫描中缀表达式,对不同类型的字符按不同情况处理:
●数字或小数点,直接写入字符串postfix,并在每个数值后面写入一个空格;
●左括号,进栈,直到遇见相配的右括号,才出栈;
●右括号,表明已扫描过括号内的中缀表达式,把从栈顶直到对应左括号之间的运算符依次退栈,并把结果推入栈内;
●对于运算符,分两种情况处理:
◆该运算符的优先级大于栈顶符号的优先级,则入栈;
◆若该运算符的优先级小于栈顶优先级,则先弹出栈顶运算符、写入postfix串;
继续将该运算符与栈顶运算符比较,直到能把它推入栈内为止(即优先级大于栈顶运算符)。
说明:
自行设计运算符优先级的表示。
LinkedStack.h<
#include<
assert.h>
structLinkNode{
Tdata;
LinkNode<
*link;
LinkNode(LinkNode<
*ptr=NULL){link=ptr;
LinkNode(constT&
item,LinkNode<
*ptr=NULL)
{data=item;
link=ptr;
classLinkedStack//publicStack<
{public:
LinkedStack():
top(NULL){}
~LinkedStack(){makeEmpty();
voidPush(constT&
boolPop(T&
boolgetTop(T&
boolIsEmpty()const
{return(top==NULL)?
true:
false;
intgetSize()const;
voidmakeEmpty();
friendostream&
os,LinkedStack<
s);
private:
LinkNode<
*top;
voidLinkedStack<
makeEmpty()//置空
*p;
while(top!
=NULL)
{p=top;
top=top->
link;
deletep;
Push(constT&
{//将元素值X插入
top=newLinkNode<
(x,top);
assert(top!
=NULL);
boolLinkedStack<