顺序表的定义及操作(C++)

顺序表的定义

typedef int ElemType;

const int MaxSize = 50;

typedef struct{
    ElemType data[MaxSize]; // 存储大小
    int length;				// 线性表长度
} SqList;

顺序表的基本操作

void InitList(SqList *&);                    // 初始化线性表
void DestroyList(SqList *&);                 // 销毁线性表
bool ListEmpty(SqList *);                    // 判定线性表是否为空
int ListLength(SqList *);                    // 获得线性表长度
void ShowList(SqList *);                     // 输出线性表
bool GetElem(SqList *, int, ElemType &);     // 获得第i个元素的值,存储到e中
int LocateElem(SqList *, ElemType);          // 查找元素e第一次出现的位置,不存在返回0
bool ListInsert(SqList *&, int, ElemType);   // 再第i个位置插入元素e
bool ListDelete(SqList *&, int, ElemType &); // 删除第i个元素,并存储到e中

void InitList(SqList * &L) {
    L = (SqList *)malloc(sizeof(SqList));
    L -> length = 0;
}

void DestroyList(SqList * &L) {
    free(L);
}

bool ListEmpty(SqList * L) {
    return L -> length == 0;
}

int ListLength(SqList * L) {
    return L -> length;
}

void ShowList(SqList * L) {
    printf("[L");
    for (int i = 0; i < L -> length; i++) {
        printf(" -> %d", L -> data[i]);
    }
    printf("]\n");
}

bool GetElem(SqList * L, int i, ElemType &e) {
    if (i < 1 || i > L -> length) return false;
    e = L -> data[i - 1];
    return true;
}

int LocateElem(SqList * L, ElemType e) {
    int i;
    for (i = 0; i < L -> length && L -> data[i] != e; i++) ;
    if (i == L -> length) return 0;
    return i + 1;
}

bool ListInsert(SqList * &L, int i, ElemType e) {
    if (i < 1 || i > L -> length + 1 || L -> length == MaxSize) return false;
    for (int j = L -> length; j >= i; j--) L -> data[j] = L -> data[j - 1];
    L -> data[--i] = e;
    L -> length++;
    return true;
}

bool ListDelete(SqList * &L, int i, ElemType &e) {
    if (i < 1 || i > L -> length) return false;
    e = L -> data[i - 1];
    for (int j = i - 1; j <= L -> length; j++) L -> data[j] = L -> data[j + 1];
    L -> length--;
    return true;
}

顺序表的基本算法

void CreateList(SqList *&, ElemType [], int); // 从数组中创建线性表,时间复杂度o(n)
void DeleteElem1(SqList *&, ElemType);        // 删除线性表中所有元素x,时间复杂度o(n),算法1
void DeleteElem2(SqList *&, ElemType);        // 删除线性表中所有元素x,时间复杂度o(n),算法2
void Classify1(SqList *&);                    // 将链表中所有值为奇数的元素移动到值为偶数的元素前,时间复杂度o(n),算法1
void Classify2(SqList *&);                    // 将链表中所有值为奇数的元素移动到值为偶数的元素前,时间复杂度o(n),算法2,区间划分法

void CreateList(SqList * &L, ElemType a[], int n) {
   L = (SqList *)malloc(sizeof(SqList));
    int i = 0;
    while (i < n && i < MaxSize) {
        L -> data[i] = a[i];
        i++;
    }
    L -> length = i;
}

void DeleteElem1(SqList * &L, ElemType x) {
	// 将所有元素前移,前移距离等于删除元素数量
    int k = 0;
    for (int i = 0; i < L -> length; i++) {
        if (L -> data[i] == x) k++;
        else L -> data[i - k] = L -> data[i];
    }
    L -> length -= k;
}

void DeleteElem2(SqList * &L, ElemType x) {
	// 重构顺序表,将所有值不等于x的元素重新构建至sqlist中
    int k = 0; // 重构指针
    for (int i = 0; i < L -> length; i++) {
        if (L -> data[i] != x) {
            L -> data[k] = L -> data[i];
            k++;
        }
        
    }
    L -> length = k;
}

void Classify1(SqList * &L) {
	// 设置前后指针i,j
	// 将前指针偶数与后指针奇数进行交换
    int i = 0, j = L -> length - 1;
    while (i < j) {
        while (i < j && (L -> data[i] & 1)) i++;  // 从前向后查找偶数,奇数跳过
        while (i < j && !(L -> data[j] & 1)) j--; // 从后向前查找奇数
        if (i < j) {
        	// 交换奇偶元素
            ElemType temp = L -> data[i];
            L -> data[i] = L -> data[j];
            L -> data[j] = temp;
        }
    }
}

void Classify2(SqList * &L) {
	Classify2(SqList * &sqlist) {
	// 划分奇偶区间 奇数j[0...j],偶数i[j + 1...]
	// 遍历查找到偶数区间的奇数后data[i],交换data[j + 1],a[i]
    int j = -1;
    for (int i = 0; i < L -> length; i++) {
        if (L -> data[i] & 1) {
            j++;
            if (i != j) {
                ElemType temp = L -> data[i];
                L -> data[i] = L -> data[j];
                L -> data[j] = temp;
            }
        }
    }
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序表是一种线性,可以使用数组来实现。下面是顺序表的基本操作 C++ 实现: 1. 初始化顺序表 ```c++ const int MAXSIZE = 100; // 定义顺序表最大长度 typedef struct { int data[MAXSIZE]; // 用数组存储顺序表元素 int length; // 顺序表当前长度 } SqList; // 定义顺序表类型 void InitList(SqList &L) { L.length = 0; // 初始化顺序表长度为0 } ``` 2. 插入元素 ```c++ bool ListInsert(SqList &L, int pos, int e) { if (pos < 1 || pos > L.length + 1) { return false; // 插入位置不合法,返回false } if (L.length >= MAXSIZE) { return false; // 顺序表已满,返回false } for (int i = L.length; i >= pos; i--) { L.data[i] = L.data[i - 1]; // 将pos及之后的元素后移 } L.data[pos - 1] = e; // 插入元素 L.length++; // 顺序表长度加1 return true; } ``` 3. 删除元素 ```c++ bool ListDelete(SqList &L, int pos, int &e) { if (pos < 1 || pos > L.length) { return false; // 删除位置不合法,返回false } e = L.data[pos - 1]; // 将要删除的元素保存到e中 for (int i = pos; i < L.length; i++) { L.data[i - 1] = L.data[i]; // 将pos之后的元素前移 } L.length--; // 顺序表长度减1 return true; } ``` 4. 查找元素 ```c++ int LocateElem(SqList L, int e) { for (int i = 0; i < L.length; i++) { if (L.data[i] == e) { return i + 1; // 返回第一个值为e的元素的位置 } } return 0; // 顺序表中不存在值为e的元素,返回0 } ``` 5. 获取元素 ```c++ bool GetElem(SqList L, int pos, int &e) { if (pos < 1 || pos > L.length) { return false; // 获取位置不合法,返回false } e = L.data[pos - 1]; // 获取元素 return true; } ``` 注意:这里的 pos 从1开始算起,而不是从0开始算起。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值