顺序表

顺序表在储存数据前会申请一块连续空间。

 

对于顺序表的使用,和以前使用动态分配实际差不多。

初始化:

  1. 动态分配内存存入head
  2. length初始为0,size初始固定。
  3. 赋值一个空间,length加一

插入:

  1. 判断是否有足够空间(是否需要realloc),插入位置是否正确。
  2. 将插入位置后的元素,逐个后移。
  3. 将元素插入到指定位置。
  4. length加一。

删除:

  1. 判断删除位置是否正确。
  2. 循环,将删除后的元素逐个往前一位
  3. length减一

查找:

  1. 循环,查看元素是否相等

更改:

  1. 查找到需要更改元素
  2. 赋新值

 

#include <iostream>

using namespace std;
#define SIZE 5

struct table{
    int *head;//指针用来指向动态分配空间地址
    int length;//当前顺序表长度
    int size;//动态申请大小
};

table initTable(){
    table t;
    t.head = new int[SIZE];
    if (!t.head) {
        cout << "初始化失败!" << endl;
        exit(1);
    }
    t.length = 0;
    t.size = SIZE;
    return t;
}

table InsertFunc(table a, int elem, int pos) {
    if (pos > a.length + 1 || pos < 1) {
        cerr << "位置错误" << endl;
        return a;
    }

    if (a.size = a.length) {
        a.head = (int *)realloc(a.head, (SIZE + 1) * sizeof(int));
        if (!a.head) {
            cerr << "分配失败" << endl;
            return a;
        }
    }
    a.size = SIZE + 1;
    for (int i = a.length - 1; i >= pos - 1; --i) {
        a.head[i + 1] = a.head[i];
    }

    a.head[pos - 1] = elem;
    a.length++;

    return a;
}

table Delete(table a, int pos) {
    if (pos > a.length || pos < 1) {
        cerr << "位置错误" << endl;
        return a;
    }
    for (int i = pos - 1; i < a.length - 1; ++i) {
        a.head[i] = a.head[i + 1];
    }

    a.length--;

    return a;
}

int Find(table t, int elem) {
    for (int i = 0; i < t.length; ++i) {
        if (t.head[i] == elem) {
            return i + 1;
        }
    }
    cout << "未查询到" << elem << endl;
    return -1;
}

table Alter(table t, int elem, int pos) {
    t.head[pos - 1] = elem;

    return t;
}

void Display(const table& t){
    for (int i = 0; i < t.length; ++i) {
        cout << t.head[i] << " ";
    }
    cout << endl;
}

int main()
{
    table ta = initTable();

    for (int i = 0; i < SIZE; ++i) {
        ta.head[i] = i;
        ++ta.length;
    }
    //ta.head = new int[SIZE + 1]{ 0,1,2 };
    cout << "初始化数据,顺序表元素为:";
    Display(ta);

    ta = InsertFunc(ta, 5, 6);
    cout << "插入数据后,顺序表元素为:";
    Display(ta);

    ta = Delete(ta, 1);
    cout << "删除数据后,顺序表元素为:";
    Display(ta);

    int pos = Find(ta, 2);
    if (pos != -1) {
        cout << "查询数据,位置为:" << pos << endl;
    }

    ta = Alter(ta, 12, 3);
    cout << "更改第三个位置的数据为12:";
    Display(ta);

    system("PAUSE");
    return 0;
}

 

posted @ 2018-12-21 12:50  Hk_Mayfly  阅读(152)  评论(0编辑  收藏  举报