查找
查找线性表是最基本的操作之一,比如根据序号查找元素的值,或者根据值查找该值是否在线性表中,如果在,那么序号是几等等。
插入
- 如果插入的位置不合理,那么就抛出异常。
- 如果线性表长度大于等于数组长度,则抛出异常或者动态增加容量。
- 从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置。
- 将要插入的元素填入位置i处。
- 表长加1。
删除
- 如果删除位置不合理,抛出异常
- 取出删除元素
- 从删除元素位置开始遍历到最后一个元素位置,分别将它们向前移动一个位置
- 表长减1.
#include <iostream>
using namespace std;
const int LIST_INIT_SIZE=100;
const int LISTINCERMENT=10;
template<typename T>
class Sqlist
{
private:
T *elem;
T *newbase;
int *p;
int *q;
int length;//
int listsize;
public:
Sqlist(int a[] , int n)
{
elem = new T[LIST_INIT_SIZE];//分配内存
memcpy(elem, a, LIST_INIT_SIZE*sizeof(T));
p = NULL;
q = NULL;
// elem = NULL;
if(!elem)
cout << "OVRELOW1" <<endl;
length=n;
listsize = LIST_INIT_SIZE;
}
T* ListInsert(int i, T e)
{
if((i<1) || (i>length+1))
{
cout << "ERROR1" <<endl;
return 0;
}
if(length >= listsize)//当存储空间已满,增加分配
{
newbase = new T[listsize+LISTINCERMENT];
if(!newbase)
cout << "OVERFLOW2" << endl;
elem = newbase;
listsize += LISTINCERMENT;//增加存储容量
}
q = &elem[i-1];//q为插入位置
for(p=&(elem[length-1]);p>=q;--p)//插入位置及之后的元素右移
*(p+1) = *p;
*q = e; //插入e
++length;
return elem;
}
T* ListDelete(int i)
{
if((i<1) || (i>length))
{
cout << "ERROR1" <<endl;
return 0;
}
p=&elem[i-1];//p为被删除的位置
// e=*p;
q=elem+length-1;//表尾元素的位置
for(;p<=q;++p)//被删除元素之后的元素左移
*(p-1) = *p;
--length;
return elem;
}
int LocateElem_Sq(T e)//
{
int i=1;//i的初值为第一个元素的位序
p=elem;//p的初值为第一个元素的存储位置
while(i <= length && !(*p==e))
++i;
if(i <= length)
return i;
}
void getelem()//依次得出elem的值
{
for(int i=0; i<length; i++)
cout << elem[i] << " ";
}
~Sqlist()
{
delete elem;//释放分配内存
delete newbase;
delete p;
delete q;
}
};
int main()
{
// cout << "Hello World!" << endl;
int(n);
int a[5] = {4,8,7,5,10};
Sqlist<int> list(a,5);
list.ListInsert(1,6);
list.ListInsert(3,45);
list.ListInsert(5,100);
list.getelem();
cout << endl;
list.ListDelete(1);
list.ListDelete(2);
list.getelem();
cout << endl;
cout << list.LocateElem_Sq(10) << endl;
// cout << n << endl;
return 0;
}
运行结果: