数据结构 实习报告Word文件下载.docx

上传人:b****5 文档编号:17374416 上传时间:2022-12-01 格式:DOCX 页数:27 大小:145.53KB
下载 相关 举报
数据结构 实习报告Word文件下载.docx_第1页
第1页 / 共27页
数据结构 实习报告Word文件下载.docx_第2页
第2页 / 共27页
数据结构 实习报告Word文件下载.docx_第3页
第3页 / 共27页
数据结构 实习报告Word文件下载.docx_第4页
第4页 / 共27页
数据结构 实习报告Word文件下载.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

数据结构 实习报告Word文件下载.docx

《数据结构 实习报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构 实习报告Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。

数据结构 实习报告Word文件下载.docx

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<

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

当前位置:首页 > 人文社科 > 广告传媒

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

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