实验一、顺序表的表示和运算
实验目的:
熟悉顺序表的逻辑特性、存储表示方法和顺序表的基本操作。
实验要求:
能够实现线性表的顺序存储表示,能够实现顺序表的基本操作及应用。
实验内容:
编写程序实现下列的要求:
(1)设数据元素为整数,实现这样的线性表的顺序存储表示。
(2)键盘输入若干个数据元素,利用顺序表的基本操作,建立该表。
(3)利用顺序表的基本操作,找出表中的最大的和最小的数据元素(用于比较的数据元素为整数)。
(4)* 若数据元素为学生成绩(含姓名、成绩等字段),重新编程,实现上面的要求。要求尽可能少地修改前面的程序来得到新程序。(这里用于比较的字段为分数)
练习及思考题:
(1) 不同类型的数据元素所对应的顺序表在类型定义和操作实现上有什么异同?
(2) 顺序表的操作上有什么特点?
(3) 不固定数据元素的个数,而通过特殊数据来标记输入数据的结束,实现这样的输入操作。
main.cpp
#include<iostream>
#include "sqlist.h"
using namespace std;
int main(){
SqList L;
InitSqList(L);//初始化
CreateSqList(L);//创建
Insert(L);//指定位置插入
Delete(L);//指定位置删除
Get(L);//按位查找
Locate(L);//按值查找
IncreaSize(L);//扩容
return 0;
}
basic.cpp
#include "sqlist.h"
#include<iostream>
using namespace std;
//初始化
void InitSqList(SqList &L){//初始化顺序表L,顺序表的下标从0开始
L.data=new ElemType[InitSize];
L.length=0;
L.MaxSize=InitSize;
}
//销毁
void DestroySqList(SqList &L){//销毁顺序表L
delete L.data;
}
//按位查找
bool GetElem(SqList L,int i,ElemType &e){//在顺序表L中查找第i个元素,并返回该元素和状态
if(i<1||i>L.length) return false;
e=L.data[i-1];
return true;
}
//按值查找
int LocateElem(SqList L,ElemType e){//在顺序表L中查找值为e的元素,返回它的位置,如果没有,返回-1
for(int i=0;i<L.length;i++){
if(L.data[i]==e){
return i+1;
}
}
return -1;
}
//插入
bool IncreaseElem(SqList &L,int i,ElemType e){//在顺序表L的第i个位置插入元素e,返回一个新的顺序表L和状态
if(i<1||i>L.length+1) return false;//插入位置不合法
if(L.length==L.MaxSize) return false;//表已经满了,无法继续插入
for(int j=L.length-1;j>=i-1;j--){
L.data[j+1]=L.data[j];
}
L.data[i-1]=e;
L.length++;
return true;
}
//删除
bool DeleteElem(SqList &L,int i,ElemType &e){//在顺序表L的第i个位置删除元素,返回一个新的顺序表L、被删除的元素和状态
if(i<1||i>L.length) return false;
e=L.data[i-1];
for(int j=i;j<L.length;j++){
L.data[j-1]=L.data[j];
}
L.length--;
return true;
}
//判空
bool Empty(SqList L){//判断顺序表L是否为空
if(L.length==0) return true;
else return false;
}
//输出打印
void PrintList(SqList L){
for(int i=0;i<L.length;i++){
cout<<L.data[i]<<" ";
}
cout<<endl;
}
extra.cpp
#include "sqlist.h"
#include<iostream>
using namespace std;
//增加容量
void IncreaseSize(SqList &L,int len){//为顺序表L增加len的容量,返回一个新的顺序表L
ElemType *p=L.data;
L.data=new ElemType[L.MaxSize+len];
L.MaxSize+=len;
for(int i=0;i<L.length;i++){
L.data[i]=p[i];
}
delete p;//释放原来的空间
}
//建立顺序表
void CreateSqList(SqList &L){
cout<<"----------------------建立顺序表-------------------------"<<endl;
cout<<"请输入整数,用9999表示结束:"<<endl;
int x;
cin>>x;
int cnt=1;
while(x!=9999){
IncreaseElem(L,cnt,x);
cin>>x;
cnt++;
}
cout<<"创建成功:";
PrintList(L);//输出
}
//插入
void Insert(SqList &L){
cout<<"---------------------- 插入 -------------------------"<<endl;
cout<<"请输入要插入的位置:";
int i;
cin>>i;
cout<<"请输入要插入的数据元素:";
ElemType e;
cin>>e;
if(IncreaseElem(L,i,e)){
cout<<"插入成功:";
PrintList(L);
}else{
cout<<"插入失败!"<<endl;
}
}
//删除
void Delete(SqList &L){
cout<<"---------------------- 删除 -------------------------"<<endl;
cout<<"请输入要删除的位置:";
int i;
cin>>i;
ElemType e=0;
if(DeleteElem(L,i,e)){
cout<<"删除的数据元素是:"<<e<<endl;
cout<<"删除成功:";
PrintList(L);
}else{
cout<<"删除失败!"<<endl;
}
}
//按位查找
void Get(SqList L){
cout<<"---------------------- 按位查找 -------------------------"<<endl;
cout<<"请输入您要查询的位置:";
int i;
cin>>i;
ElemType e=0;
if(GetElem(L,i,e)){
cout<<"查找成功:第"<<i<<"个位置上的数据为"<<e<<endl;
}else{
cout<<"按位查找失败!"<<endl;
}
}
//按值查找
void Locate(SqList L){
cout<<"---------------------- 按值查找 -------------------------"<<endl;
cout<<"请输入您要查询的数值:";
ElemType e;
cin>>e;
if(LocateElem(L,e)!=-1){
cout<<"查找成功:"<<e<<"在顺序表中的位置为"<<LocateElem(L,e)<<endl;
}else{
cout<<"查找失败,顺序表中没有值为"<<e<<"的数据元素"<<endl;
}
}
//扩容
void IncreaSize(SqList &L){
cout<<"---------------------- 扩容 -------------------------"<<endl;
cout<<"当前容量:"<<L.MaxSize<<endl;
cout<<"请输入您要扩大的容量:";
int len;
cin>>len;
IncreaseSize(L,len);
cout<<"扩容成功,当前容量:"<<L.MaxSize<<endl;
}
sqlist.h
#ifndef CIRCLE_H
#define CIRCLE_H
#define InitSize 100
typedef int ElemType;
typedef struct SqList{
ElemType *data;//动态分配
int length;
int MaxSize;
}SqList;
void InitSqList(SqList &L);//初始化
void DestroySqList(SqList &L);//销毁
bool GetElem(SqList L,int i,ElemType &e);//按位查找
int LocateElem(SqList L,ElemType e);//按值查找
bool IncreaseElem(SqList &L,int i,ElemType e);//插入
bool DeleteElem(SqList &L,int i,ElemType &e);//删除
bool Empty(SqList L);//判空
void PrintList(SqList L);//打印输出
void CreateSqList(SqList &L);//创建
void IncreaseSize(SqList &L,int len); //扩容
void Insert(SqList &L);
void Delete(SqList &L);
void Get(SqList L);
void Locate(SqList L);
void IncreaSize(SqList &L);
#endif