C/C++学习(六)线性表的插入、删除和查找

 

查找

查找线性表是最基本的操作之一,比如根据序号查找元素的值,或者根据值查找该值是否在线性表中,如果在,那么序号是几等等。

 

插入
  1. 如果插入的位置不合理,那么就抛出异常。
  2. 如果线性表长度大于等于数组长度,则抛出异常或者动态增加容量。
  3. 从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置。
  4. 将要插入的元素填入位置i处。
  5. 表长加1。
删除
  1. 如果删除位置不合理,抛出异常
  2. 取出删除元素
  3. 从删除元素位置开始遍历到最后一个元素位置,分别将它们向前移动一个位置
  4. 表长减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;
}
 
运行结果:
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值