数据结构-DS顺序表


前言

初学数据结构,记录一下这几个最基本的操作。


【id:17】【25分】A. DS顺序表–类实现

题目描述

用C++语言和类实现顺序表

属性包括:数组、实际长度、最大长度(设定为1000)

操作包括:创建、插入、删除、查找

类定义参考
在这里插入图片描述


输入

第1行先输入n表示有n个数据,即n是实际长度;接着输入n个数据
第2行输入要插入的位置和新数据
第3行输入要插入的位置和新数据
第4行输入要删除的位置
第5行输入要删除的位置
第6行输入要查找的位置
第7行输入要查找的位置


输出

数据之间用空格隔开

第1行输出创建后的顺序表内容,包括顺序表实际长度和数据

每成功执行一次操作(插入或删除),输出执行后的顺序表内容

每成功执行一次查找,输出查找到的数据

如果执行操作失败(包括插入、删除、查找等失败),输出字符串error,不必输出顺序表内容


输入样例1

6 11 22 33 44 55 66
3 777
1 888
1
9
0
5

输出样例1

6 11 22 33 44 55 66 
7 11 22 777 33 44 55 66 
8 888 11 22 777 33 44 55 66 
7 11 22 777 33 44 55 66 
error
error
44

提示
第i个位置是逻辑意义的位置,从1开始,在实际编程用数组,从0开始,对应数组i-1位置


#include<iostream>
using namespace std;
#define ok 0
#define error -1

// 顺序表类定义
class SeqList
{
private:
    int *list;      // 元素数组
    int maxsize;    // 顺序表最大长度
    int size;       // 顺序表实际长度
public:
    SeqList();                          // 构造函数
    ~SeqList();                         // 析构函数
    int list_size()
    {
        return size;
    }                   // 获取顺序表实际长度

    int list_insert(int i, int item)
    {
        if(i<1 || i>size+1)
        {
            cout<<"error"<<endl;
            return error;
        }
        for(int j=size;j>i-1;j--)
        {
            list[j]=list[j-1];
        }
        list[i-1]=item;
        size++;
        list_display();
        return ok;
    }  // 插入一个元素,参数是插入的数值和位置

    int list_del(int i)
    {
        if(i<1 || i>size)
        {
            cout<<"error"<<endl;
            return error;
        }
        for(int j=i-1;j<size;j++)
        {
                list[j]=list[j+1];
        }
        size--;
        list_display();
        return ok;
    }           // 删除一个元素,参数是删除的位置

    int list_get(int i)
    {
        if(i<1 || i>size)
        {
            cout<<"error"<<endl;
            return error;
        }
        cout<<list[i-1]<<endl;
        return ok;
    }             // 获取一个元素,参数是获取的位置

    void list_display()
    {
            cout<<size<<" ";
            for(int i=0;i<size;i++)
            {
                cout<<list[i]<<" ";
            }
            cout<<endl;
    }                // 输出整个顺序表

    void list_initlist()
    {
        int n;
        cin>>n;
        if(n>=0 && n<=maxsize)
        {
            for(int i=0;i<n;i++)
            {
                cin>>*(list+i);
                size++;
            }
        }
        list_display();
    }			//输入顺序表初始数据
};

SeqList::SeqList()
{
    maxsize = 1000;
    size = 0;
    list = new int[maxsize];
}
SeqList::~SeqList()
{
    delete []list;
}

int main()
{
	SeqList res;
	res.list_initlist();
	int it,num;
	cin >> it >> num;
	res.list_insert(it,num);
	cin >> it >> num;
	res.list_insert(it,num);
	cin >> it;
	res.list_del(it);
	cin >> it;
	res.list_del(it);
	cin >> it;
	res.list_get(it);
	cin >> it;
	res.list_get(it);
	return 0;
}


【id:18】【25分】B. DS顺序表–连续操作

题目描述

建立顺序表的类,属性包括:数组、实际长度、最大长度(设定为1000)

该类具有以下成员函数:

构造函数:实现顺序表的初始化。

插入多个数据的multiinsert(int i, int n, int item[])函数,实现在第i个位置,连续插入来自数组item的n个数据,即从位置i开始插入多个数据。

删除多个数据的multidel(int i, int n)函数,实现从第i个位置开始,连续删除n个数据,即从位置i开始删除多个数据。

编写main函数测试该顺序表类。


输入

第1行先输入n表示有n个数据,即n是实际长度;接着输入n个数据

第2行先输入i表示插入开始的位置,再输入k表示有k个插入数据,接着输入k个数据

第3行先输入i表示删除开始的位置,再输入k表示要删除k个数据


输出

顺序表内容包括顺序表的实际长度和数据,数据之间用空格隔开

第1行输出创建后的顺序表内容

第2行输出执行连续插入后的顺序表内容

第3行输出执行连续删除后的顺序表内容


输入样例1

6 11 22 33 44 55 66
2 3 99 88 77
4 5

输出样例1

6 11 22 33 44 55 66 
9 11 99 88 77 22 33 44 55 66 
4 11 99 88 66 

#include<iostream>
using namespace std;

class SeqList
{
private:
	int* list;
	int maxsize;
	int size;
public:
	SeqList();
	~SeqList();
	void push_back(int i);
	void multiinsert(int i,int n,int item[]);
	void multidel(int i, int n);
	void display();
};
SeqList::SeqList()
{
	maxsize = 1000;
	size = 0;
	list = new int[maxsize];
}

SeqList::~SeqList()
{
	delete[]list;
}

void SeqList::push_back(int i)
{
	list[size] = i;
	size++;
}

void SeqList::multiinsert(int i, int n, int item[])
{
	if (i<0 || i>size+1)
	{
		cout << "error" << endl;
	}
	for (int j = size-1; j >= i-1; j--)
	{
		list[j+n] = list[j];
	}
	for (int j = i-1, k=0; k < n; j++,k++)
	{
		list[j] = item[k];
	}
	size += n;
	display();
}

void SeqList::multidel(int i,int n)
{
	if (i <= 0 || i > size)
	{
		cout << "error" << endl;
	}
	for (int j = i-1; j <= size; j++)
	{
		list[j] = list[j + n];
	}
	size -= n;
	display();
}
void SeqList::display()
{
	cout << size << " ";
	for (int i = 0; i < size; i++)
	{
		cout << list[i] << " ";
	}
	cout << endl;
}
int main()
{
	int n,num;
	cin >> n;
	SeqList l;
	for (int i = 0; i < n; i++)
	{
		cin >> num;
		l.push_back(num);
	}
	l.display();
	int location,k;
	cin >> location>>k;
	int* p = new int[k];
	for (int i = 0; i < k; i++)
	{
		cin >> p[i];
	}
	l.multiinsert(location,k,p);
	cin >> location >> k;
	l.multidel(location, k);
	delete[]p;
	//system("pause");
	return 0;
}

【id:19】【25分】C. DS顺序表–合并操作

题目描述

建立顺序表的类,属性包括:数组、实际长度、最大长度(设定为1000)

已知两个递增序列,把两个序列的数据合并到顺序表中,并使得顺序表的数据递增有序


输入

第1行先输入n表示有n个数据,接着输入n个数据,表示第1个序列,要求数据递增互不等

第2行先输入m表示有m个数据,接着输入m个数据,表示第2个序列,要求数据递增互不等

输出

顺序表内容包括顺序表的实际长度和数据,数据之间用空格隔开

第1行输出创建后的顺序表内容


输入样例1

3 11 33 55
5 22 44 66 88 99

输出样例1

8 11 22 33 44 55 66 88 99 

#include<iostream>
using namespace std;

class SeqList
{
private:
	int* list;
	int maxsize;
	int size;
public:
	SeqList();
	~SeqList();
	void push_back(int i);
	void display();
	void sum(SeqList& a, SeqList& b, SeqList& c);
};

SeqList::SeqList()
{
	maxsize = 1000;
	size = 0;
	list = new int[maxsize];
}
SeqList::~SeqList()
{
	delete[]list;
}

void SeqList::push_back(int i)
{
	list[size] = i;
	size++;
}

void SeqList::sum(SeqList& a, SeqList& b,SeqList& c)
{
	int i = 0;
	int j = 0;
	int k = 0;
	while (i < a.size && j < b.size)
	{
		if (a.list[i] <= b.list[j])
		{
			c.list[k++] = a.list[i++];
		}
		else
		{
			c.list[k++] = b.list[j++];
		}
	}
	while (i < a.size)
	{
		c.list[k++] = a.list[i++];
	}
	while (j < b.size)
	{
		c.list[k++] = b.list[j++];
	}
	c.size = k;
}
void SeqList::display()
{
	cout << size << " ";
	for (int i = 0; i < size; i++)
	{
		cout << list[i] << " ";
	}
	cout << endl;
}

int main()
{
	int l1;
	cin >> l1;
	int num;
	SeqList s1;
	for (int i = 0; i < l1; i++)
	{
		cin >> num;
		s1.push_back(num);
	}
	int l2;
	cin >> l2;
	SeqList s2;
	for (int i = 0; i < l2; i++)
	{
		cin >> num;
		s2.push_back(num);
	}
	SeqList c;
	c.sum(s1, s2,c);
	c.display();
	system("pause");
	return 0;
}

【id:20】【25分】D. DS顺序表之循环移位

题目描述

顺序表的移位是循环移位,例如顺序表:1,2,3,4,5,6。如果左移1位,即原来的头元素移动到末尾,其它元素向左移1位,变成2,3,4,5,6,1。同理,如果右移1位,即原来的尾元素移动到头,其它元素向右移1位,变成6,1,2,3,4,5。以下是移位的多个例子:

原数据:1,2,3,4,5,6

左移3位:4,5,6,1,2,3,与原数据对比

右移4位:3,4,5,6,1,2,与原数据对比

请编写程序实现顺序表的循环移位操作


输入
第1行输入n表示顺序表包含的·n个数据

第2行输入n个数据,数据是小于100的正整数

第3行输入移动方向和移动的位数,左移方向为0,右移方向为1

第4行输入移动方向和移动的位数,左移方向为0,右移方向为1

注意:移动操作是针对上一次移动后的结果进行的

输出
第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开

第二行输出第一次移位操作后,顺序表内的所有数据,数据之间用空格隔开

第三行输出第二次移位操作后,顺序表内的所有数据,数据之间用空格隔开


输入样例1

5
11 22 33 44 55
0 2
1 4

输出样例1

11 22 33 44 55 
33 44 55 11 22 
44 55 11 22 33 

#include<iostream>
using namespace std;
class SeqList 
{
private:
	int* list;
	int maxsize;
	int size;
public:
	SeqList();
	~SeqList();
	void push_back(int i);
	void display();
	void move(int flag, int n);
};

SeqList::SeqList()
{
	maxsize = 1000;
	size = 0;
	list = new int[maxsize];
}

SeqList::~SeqList()
{
	delete[]list;
}

void SeqList::push_back(int i)
{
	list[size] = i;
	size++;
}

void SeqList::display()
{
	for (int i = 0; i < size; i++)
	{
		cout << list[i] << " ";
	}
	cout << endl;
}
void SeqList::move(int flag, int n)
{
	int* temp = new int[size];  //temp相当于一个副本,原数组可以直接进行操作来修改
	for (int i = 0; i < size; i++)
	{
		temp[i] = list[i];
	}
	if (!flag)  //左移
	{
		for (int i = 0; i < size - n; i++)  //到头之前
		{
			list[i] = temp[i + n];
		}
		for (int i=size - n; i < size; i++)  //循环
		{
			list[i] = temp[i - (size - n)];
		}
		display();
	}
	else  //右移
	{
		for (int i = n; i < size; i++)
		{
			list[i] = temp[i - n];
		}
		for (int i = 0; i < n; i++)
		{
			list[i] = temp[size - n + i];
		}
		display();
	}
	delete[]temp;
}
int main()
{
	int n,num;
	cin >> n;
	SeqList s;
	for (int i = 0; i < n; i++)
	{
		cin >> num;
		s.push_back(num);
	}
	s.display();
	int flag = 0;
	int location = 0;
	cin >> flag >> location;
	s.move(flag, location);
	cin >> flag >> location;
	s.move(flag, location);
	//system("pause");
	return 0;
}

总结

顺序表相关操作不熟练…

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值