⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 seqlist.h

📁 对顺序存储的线性表进行一些操作。主要包括:各种位置的插入、删除操作、显示数据、查找、更新、统计以及学生数据文件的读写操作等。要求线性表采用类的定义
💻 H
字号:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const int defaultSize=100;
struct Student
{
	string stu_code;								
	string stu_name;								
	string stu_sex;									
};
class SeqList
{
private:
	int * data;										//顺序表数组
	int maxSize;									//顺序表最大长度
	int last;										//顺序表最后一位
public:
	SeqList()										//构造函数
	{
		last=0;
		maxSize=defaultSize;
		data = new int [defaultSize];
	}
	SeqList(SeqList & L);							//拷贝构造函数
	~SeqList()										//析构函数
	{
		Student * p;
		for (int i = 0; i <= last-1; i++)			//释放结构体的内存空间
		{
			p=(struct Student *)data[i];
			delete p;
		}
		delete []data;								//释放动态数组的内存空间
	}
	int getData(int i)const							//取第i项的值
	{return data[i];}
	int Size()const									//取顺序表大小
	{return maxSize;}
	int IsFull()									//判断顺序表是否为满
	{return (last == maxSize)? 0 : 1;	}
	int IsEmpty()									//判断顺序表是否为空
	{return (last == 0) ? 0 : 1 ;	}	
	int Length()const								//取顺序表最后一项位置
	{return last;}
	void input();													//输入学生信息
	void output();													//输出学生信息
	void Insert(int x,string code,string name,string sex);			//插入学生信息
	void Replace(int i,string code,string name,string sex);			//修改学生信息
	int Remove(int i);												//删除学生信息
	void Search(int t,string x);									//搜索学生信息
	int print(int i);												//输入第i项的值
	int Export();													//将顺序表的值保存
};



SeqList::SeqList(SeqList & L)										//拷贝构造函数
{
	maxSize = L.Size();
	last = L.Length();
	data = new int[maxSize];
	if (data == NULL)
	{
		cerr<<"内存分配错误!"<<endl;
		exit(1);
	}
	for (int i = 0; i <= last-1; i++)
		data[i] = L.getData(i);
}


void SeqList::Insert(int x,string code,string name,string sex)		//插入学生信息
{
	if(x < 1|| x > last+1)
	{
		cerr<<"插入位置非法!"<<endl;
		system("pause");
		return;
	}
	Student * p=new Student;										//申请新的student空间
	if (x == last+1)												//插入的位置为顺序表结尾
	{
		data[last]=(int)p;											//将新申请到的空间地址写入插入位置
		p->stu_code=code;											//通过指针赋值
		p->stu_name=name;
		p->stu_sex=sex;
		last++;
		return;
	}
	for (int j = last; j>= x; j--)									//插入位置为顺序表中间
		data[j]=data[j-1];											//顺序表值依次后移
	data[x-1]=(int)p;												//将新申请到的空间地址写入插入位置
	p->stu_code=code;												//通过指针赋值
	p->stu_name=name;
	p->stu_sex=sex;	
	last++;
}



void SeqList::Replace(int i,string code,string name,string sex)
{
	Student * p;													//新建结构体指针
	p=(struct Student *)data[i-1];									//将顺序表储存的数据转化为指针值
	p->stu_code=code;												//通过指针修改
	p->stu_name=name;
	p->stu_sex=sex;
	return;
}



int SeqList::Remove(int i)
{
	if(i < 1 || i > last )
	{
		cerr<<"删除位置非法!"<<endl;
		system("pause");
		return 0;
	}
	Student * p;													//新建结构体指针
	p=(struct Student *)data[i-1];									//将顺序表储存的数据转化为指针值
	for (int j = i; j <= last-1; j++)								//顺序表前移
		data[j-1] = data[j];
	last--;
	delete p;														//释放结构体空间
	return 1;
}



void SeqList::Search(int t,string x)
{
	int id,i,j=0;
	int * data1;													//定义一个存放结果位置的数组
	data1 = new int [last];
	Student *p;														//新建结构体指针
	switch(t)
	{
	case 1:															//学号查询
		for (i = 0; i<=last - 1; i++)
		{
			p=(struct Student *)data[i];
			if (p->stu_code == x)
			{data1[j]=i;	j++;}
		}
		break;
	case 2:															//姓名查询
		for (i = 0; i<=last - 1; i++)
		{
			p=(struct Student *)data[i];
			if (p->stu_name == x)
			{data1[j]=i;	j++;}
		}
		break;
	case 3:															//性别查询
		for (i = 0; i<=last - 1; i++)
		{
			p=(struct Student *)data[i];
			if (p->stu_sex == x)
			{data1[j]=i;j++;}
		}
		break;
	}
	if (data1[0]<0)
		{
			cerr<<"所查询的信息不存在!"<<endl;
			system("pause");
			return;
		}
	for (i=0; i<=j-1; i++)											//输出查询到的值
	{	
		id=data1[i];
		cout<<i+1<<"   第"<<data1[i]+1<<"项:"<<endl;
		print(id);
	}
	system("pause");
	return;
}



void SeqList::input()
{
	cout<<"开始建立顺序表,请输入表中元素个数:";
	while(1)
	{
		cin>>last;
		if (last<=maxSize-1 && last >= 1) break;
		cout<<"表元素个数输入有误!"<<endl;
	}
	for (int i=0; i<= last-1; i++)
	{
		Student *p=new Student;										//新建结构体
		data[i]=(int)p;												//将申请到的结构体空间地址写入顺序表中
		cout<<"请输入第"<<i+1<<"个学生的学号:";
		cin>>p->stu_code;
		cout<<"请输入第"<<i+1<<"个学生的姓名:";
		cin>>p->stu_name;
		cout<<"请输入第"<<i+1<<"个学生的性别:";
		cin>>p->stu_sex;
		cout<<"第"<<i+1<<"个学生"<<p->stu_name<<"的信息录入完成"<<endl;
		system("pause");
	}
	return;
}



void SeqList::output()
{
	cout<<"顺序表当前元素最后位置为:"<<last<<endl;
	for(int i = 0; i<= last-1; i++)
	{
		Student *p;
		p=(struct Student *)data[i];
		cout<<i+1<<":"<<endl;
		cout<<"学号:"<<p->stu_code<<endl;
		cout<<"姓名:"<<p->stu_name<<endl;
		cout<<"性别:"<<p->stu_sex<<endl;
	}
	system("pause");
	return;
}



int SeqList::print(int i)
{
	if(i < 0|| i > last)
	{
		cerr<<"位置非法!"<<endl;
		system("pause");
		return 0;
	}
	Student *p;
	p=(struct Student *)data[i];
	cout<<"学号:"<<p->stu_code<<endl;
	cout<<"姓名:"<<p->stu_name<<endl;
	cout<<"性别:"<<p->stu_sex<<endl;
	return 1;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -