美文网首页
2.1顺序表的基本操作和常用算法--C

2.1顺序表的基本操作和常用算法--C

作者: Christopher__ | 来源:发表于2018-07-22 20:13 被阅读0次

顺序表的定义:

#define ElemType int

#define MaxSize 100
typedef struct{
    ElemType data[MaxSize];
    int length;
}SqList;

初始化表

void InitList(SqList &L){
    L.length = 0;
}

插入操作

// 将元素e插入到顺序表L中第i个位置 
// L: 顺序表
// i: 第i个位置,表示位序,从1开始
// e: 待插入元素 
bool ListInsert(SqList &L, int i, ElemType e){
    if( i<1 || i>L.length+1 )   // 判断i的范围是否有效
        return false;
    if(L.length >= MaxSize)     // 若存储空间已满则不能插入 
        return false;
    for(int j = L.length; j >= i; j --){    // 将第i个元素及之后的元素后移 
        L.data[j] = L.data[j - 1];
    }
    L.data[i - 1] = e;      // 在位置i处放入e 
    L.length ++;        // 更新表长 
    return true;
}
image.png

删除操作

// 删除顺序表L中第i个位置的元素 
bool ListDelete(SqList &L, int i, ElemType &e){
    if(i < 1 || i > L.length)   // 判断i的范围是否有效 
        return false;
    e = L.data[i - 1];      // 将被删除的元素赋值给e 
    for(int j = i; j < L.length; j ++)  // 将第i个之后的元素前移 
        L.data[j - 1] = L.data[j];
    L.length --;    // 线性表长度减1 
    return true;
} 

按值查找

// 在顺序表L中查找第一个元素值等于e的元素
// 若查找成功,则返回元素位序,否则返回0 
int LocateElem(SqList L, ElemType e){
    int i;
    for(i = 0; i < L.length; i ++){
        if(L.data[i] == e)
            return i + 1;
    }
    return 0;
}

逆置所有元素

// 扫描顺序表L的前半部分元素
// 将其与后半部分对应元素进行交换 
void Reverse(SqList &L){
    for(int i = 0; i < L.length / 2; i ++){
        ElemType temp = L.data[i];
        L.data[i] = L.data[L.length - i - 1];
        L.data[L.length - i - 1] = temp;
    }
}

逆置给定位置元素

// form: 开始转换的下标 0<=from
// to: 结束转换的下标  to<=L.lenth-1
void Reverse(SqList &L,int from, int to){
    for(int i = 0; i < (to - from + 1) / 2; i ++){
        ElemType temp = L.data[from + i];
        L.data[from + i] = L.data[to - i];
        L.data[to - i] = temp;
    }
}

子表位置互换问题L:(a1,a2...am,b1,b2...bn) -> L:(b1,b2...bn,a1,a2...am) T(n)=O(n)

void Converse(SqList &L, int m, int n){
    Reverse(L, 0, m - 1);
    Reverse(L, m, m + n - 1);
    Reverse(L, 0, m + n - 1);
}

删除值为给定值的元素 T(n)=O(n) S(n)=O(1)

void Del_x(SqList &L, ElemType x){
    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;
}

有序去重

bool Delete_Same(SqList &L){
    if(L.length == 0)
        return false;
    int k = 1;
    for(int i = 1; i < L.length; i ++){
        if(L.data[i] != L.data[k - 1]){
            L.data[k] = L.data[i];
            k ++;
        } 
    }
    L.length = k;
    return true;
}

有序合并

bool Merge(SqList A, SqList B, SqList &C){
    if(A.length + B.length > MaxSize)
        return false;
    int i = 0, j = 0, k = 0;
    while(i < A.length && j < B.length){
        if(A.data[i] < B.data[j])
            C.data[k++] = A.data[i++];
        else
            C.data[k++] = B.data[j++];
    }
    while(i < A.length)
        C.data[k++] = A.data[i++];
    while(j < B.length)
        C.data[k++] = B.data[j++];
    C.length = k;
    return true;
}

折半查找

// 在有序顺序表L中查找x,返回x下标 
// 若未找到则返回-1 
int Search(SqList &L, ElemType x){
    int low = 0, high = L.length - 1, mid;
    while(low <= high){
        mid = (low + high) / 2;
        if(L.data[mid] == x)
            return mid;
        else if(L.data[mid] < x)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return -1;
}

相关文章

  • 2.1顺序表的基本操作和常用算法--C

    顺序表的定义: 初始化表 插入操作 删除操作 按值查找 逆置所有元素 逆置给定位置元素 子表位置互换问题L:(a1...

  • 《数据结构》第二章:线性表

    2.1线性表的定义与基本操作 2.2.1顺序表的定义 2.2.2.1 顺序表插入和删除 增加bool运算,提高代码...

  • 顺序表基本算法

    顺序表:即线性表的顺序存储结构, 其逻辑结构与物理存储结构一致.内存分配连续,需要考虑初始内存分配和内存追加的问题...

  • 数据结构的标准形式(C、Python版本):1.顺序表

    一:C语言版本 顺序表基本操作 顺序表的定义/*****InitSize 线性表长度MaxSize 线性表允许的...

  • 2018-10-11

    0.实现顺序索引表的分块查找 实现顺序表的分级查找算法。基本要求包括: (1)设计顺序表和索引表的存储结构。 (2...

  • # 数据结构和算法系列1 线性表之顺序表

    阅读目录 什么是线性表线性表的两种存储结构顺序表的存储结构表示顺序表的常见操作和代码实现 数据结构与算法这块一直是...

  • 顺序头文件

    顺序头文件 //c2-1.h线性表的动态分配顺序存储结构 顺序表基本方法 //bo2-1.cpp顺序表示的线性表的...

  • 顺序表(数据结构)

    本篇文章主要针对《数据结构》中的顺序表的增删查改以及一些常用算法进行详尽的代码描述。本代码使用c语言书写,并且通过...

  • 数据结构

    数据结构 数据结构概念 顺序表 链表 队列 栈 二叉树 常用排序算法

  • 15 基本查找算法:顺序查找与分块查找

    一、顺序查找算法 在基于线性表查找的算法中,顺序查找是最简单的,基本思想就是暴力枚举查找。顺序查找法的特点是逐一比...

网友评论

      本文标题:2.1顺序表的基本操作和常用算法--C

      本文链接:https://www.haomeiwen.com/subject/tpcnpftx.html