数据结构——顺序表(c++)

 顺序表

顺序表是指用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称为线性表的顺序存储结构或顺序映像

顺序表的特点是逻辑上相邻的数据元素在物理次序上也是相邻的。

顺序表的定义
class student {//表内数据元素的类型
public:
    int ID;
    string name;
    student() {}
    student(int ID, string name) {
        this->ID = ID;
        this->name = name;
    }
};
class student_array {//顺序表的定义
public:
    student* elem;
    int length;
};
顺序表的初始化

顺序表的初始化既为顺序表分配一个大小为MAXSIZE的空间

void initList(student_array& List) {//初始化
    List.elem = new student[MAXSIZE];
    List.length = 0;
    cout<<"初始化成功"<<endl;
}
顺序表的取值

取值操作时根据序号i来获取顺序表中对应位置的元素值,因为采用数组的方式进行存储,所以可直接返回list.elem[i-1]来获取对应元素。

bool getElem(student_array &list, int i,student &elem){//取值
    if(i < 1 || i > list.length || list.length == 0)return false;
    elem = list.elem[i-1];
    return true;
}
顺序表的查找

查找既根据元素值来查找其在表中的位置,步骤如下:

(1)从第一个元素起依次进行比较,若相等则返回i+1;

(2)若遍历完也未比较成功,则查找失败

int LocateElem(student_array &list,int ID){//查找
    for(int i = 0; i < list.length; i++){
        if(list.elem[i].ID == ID)return i + 1;//此处因为c++无法使用==判断两个对象是否相等,所以改成判断ID是否相等,输入数据时请注意保证ID的唯一性
    }
    return 0;
}
顺序表的插入

往表中插入一个元素,算法步骤如下:

(1)首先判断插入位置是否合法以及存储空间是否已满

(2)将第i-1个位置到第length-1位置之间的元素依次后移一个位置

(3)将第i-1位置的元素赋值为你想插入的元素

(4)将表的长度+1

int ListInsert(student_array &list, int i,student &elem){//插入
    if( i <= 0 || i > list.length + 1 || list.length == MAXSIZE ) return 0;
    //cout<<"开始插入"<<endl;
    for ( int j = list.length - 1; j >= i - 1; j--){
        list.elem[ j + 1 ] = list.elem[ j ];
    }
    //cout<<elem.name<<endl;
    list.elem[ i - 1 ] = elem;
    list.length++;
    return 1;
}
顺序表的删除

将指定位置的元素删除,算法步骤如下:

(1)判断i值是否合法

(2)将第i到第length-1位置的元素前移

int ListDelete(student_array &list, int i){
    if( i < 0 || i > list.length ) return 0;
    for( int j = i - 1; j < list.length -1; j++){
        list.elem[j] = list.elem[j+1];
    }
    list.length--;
    return 1;
}
完整代码
#include<iostream>
#include<string.h>

using namespace std;
#define MAXSIZE 1000
class student {
public:
    int ID;
    string name;
    student() {}
    student(int ID, string name) {
        this->ID = ID;
        this->name = name;
    }
};
class student_array {
public:
    student* elem;
    int length;
};

void initList(student_array& List) {//初始化
    List.elem = new student[MAXSIZE];
    List.length = 0;
    cout<<"初始化成功"<<endl;
}
bool getElem(student_array &list, int i,student &elem){//取值
    if(i < 1 || i > list.length || list.length == 0)return false;
    elem = list.elem[i-1];
    return true;
}
int LocateElem(student_array &list,int ID){//查找
    for(int i = 0; i < list.length; i++){
        if(list.elem[i].ID == ID)return i + 1;//此处因为c++无法使用==判断两个对象是否相等,所以改成判断ID是否相等,输入数据时请注意保证ID的唯一性
    }
    return 0;
} 
int ListInsert(student_array &list, int i,student &elem){//插入
    if( i <= 0 || i > list.length + 1 || list.length == MAXSIZE ) return 0;
    //cout<<"开始插入"<<endl;
    for ( int j = list.length - 1; j >= i - 1; j--){
        list.elem[ j + 1 ] = list.elem[ j ];
    }
    //cout<<elem.name<<endl;
    list.elem[ i - 1 ] = elem;
    list.length++;
    return 1;
}
int ListDelete(student_array &list, int i){
    if( i < 0 || i > list.length ) return 0;
    for( int j = i - 1; j < list.length -1; j++){
        list.elem[j] = list.elem[j+1];
    }
    list.length--;
    return 1;
}
void ListCout(student_array &list){
    for( int i = 0; i < list.length; i++){
        cout<<list.elem[i].ID<<"   "<<list.elem[i].name<<endl;
    }
}


void student_array_opearte() {
    student_array List;
    bool i = true;
    int j = 0,ID,station;
    string name;
    cout<<"请先初始化顺序表以便进行后续操作"<<endl;
    while (i) {
        cout << "***请选择你想要进行的操作******" << endl;
        cout << "***1:初始化顺序表*********" << endl;
        cout << "***2:取值*****************" << endl;
        cout << "***3:查找某一项的值**********" << endl;
        cout << "***4:在某个位置插入值*" << endl;
        cout << "***5:删除某一项************" << endl;
        cout << "***6:输出顺序表************" << endl;
        cout << "***7:退出************" << endl;
        cin >> j;
        switch (j)
        {
        case 1:
            {
                initList(List);
                cout<<"请选择你接下来要进行的操作:"<<endl;
                break;
            }
        case 2:
        {
            cout<<"请输入要取值元素的位置"<<endl;
            cin>>station;
            student s1{};
            if(getElem(List,station,s1)){
                cout<<"所取元素为:"<<s1.ID<<" "<<s1.name<<endl;
            }
            else{
                cout<<"失败"<<endl;
            }
            cout<<"请选择你接下来要进行的操作:"<<endl;
            break;
        }
        case 3:
        {
            cout<<"请输入需要查找的ID:"<<endl;
            cin>>ID;
            if(!LocateElem(List,ID)) cout<<"查找失败!"<<endl;
            else cout<<"所查找元素所在位置为:"<<LocateElem(List,ID)<<endl;
            cout<<"请选择你接下来要进行的操作:"<<endl;
            break;
        }
        case 4:
        {
            cout<<"请输入需要插入元素的值:"<<endl;
            cout<<"学号:"<<endl;
            cin>>ID;
            cout<<"姓名:"<<endl;
            cin>>name;
            cout<<"位置:"<<endl;
            cin>>station;
            student s{ID,name};
            if(ListInsert(List,station,s)) cout<<"插入成功!"<<endl;
            else cout<<"插入失败"<<endl;
            cout<<"请选择你接下来要进行的操作:"<<endl;
            break;
        }
        case 5:
        {
            cout<<"请输入需要删除的位置!"<<endl;
            cin>>station;
            if(ListDelete(List,station)) cout<<"删除成功!"<<endl;
            else cout<<"删除失败!"<<endl;
            cout<<"请选择你接下来要进行的操作:"<<endl;
            break;
        }
        case 6:
        {
            ListCout(List);
            cout<<"请选择你接下来要进行的操作:"<<endl;
            break;
        }
        case 7:
        {
            i = false;
            break;
        }
        }
    }

}

int main() {
    student_array_opearte();
    return 0;
}

第一次写博客,如果有不足的地方还望各位大佬指正,感谢。

使用c++实现的顺序表:多文件编程,层次清晰,函数有注释 SeqList();//构造函数,存储的元素个数设为0 bool setLength(size_t length);//设置已经存储的元素个数 bool addElement(ElemType element);//把某个元素添加到顺序表末尾 bool addElement(ElemType element , size_t n);//插入一个元素,使其成为第n个元素,其余元素后移 bool delElement();//删除所有的元素 bool delElement(size_t n);//删除第n个元素 bool delElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,把这个元素删除 bool replaceElement(ElemType element , size_t n);//使用一个元素,替换掉第n个元素 bool swapElement(size_t n1 , size_t n2);//把第n1个元素和第n2个元素交换 ElemType* getElement();//得到数组头的指针 ElemType* getElement(size_t n);//得到第n个元素的指针 size_t getLength();//得到存储的元素个数 size_t getMaxSize();//得到顺序表容量 bool showElementDetail();//输出所有的元素细节 bool showElementDetail(size_t n);//输出第n个元素的细节 bool showElementDetail(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,输出元素所有细节 size_t findElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素位置 static int inputAInt(int min = 0,int max = 9,int defaultValue = -1);//从键盘读取,限制为一个min到max间的整数,非法情况返回defaultValue void startControlLoop();//打开控制界面 ~SeqList();//析构函数
创建顺序表(数组)在C语言中通常涉及以下几个步骤: ```c #include <stdio.h> // 定义顺序表结构体 typedef struct List { int data; // 存储元素的数据域 int size; // 列表当前元素的数量 int capacity; // 列表的容量(预设的最大元素数量) } List; // 初始化函数,创建一个新的空列表 List* create_list(int capacity) { List* list = (List*)malloc(sizeof(List)); // 分配内存 if (list != NULL) { list->data = -1; // 空列表标记 list->size = 0; list->capacity = capacity; } else { printf("Memory allocation failed.\n"); return NULL; } return list; } // 向列表添加元素 void add_element(List* list, int value) { if (list->size == list->capacity) { // 检查是否已满 list->capacity *= 2; // 扩容 void* old_ptr = list; list = (List*)realloc(old_ptr, sizeof(List) + sizeof(int) * list->capacity); // 动态扩容 if (list == NULL) { printf("Failed to resize the list.\n"); return; } } list->data[list->size] = value; list->size++; } // 删除指定位置的元素 void delete_element(List* list, int index) { if (index >= 0 && index < list->size) { for (int i = index; i < list->size - 1; i++) { list->data[i] = list->data[i + 1]; } list->size--; } else { printf("Index out of bounds.\n"); } } // 打印列表 void print_list(const List* list) { for (int i = 0; i < list->size; i++) { printf("%d ", list->data[i]); } printf("\n"); } int main() { List* my_list = create_list(5); if (my_list) { add_element(my_list, 10); add_element(my_list, 20); add_element(my_list, 30); print_list(my_list); delete_element(my_list, 1); print_list(my_list); free(my_list); } return 0; } ``` 上述代码实现了创建、添加、删除和打印顺序表的基本操作。注意,这只是一个简单的示例,实际应用中可能需要考虑更多细节,如错误处理和边界检查。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值