顺序表的相关操作

顺序表的相关操作

操作有:

初始化,查找,插入,删除,获取指定元素下标,和排序。

代码写于2017年2月。

#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAX 100
using namespace std;

typedef struct List
{
	int data [MAX];
	int length;
};

struct rule
{
	bool operator () (const int &a1,const int &a2)
	{
		return a1 < a2;
	}
};

void print (List &list,int length);
int initatelist(List &list,int length);
int insert (List &list,int index, int element);
int del (List &list,int index);
int search_1(List &list,int element);
int search_2(List &list,int element);
int search_3(List &list,int element,int left,int right);
int get_element(List &list,int index);
void bubblesort(List &list,int length);
void selectionsort(List &list,int length);
void insertionsort(List &list,int length);


int main()
{
	List list;
	list.length=0;
	int a;

	while (1)
	{
			cout << "进行如下操作:"<<endl;
			cout <<"1.初始化顺序表"<<endl;
			cout <<"2.插入元素"<<endl;
			cout <<"3.删除元素"<<endl;
			cout <<"4.查找元素"<<endl;
			cout <<"5.提取元素"<<endl;
			cout <<"6.排序"<<endl;
			cin >> a;
		switch (a)
		{
		case 1:{
			    memset(list.data,0,sizeof(int)*MAX);
				int b;
				cout << "需要添加的元素数量"<<endl;
				cin >>b;
				initatelist(list,b);
				print(list,list.length);
				}break;
		case 2:{
				int b,c;
				cout << "想在哪一个位置插入数据:";
				cin >> b;
				cout << "所插入的数据为:";
				cin >>c;
				insert(list,b,c);
				print(list,list.length);
			   }break;
		case 3:{
				int b;
				cout << "想在哪一个位置删除数据:";
				cin >> b;
				del(list,b);
				print(list,list.length);
			   }break;
		case 4:{
				int a,b;
				cout <<"想要查找的数据:";
				cin >> b;
				a=search_3(list,b,0,list.length-1);
				if (a != -1)
					cout << "对应的数组下标为"<< a<<endl;
				else
					cout << "查找失败,该数据不在顺序表中"<<endl;
			}break;
		case 5:
			{	int a,b;
				cout <<"数组下标为:";
				cin >> b;
				a=get_element(list,b);
				if (a != -1)
					cout << "数组下标对应的元素为"<<a<<endl;
				else
					cout << "查找失败,该数据不在顺序表中"<<endl;
			}break;
		case 6:
			{
				cout << "排序算法:"<<endl;
				cout << "1.冒泡排序"<<endl;
				cout << "2.选择排序"<<endl;
				cout << "3.插入排序"<<endl;
				cout << "4.std sort排序"<<endl;
				int a;
				cin>>a;
				switch (a)
				{
				case 1:{
						bubblesort(list,list.length);
						print(list,list.length);
					   }break;

				case 2:{
						selectionsort(list,list.length);
						print(list,list.length);
					   }break;

				case 3:{
						insertionsort(list,list.length); 
						print(list,list.length);
					   }break;
				case 4:{
					sort(list.data,list.data+list.length,rule()); 
						print(list,list.length);
					   }break;
				}
			}break;

	}
 }
	return 0;
}

void print (List &list,int length)//打印该顺序表
{
	for (int i = 0;i < length; i++)
	{
		cout<<list.data[i]<<" ";
	}
}
int initatelist(List &list,int length)//顺序表的初始化								
{
	for (int i = 0;i < length; i++)
	{
		cout<<"请输入元素:";
		cin>>list.data[i];
	}
	list.length = length;
	return list.length;
}

int insert (List &list,int index, int element)//顺序表的插入操作
{
	
	if (index > MAX)
		cout << "超过顺序表的大小的限制";
	if (index < 0)
		cout << "输入数值非法";
	for (int i = list.length-1;i >= index-1;i--)
		list.data[i+1] = list.data[i];
	list.data[index-1] = element;
	list.length++;
	return list.length;
}

int del (List &list,int index)//顺序表的删除操作
{
	if (index > MAX)
		cout << "超过顺序表的大小的限制";
	if (index < 0)
		cout << "输入数值非法";
	for (int i = index;i < list.length;i++)
		list.data[i-1]=list.data[i];
	list.length--;
	return list.length;
}

int search_1(List &list,int element)//普通查找
{
	if (element >= list.length)
		cout << "超过顺序表的大小的限制";
	if (element < 0)
		cout << "输入数值非法";
	for (int i=0;i < list.length;i++)
		if (element == list.data[i])
			return i;
	return -1;
}

int search_2(List &list,int element)//使用监督元技术的查找
{
	insert (list,1,element);
	int i = list.length-1;
	while (list.data[i] != element)
		i--;
	del(list,1);
	return i-1;
}

int search_3(List &list,int element,int left,int right)//二分法查找
{
	int mid;
	if (list.data[left] > list.data[right])
		return -1;
	mid = (left + right) / 2;
	if (element == list.data[mid])
		return mid;
	if (element > list.data[mid])
		return search_3(list,element,mid+1,right);
	if (element < list.data[mid])
		return search_3(list,element,left,mid-1); 
}

int get_element(List &list,int index)//从给定下标中得到元素
{
	if (index < list.length && index >= 0)
		return list.data[index];
	else
		return -1;
}

void bubblesort(List &list,int length)//冒泡排序
{
	int i,j,tmp;
	for (i=0;i < length-1;i++)
		for (j = 0;j < length-1-i;j++)
			if (list.data[j] > list.data[j+1])
			{
				tmp = list.data[j];
				list.data[j] = list.data[j+1];
				list.data[j+1] = tmp;
			}			
}

void selectionsort(List &list,int length)//选择排序
{
	for (int i=0; i < length; i++)
	{
		int tmp = i;
		for (int j = i;j < length; j++)
			if (list.data[j] < list.data[tmp])
				tmp = j;
	
	int swap = list.data[i];
	list.data[i] = list.data[tmp];
	list.data[tmp] = swap;
	}
}

void insertionsort(List &list,int length)//插入排序
{
	for (int i = 1;i < length;i++)
		for (int j = 0;j < i;j++)
		{
			if (list.data[j] > list.data[i])
			{
				int tem = list.data[i];
				for (int k = i; k > j;k--)
					list.data[k] = list.data[k-1];
				list.data[j] = tem;
				break;
			}
		}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值