c++day3 手动封装一个顺序表(SeqList),分文件编译实现

要求:

有私有成员:顺序表数组的起始地址 ptr、 顺序表的总长度:size、顺序表的实际长度:len

成员函数:初始化 init(int n)

判空:empty

判满:full

尾插:push_back

插入:insert(int index)

任意位置删除:erase(int index)

尾删: pop_back

求长度:size()

获取任意位置元素:& at(int inex)

将顺序表进行排序:sort(bool flag) //flag 为真,表示升序,否则是降序

seqlist.h

#ifndef SEQLIST_H
#define SEQLIST_H
 
 
//typedef int datatype;        //类型重命名
using datatype = int;
 
 
 
 
//封装一个顺序表
class SeqList
{
private:
    datatype *ptr;        //指向堆区空间的起始地址
    int size;             //总长度
    int len = 0;          //当前顺序表实际长度
 
 
public:
    void init(int n);
 
    bool empty();
 
    bool full();
 
    void push_back(datatype e);
 
    void insert(int index);//插入
 
    void erase(int index); //任意位置删除
 
    void pop_back();       //尾删
 
    void size_1();
 
    int & at(int index); //获取任意位置元素
 
    void sort(bool flag);   //真升序,否则降序
 
    void show();
 
 
};
#endif // SEQLIST_H

seqlist.cpp

#include <iostream>
 
using namespace std;
#include "seqlist.h"
 
void SeqList::init(int n)
{
       //在堆区申请出一个长度为n的空间,将其实地址赋值给ptr
       this->ptr = new datatype[n];
 
 
       //给len进行初始化
       this->len = 0;
       this->size = n;
}
 
bool SeqList::empty()
{
    return this->len == 0;
}
 
bool SeqList::full()
{
    return this->len == this->size;
}
 
void SeqList::push_back(datatype e)
{
    //判断是否满了
    if(this->full())
    {
        return ;
    }
 
 
    this->ptr[len++] = e;
 
}
 
 
void SeqList::show()
{
    //判空
    if(this->empty())
    {
        return ;
    }
 
    cout<<"当前顺序表中的元素分别是:";
    for(int i=0; i<this->len; i++)
    {
        cout<<*(ptr+i)<<" ";
    }
    cout<<endl;
}
void SeqList::insert(int index)
{
    if(this->empty()||this->full()||index<0||index>this->len)
    {
        return ;
    }
    int key;
    cout<<"第"<<index+1<<"个你想插入的值:";
    cin>>key;
 
    int n = this->len;
    int i = index;
    while(i<=n)
    {
        this->ptr[n+1]=this->ptr[n];
        n--;
    }
    this->ptr[index]=key;
 
    this->len++;
}
 
void SeqList::erase(int index)
{
    if(this->empty()||index<0||index>this->len)
    {
        return ;
    }
    int n = this->len;
    int i = index;
    while (i<=n)
    {
        this->ptr[i]=this->ptr[i+1];
        i++;
    }
 
    this->len--;
 
}
 
void SeqList::pop_back()
{
    if(this->empty())
    {
        return ;
    }
 
    this->len--;
}
 
void SeqList::size_1()
{
    if(this->empty())
    {
        return ;
    }
 
    cout<<"顺序表元素个数:"<<this->len+1<<endl;
 
}
 
int error =-1;
int & SeqList::at(int index)
{
 
    if(this->empty()||index<0||index>=this->len)
    {
 
        cout<<"越界"<<endl;
        return error;
    }
 
    return this->ptr[index];
 
}
 
void SeqList::sort(bool flag)
{
    if(this->empty())
    {
        return ;
    }
    int i = 0,j,index;
    int n = this->len;
 
 
    while(i<n)
    {
        index = i;
        j=i;
        while(j<n)
        {
            if(flag)
            {
                if(this->ptr[index]>this->ptr[j])
                {
                    index = j;
                }
            }
            else{
                if(this->ptr[index]<this->ptr[j])
                {
                    index = j;
                }
 
            }
            j++;
        }
        if(index!=i)
        {
            int temp = this->ptr[index];
            this->ptr[index] = this->ptr[i];
            this->ptr[i] = temp;
 
        }
        i++;
 
 
 
    }
}

main.cpp

#include <iostream>
#include "seqlist.h"
using namespace std;
 
int main()
{
 
    SeqList sl;           //实例化一个顺序表对象
    sl.init(5);            //申请空间
    sl.push_back(1);
    sl.push_back(3);
    sl.push_back(5);
 
    sl.show();
 
    sl.insert(1);
    sl.insert(1);
    cout<<"插入后数组:"<<endl;
    sl.show();
 
//    sl.erase(1);
//    cout<<"删除后数组:"<<endl;
//    sl.show();
 
//    sl.pop_back();
//    cout<<"尾删后数组:"<<endl;
//    sl.show();
 
    int pos = sl.at(2);
    cout<<"该位置的值:"<<pos<<endl;
 
    sl.sort(1);
    cout<<"升序排序后:"<<endl;
    sl.show();
 
    sl.sort(0);
    cout<<"降序排序后:"<<endl;
    sl.show();
 
    return 0;
}
 

以下是使用C语言文件编写一个顺序表的示例代码,包括了顺序表的基本操作: 1. 创建顺序表 2. 插入元素 3. 删除元素 4. 查找元素 5. 输出顺序表 其中,主文件为main.c,顺序表的头文件SeqList.h,顺序表实现文件SeqList.c。 SeqList.h: ```c #ifndef SEQLIST_H #define SEQLIST_H #define MAXSIZE 100 // 定义最大容量 typedef struct { int data[MAXSIZE]; // 存放数据元素的数组 int length; // 当前长度 } SeqList; // 初始化顺序表 void InitList(SeqList *L); // 插入元素 int ListInsert(SeqList *L, int pos, int elem); // 删除元素 int ListDelete(SeqList *L, int pos); // 查找元素 int LocateElem(SeqList *L, int elem); // 输出顺序表 void PrintList(SeqList *L); #endif ``` SeqList.c: ```c #include "SeqList.h" #include <stdio.h> // 初始化顺序表 void InitList(SeqList *L) { L->length = 0; } // 插入元素 int ListInsert(SeqList *L, int pos, int elem) { if (pos < 1 || pos > L->length + 1) { return 0; // 插入位置不合法 } if (L->length >= MAXSIZE) { return 0; // 顺序表已满 } for (int i = L->length; i >= pos; i--) { L->data[i] = L->data[i-1]; // 将元素后移 } L->data[pos-1] = elem; // 插入元素 L->length++; // 长度加1 return 1; } // 删除元素 int ListDelete(SeqList *L, int pos) { if (pos < 1 || pos > L->length) { return 0; // 删除位置不合法 } for (int i = pos; i < L->length; i++) { L->data[i-1] = L->data[i]; // 将元素前移 } L->length--; // 长度减1 return 1; } // 查找元素 int LocateElem(SeqList *L, int elem) { for (int i = 0; i < L->length; i++) { if (L->data[i] == elem) { return i+1; // 找到元素,返回位置 } } return 0; // 未找到元素 } // 输出顺序表 void PrintList(SeqList *L) { for (int i = 0; i < L->length; i++) { printf("%d ", L->data[i]); } printf("\n"); } ``` main.c: ```c #include "SeqList.h" #include <stdio.h> int main() { SeqList L; InitList(&L); // 初始化顺序表 // 插入元素 ListInsert(&L, 1, 10); ListInsert(&L, 2, 20); ListInsert(&L, 3, 30); ListInsert(&L, 4, 40); ListInsert(&L, 5, 50); PrintList(&L); // 输出顺序表 // 删除元素 ListDelete(&L, 3); PrintList(&L); // 输出顺序表 // 查找元素 int pos = LocateElem(&L, 20); if (pos) { printf("20 is at position %d\n", pos); } else { printf("20 is not found.\n"); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值