顺序表的相关操作
操作有:
初始化,查找,插入,删除,获取指定元素下标,和排序。
代码写于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;
}
}
}