顺序表的实现.docx
《顺序表的实现.docx》由会员分享,可在线阅读,更多相关《顺序表的实现.docx(15页珍藏版)》请在冰豆网上搜索。
顺序表的实现
实验二:
顺序表的实现
班级电信081学号0808140512姓名王智杰
一、问题描述
实现顺序表的顺序存储和插入、删除、查找、遍历、清空等操作
二、需求分析
1、简述程序的基本功能
构造、析构、插入、删除、取值、赋值
2、输入的形式和输入值的范围
输入数字0~6,选择功能
3、输出的形式
选1:
选2(没有输入顺序表或顺序表被清空的情况):
选择3:
选择4:
选择5:
选择6:
选择0:
退出;
4、测试数据要求
可以输入一组数:
1,2,3,a,b,c,d,5,6。
显示:
三、概要设计
1、抽象数据类型
templateclassSeqList
intLength()const
voidSearch();
voidInsert(inti);
voidEmpty()
boolIsempty()
voidinput()
voidoutput()
voidIncreaseSize()
intRemove1(T&x)
intRemove2(inti)
2、主程序流程及模块调用关系
SeqList
-dataT*
-max_sizeint
-lenthint
+Length()int
+Search()void
+Insert(inti)void
+Empty()void
+Isempty()bool
+input()void
+output()void
+IncreaseSize()void
+Remove1(T&x)int
+Remove2(inti)int
四、详细设计(要求主要变量和语句加注释)
#include//SeqList.h
usingnamespacestd;
template
classSeqList
{
protected:
T*data;
intmax_size;
intlenth;
public:
SeqList(intn);
~SeqList(){delete[]data;}
intLength()const{returnlenth;}
voidSearch();
voidInsert(inti);
voidEmpty(){inti;for(i=0;i<=lenth-1;i++)data[i]=NULL;lenth=0;cout<<"顺序表已经清空"<boolIsempty(){if(Length())returnfalse;elsereturntrue;}
voidinput();
voidoutput();
voidIncreaseSize();//扩容函数
intRemove1(T&x);//按位置删除
intRemove2(inti);//按元素删除
};
template
SeqList:
:
SeqList(inti)
{
max_size=i;
lenth=0;
data=newT[max_size];
}
template
voidSeqList:
:
IncreaseSize()
{
T*newarray=newT[max_size+10];
intn=lenth;
T*srcptr=data;
T*destptr=newarray;
while(n--)*destptr++=*srcptr++;
delete[]data;
data=newarray;max_size+=10;
};
template
voidSeqList:
:
Search()
{inta=0,b,c;charx;
cout<<"
(1)请输入要查找的元素"<cout<<"
(2)请输入要查找的位置"<cin>>b;
switch(b)
{
case1:
cout<<"
(1)请输入要查找的元素"<cin>>x;
for(c=0;c<=lenth-1;c++)
{if(data[c]==x){a++;cout<<"第"<if(a!
=0)cout<<"共找到"<elsecout<<"不存在该元素!
"<case2:
cout<<"
(2)请输入要查找的位置"<cin>>a;
if(a>=1||a<=lenth)cout<<"该元素是:
"<elsecout<<"输入的位置不正确!
"<}
};
/*template
intSeqList:
:
Locate(inti)const
{if(i>=1&&i<=lenth)returni;
elsereturn0;
};*/
template
voidSeqList:
:
Insert(inti)
{charx;
if(lenth==max_size)IncreaseSize();
loop:
if(i<0||i>lenth)
{
cout<<"输入的范围错误!
必须在1~"<请重新输入位置:
"<cin>>i;
gotoloop;
}
cout<<"请输入要插入的元素:
"<cin>>x;
for(intj=lenth;j>=i;j--)
{data[j]=data[j-1];}
data[i-1]=x;
lenth++;
};
template
voidSeqList:
:
input()
{
while
(1)
{cout<<"请输入顺序表中的元素个数:
";
cin>>lenth;
if(lenth<=max_size){cout<<"请输入"<cout<<"表元素个数输入有误,范围不能超过"<"<}
for(inti=0;i<=lenth-1;i++)
{cout<<"请输入第"<
cin>>data[i];}
};
template
voidSeqList:
:
output()
{for(inti=0;i<=lenth-1;i++)
{cout<<"第"<
";
cout<}};
template
intSeqList:
:
Remove1(T&x)
{inta=0,i;
for(i=0;i{
if(data[i]==x)
{a++;
for(intj=i;jlenth-=1;
cout<<"已经删除第"<
}
if(a!
=0)return1;
if(a==0)cout<<"删除值有错误,请重新输入"<};
template
intSeqList:
:
Remove2(inti)
{
loop:
if(i<0||i>lenth)
{
cout<<"输入的范围错误!
必须在1~"<请重新输入位置:
"<cin>>i;
gotoloop;
}
charx;
x=data[i-1];
for(intj=i;jlenth-=1;
cout<<"已经删除第"<
return0;};
#include//主函数
#include
#include"SeqList.h"
intmain()
{
inta,i,c,d;charx;SeqListnewlist(10);
while(a)
{cout<<"========================================="<cout<<"顺序表"<cout<<"
(1)输入顺序表"<cout<<"
(2)显示顺序表"<cout<<"(3)进行插入操作"<cout<<"(4)进行删除操作"<cout<<"(5)查找顺序表中的元素"<cout<<"(6)清空顺序表"<cout<<"(0)退出程序"<cout<<"========================================="<cin>>a;
switch(a)
{case1:
newlist.input();break;
case2:
if(newlist.Isempty())cout<<"顺序表为空,返回主菜单输入"<elsenewlist.output();break;
case3:
cout<<"请输入要插入的位置:
"<cin>>i;
newlist.Insert(i);
cout<<"插入成功"<case4:
cout<<"
(1)请输入要删除的元素"<cout<<"
(2)请输入要删除的位置"<cin>>c;
if(c=1)
{cout<<"
(1)请输入要删除的元素"<cin>>x;
while(newlist.Remove1(x)!
=1)
{cin>>x;}
}
elsecout<<"
(2)请输入要删除的位置"<cin>>d;
newlist.Remove2(d);
break;
case5:
newlist.Search();break;
case6:
newlist.Empty();
case0:
break;
default:
cout<<"没有该选项"<}
}
return0;
}
五、调试分析
1、出现了几次顺序表的容量满,无法处理,于是使用了扩容函数。
2、解决了删除和查找操作中位置和地址的兼容问题。
3、解决了顺序表元素的类型兼容问题
六、测试结果
列出几组输入和输出结果,输入集应多于需求分析的数据。
纯数字输入:
纯字母输入:
字母数字混合输入:
插入操作:
查找操作: