顺序表(c++)
本文最后更新于101 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

1.定义

template<typename T>
struct SequenList
{
    int capacity;
    int size;
    T* element;
};

定义顺序表的结构,size是已有元素的数量,capacity是总共的容量,T* element是存放数据,不知道template<typename T>的含义的同学可以搜一搜c++泛型编程.(此部分也可以用class,创建类的方式来实现)

2.顺序表的创建与删除(构造与析构)

template<typename T>
void initSequenList(SequenList<T>* ptr,int cap){
    ptr->element = new T[cap];
    ptr->capacity = cap;
    ptr->size = 0;
    cout << "已成功初始化顺序表" <<endl;
}

template<typename T>
void deleteSequenList(SequenList<T>* ptr){
   delete[] ptr;
   ptr->element = nullptr;
   cout << "已成功删除顺序表" <<endl;
}

构造这个顺序表时,用new开辟空间,然后再依次定义各种变量的初值.析构时,使用delete[]表示删除此指针指向的一片内存而不是此顺序表的首地址的元素.

3.插入操作


template<typename T>
void insertElement(SequenList<T>*ptr,int index,T element){
    if(ptr->size == ptr->capacity){
        ptr->capacity = ptr->size*2;
        T* ptr1 = new T[ptr->capacity];
        for(int i=0;i<ptr->size;i++){
            ptr1[i] = ptr->element[i];
        }
        delete[] ptr;
        ptr->element = ptr1;
        ptr1 = nullptr;
    }
    if(index < 0 || index > ptr->capacity){
        throw std::invalid_argument("Invalid index");
    }
    for(int i = ((ptr->size)+1);i>index;i--){
        ptr->element[i] = ptr->element[i-1];
    }
    ptr->element[index] = element;
    ptr->size+=1; 
}
/*
插入,容量不够扩容,*2,转移数据,再插;index超出边界抛出异常;把index后面的元素往后移动一格,在index插入;
*/

当原始的顺序表的容量不足时要进行扩容,姑且定义为原来的两倍:用一个新的指针开辟一个新空间,此时新指针指向新空间,然后遍历一遍将原空间的元素拷贝到新空间.(其实此时需要一个个拷贝的时间复杂度为O(n),非常麻烦, 所以可以将ptr1[i] = ptr->element[i]改为ptr1[i] = move(ptr->element[i]),这里涉及到c++的移动语义,详细解释请见下文)

操作完成后删除原空间,将新指针指向的新空间的首地址赋给原指针,将新指针指控避免悬挂.

4.删除操作

/*
删除,把index位置的元素删掉,后面的元素往前挪一格;index超出范围报错
*/
template<typename T>
void deleteElement(SequenList<T>* ptr,int index){
    if(index < 0 || index > ptr->size){
        throw std::invalid_argument("Invalid index");
    }
    for(int i = index;i<ptr->size;i++){
        ptr->element[i] = ptr->element[i+1];
    }
    ptr->size-=1;
}

将索引index位置的元素删除后将后面的元素一个一个往前挪,又是一个时间复杂度为O(n)的操作,所以后面要引入链表

5.改和查

/*
改
*/
template<typename T>
void editElement(SequenList<T>* ptr,int index,T element){
    if(index < 0 || index > ptr->size){
        throw std::invalid_argument("Invalid index");
    }
    ptr->element[index] = element;
}

/*
查
*/
template<typename T>
T searchElement(SequenList<T>* ptr,int index){
    if(index < 0 || index > ptr->size){
        throw std::invalid_argument("Invalid index");
    }
    return ptr->element[index];
}
template<typename T>
int findElment(SequenList<T>* ptr,T element){
    for(int i=0;i<(ptr->size+1);i++){
        if(element == ptr->element[i])
        return i;
    }
    return -1;
}

此处较为简单,将指针指向处的元素进行修改和返回即可

6.其它操作

//打印所有元素
template<typename T>
void printAllElement(SequenList<T>* ptr){
    for(int i = 0;i<ptr->size;i++){
        cout << ptr->element[i] << " ";
        
    }
    cout << endl;
}
template<typename T>
bool isEmpty(SequenList<T>* ptr){
    if(ptr->size){
        return false;
    }
    return true;//空则为0,不空则为1
}
template<typename T>
int listSize(SequenList<T>* ptr){
    return ptr->size;
}
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇