c++实现顺序表

本文介绍了一个使用C++实现的线性表类,包括基本操作如插入、删除、查找等,并提供了一个简单的用户交互界面来进行这些操作。通过实例演示了如何动态调整线性表的容量。
#pragma once

#include<string>
#include<iostream>
using namespace std;
class SeqList
{
public:
	SeqList(int sz, int leng);  //构造函数
	void mune(); //菜单
	void resize(int newSize); //扩容    
	int length() { return len; }//表长度
	void input(); //输入线性表中的元素          
	void output(); //输出线性表中的元素
	int search(int x);//在表中顺序搜索x
	int get(int i); //在表中取出索引为i的元素      
	int insert(int x, int i); //在索引i处插入x 
	int add(int x); //插入表尾
	int remove(int i);//删除第i个位置处的表项  

private:
	int *data;  //表的存放数组 
	int maxSize;  //表的最大可容纳项数 
	int len;//表实际长度      
};


#include "SeqList.h"


//构造函数
SeqList::SeqList(int sz, int leng):maxSize(sz), len(leng)
{
	data = new int[maxSize];
}

void SeqList::mune()
{
	cout << "**********************" << endl
		<< "1: 添加元素              " << endl
		<< "2: 插入元素              " << endl
		<< "3: 删除元素              " << endl
		<< "4: 查找元素              " << endl
		<< "5: 取表元素              " << endl
		<< "6: 显示线性表             " << endl
		<< "7: 清屏                  " << endl
		<< "8: 扩大顺序表容量          " << endl
		<< "(除菜单序号外,按任意键退出顺序表操作)          " << endl
		<< "**********************" << endl;
}






//扩容
void SeqList::resize(int newSize)
{
	int *p = this->data;
	data = new int[newSize];
	for (int i = 0; i < this->len; i++)
	{
		data[i] = p[i];
	}
	this->maxSize = newSize;
	delete []p;
	cout << "顺序表的最大容量已扩容为:"<< this->maxSize << endl;
}

//输入线性表中的元素
void SeqList::input()
{
	for (int i = 0; i < this->len; i++)
	{
		cin >> this->data[i];
	}
}

//输出线性表中的元素
void SeqList::output()
{
	cout << "线性表元素:";
	cout << "< ";
	for (int i = 0; i < this->len; i++)
	{
		cout << this->data[i] << " ";
	}
	cout << ">" << endl;
	cout << "线性表当前长度:";
	cout << this->len << endl;
}

//在表中顺序搜索x
int SeqList::search(int x)
{
	for (int i = 0; i < len; i++)
	{
		if (this->data[i] == x)
		{
			return 1;
		}
	}
	return 0;
}

//在表中取出索引为i的元素
int SeqList::get(int i)
{
	if (i < 1 || i > this->len)
	{
		return 0;
	}
	
	return this->data[i - 1];
	
}

//在索引i处插入x 
int SeqList::insert(int i, int x)
{
	if (i < 1 || i > this->len + 1 || this->len == this->maxSize)
	{
		cout << "插入元素失败!" << endl;
		return 0;
	}
	for (int j = this->len - 1; j >= i - 1; j--)
	{
		data[j + 1] = data[j];
	}
	data[i - 1] = x;
	this->len++;
	return this->data[i - 1];
}

//插入表尾
int SeqList::add(int x)
{
	if (this->len == this->maxSize)
	{
		cout << "插入元素失败!" << endl;
		return 0;
	}
	this->data[len] = x;
	return this->data[len];
}

//删除第i个位置处的表项 
int SeqList::remove(int i)
{
	if (this->len == 0 || i < 1 || i > len)
	{
		cout << "删除元素失败!" << endl;
		return 0;
	}

	int x = this->data[i - 1];

	for (int j = i - 1; j < len; j++)
	{
		this->data[j] = this->data[j + 1];
	}
	this->len--;
	return x;
}

#include"SeqList.h"

int main() 
{
	//初始化线性表
	SeqList l(5, 3);
	
	l.mune();
		

	int op, m, x, j, find, k, result, newsize = 0;

	while (1) 
	{
		cout << "--------------- 我是分割线 ----------------" << endl;
		cout << "请选择操作代码:" << endl;
		cin >> op;
		
		switch (op) {
		case 1:  cout << "请输入要添加的元素:" << endl;
			l.input();
			break;
		case 2:  cout << "请分别输入要插入的位置和元素(用空格分隔):" << endl;
			
			cin >> m >> x;
			l.insert(m, x);
				break;
		case 3:  cout << "请输入要删除元素的位置:" << endl;
		
			cin >> j;
			l.remove(j);
				break;
		case 4:  cout << "请输入要查找的元素:" << endl;
			
			cin >> find;
			result = l.search(find);
			if (result == 1)
			{
				cout << "查找成功,顺序表中查找到的元素是:" << find << endl;
			}
			else
			{
				cout << "查找失败,顺序表中不存在该元素!" << endl;
			}
				break;
		case 5:  cout << "请输入要取元素的位置:" << endl;
			
			cin >> k;
			l.get(k);
				break;
		case 6:   
			l.output();
			break;
		case 7:
			system("cls");
			break;
		case 8:
			cout << "输入新的顺序表大小:" << endl;
			cin >> newsize;
			l.resize(newsize);
			break;
		default: 
			exit(0);
			break;
		}
	}

	return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值