一、实验目的
1、熟练掌握线性表的结构特点,掌握顺序表的基本操作。
2、巩固 C++相关的程序设计方法与技术。
3、学会使用顺序表解决实际问题。
二、实验内容
1、顺序表的建立与操作实现
建立n个元素的顺序表(n 的大小和表里数据自己确定),实现相关的操作:输出,插入,删除,查找等功能。编写完整程序实现,程序语言不限定,使用技术形式不定。
三、实验步骤
主程序
功能:
1. 添加结点
2. 显示结点
3. 插入结点
4. 查找结点
5. 删除结点
四、实现代码
1、类定义
struct Xinxi//struct数据表要用的结构
{
string StudentID;//学号.字符串类型
string name;//名字
int age;//年龄
};
struct SLType //顺序表结构
{
Xinxi LisXinxi[LEN + 1];//保存顺序表的结构 数组
int ListLen;//保存点数量
};
2、顺序表的功能
①初始化顺序表
void SLRe(SLType *SL)////初始化顺序表,定义结构体指针 SL
{
SL->ListLen = 0;//初始化结点数量
}
②结点数量
int SLLenght(SLType *SL)
{
return(SL->ListLen);//返回结点数量
}
③添加结点
int SLAdd(SLType *SL, Xinxi xinxi)//添加结点
{
if (SL->ListLen >= LEN)//若超过最大长度
{
cout << "顺序表已满,添加失败" << endl;
return 0;//不再返回值
}
SL->LisXinxi[++SL->ListLen] = xinxi;//从1开始添加,每次添加都加1
return 1;
}
④插入结点
int SLInsert(SLType *SL, int n, Xinxi xinxi)//插入结点
{
int i;
if (SL->ListLen >= LEN)//若超过最大长度
{
cout << "顺序表已满,添加失败" << endl;
return 0;//不再返回值
}
if (n<1 || n>SL->ListLen)//插入结点的序号要大于0小于最大长度
{
cout << "序号输入错误" << endl;
return 0;
}
for (i = SL->ListLen; i >= n; i--)
{
SL->LisXinxi[i + 1] = SL->LisXinxi[i];//将顺序表中的数据向后移动
}
SL->LisXinxi[n] = xinxi;
SL->ListLen++;////顺序表结点数量+1
return 1;
}
⑤删除结点
int SLDelete(SLType *SL, int n)//删除结点
{
int i;
if (n<1 || n>SL->ListLen)//判断
{
cout << "序号输入错误" << endl;
return 0;
}
for (i = n; i < SL->ListLen; i++)
{
SL->LisXinxi[i] = SL->LisXinxi[i + 1];//将数据表数据向前移
}
SL->ListLen--;///顺序表结点数量-1
return 1;
}
⑥查找结点
Xinxi * SLFind(SLType *SL, int n)//根据序号查找结点
{
if (n<1 || n>SL->ListLen)
{
cout << "序号输入错误" << endl;
return 0;
}
return &(SL->LisXinxi[n]);//指针返值
}
⑦ 显示所有结点
void SLAll(SLType *SL)//显示所有结点
{
int i;
for (i = 1; i <= SL->ListLen; i++)
{
cout << "学号:" << SL->LisXinxi[i].StudentID << ",名字:" << SL->LisXinxi[i].name << ",age:" << SL->LisXinxi[i].age << endl;
}//循环逐个显示
}
3、主函数
int main()
{
int i;
int b;
SLType SL;
Xinxi xinxi;
Xinxi *pxinxi;
string name;
cout << "*********顺序表*********\n" << endl;
SLRe(&SL);//初始化
do//添加结点
{
cout << "学号 姓名 年龄 :";
cin >> xinxi.StudentID >> xinxi.name >> xinxi.age;//输入数据
cout << "按1继续添加,0退出 : ";
cin >> b;
if (!b)
{
break;
}
if (xinxi.age)// 年龄不为0
{
if (!SLAdd(&SL, xinxi))//结点满了
{
break; //退出循环
}
}
else
{
break;
}
} while (1);
cout << "顺序表中的结点为: " << endl;
SLAll(&SL); //显示结点
cout << "请输入要查找的结点序号:";
cin >> i;
pxinxi = SLFind(&SL, i);
if (pxinxi)
{
cout << "第" << i << "个结点为:学号" << pxinxi->StudentID << ",名字" << pxinxi->name << ",年龄" << pxinxi->age << endl;
}
cout << "请输入您要删除的结点的序号:";
cin >> i;
if (SLDelete(&SL, i))
{
cout << "数据删除成功" << endl;
SLAll(&SL);
}
return 0;
}
因为时间关系(其实是偷懒,我就没有把数据插入的功能写进主函数里了)
完整代码
#include
#include
#include
using namespace std; //使用标准库,防重复
#define LEN 10 //顺序表长度
/********类定义*******/
struct Xinxi//struct数据表要用的结构
{
string StudentID;//学号.字符串类型
string name;//名字
int age;//年龄
};
struct SLType //顺序表结构
{
Xinxi LisXinxi[LEN + 1];//保存顺序表的结构 数组
int ListLen;//保存点数量
};
/**********顺序表功能***************/
void SLRe(SLType *SL)////初始化顺序表,定义结构体指针 SL
{
SL->ListLen = 0;//初始化结点数量
}
int SLLenght(SLType *SL)
{
return(SL->ListLen);//返回结点数量
}
int SLAdd(SLType *SL, Xinxi xinxi)//添加结点
{
if (SL->ListLen >= LEN)//若超过最大长度
{
cout << "顺序表已满,添加失败" << endl;
return 0;//不再返回值
}
SL->LisXinxi[++SL->ListLen] = xinxi;//从1开始添加,每次添加都加1
return 1;
}
int SLInsert(SLType *SL, int n, Xinxi xinxi)//插入结点
{
int i;
if (SL->ListLen >= LEN)//若超过最大长度
{
cout << "顺序表已满,添加失败" << endl;
return 0;//不再返回值
}
if (n<1 || n>SL->ListLen)//插入结点的序号要大于0小于最大长度
{
cout << "序号输入错误" << endl;
return 0;
}
for (i = SL->ListLen; i >= n; i--)
{
SL->LisXinxi[i + 1] = SL->LisXinxi[i];//将顺序表中的数据向后移动
}
SL->LisXinxi[n] = xinxi;
SL->ListLen++;////顺序表结点数量+1
return 1;
}
int SLDelete(SLType *SL, int n)//删除结点
{
int i;
if (n<1 || n>SL->ListLen)//判断
{
cout << "序号输入错误" << endl;
return 0;
}
for (i = n; i < SL->ListLen; i++)
{
SL->LisXinxi[i] = SL->LisXinxi[i + 1];//将数据表数据向前移
}
SL->ListLen--;///顺序表结点数量-1
return 1;
}
Xinxi * SLFind(SLType *SL, int n)//根据序号查找结点
{
if (n<1 || n>SL->ListLen)
{
cout << "序号输入错误" << endl;
return 0;
}
return &(SL->LisXinxi[n]);//指针返值
}
void SLAll(SLType *SL)//显示所有结点
{
int i;
for (i = 1; i <= SL->ListLen; i++)
{
cout << "学号:" << SL->LisXinxi[i].StudentID << ",名字:" << SL->LisXinxi[i].name << ",age:" << SL->LisXinxi[i].age << endl;
}//循环逐个显示
}
/*******主函数********/
int main()
{
int i;
int b;
SLType SL;
Xinxi xinxi;
Xinxi *pxinxi;
string name;
cout << "*********顺序表*********\n" << endl;
SLRe(&SL);//初始化
do//添加结点
{
cout << "学号 姓名 年龄 :";
cin >> xinxi.StudentID >> xinxi.name >> xinxi.age;//输入数据
cout << "按1继续添加,0退出 : ";
cin >> b;
if (!b)
{
break;
}
if (xinxi.age)// 年龄不为0
{
if (!SLAdd(&SL, xinxi))//结点满了
{
break; //退出循环
}
}
else
{
break;
}
} while (1);
cout << "顺序表中的结点为: " << endl;
SLAll(&SL); //显示结点
cout << "请输入要取出的结点序号:";
cin >> i;
pxinxi = SLFind(&SL, i);
if (pxinxi)
{
cout << "第" << i << "个结点为:学号" << pxinxi->StudentID << ",名字" << pxinxi->name << ",年龄" << pxinxi->age << endl;
}
cout << "请输入您要删除的结点的序号:";
cin >> i;
if (SLDelete(&SL, i))
{
cout << "数据删除成功" << endl;
SLAll(&SL);
}
return 0;
}
本来没想到用指针来实现大部分功能的,不过因为数据表适合用指针来做,而且看到很多人都是用指针来写所以也就借鉴了,本来对指针很陌生的我写完这个程序后熟悉了很多。写得不算太好,有点偷工减料(没有列成一个选项来让人选)。