顺序表的算法

顺序表


要点

顺序表是在计算机内存中以数组的形式保存的线性表,是指使用一组地址连续的存储单元依次存储数据元素的线性结构。

顺序表的存储结构可表示如下:


#define MAXSIZE 10

typedef int ElemType;

typedef struct { // 顺序表的结构类型

ElemType data[MAXSIZE];

int length;

} SqList;

基本操作


插入数据元素

在顺序表的第 pos(0≤pos≤length) 个位置上插入新的元素e。

如果 pos 值不正确,则返回ERROR;

否则,讲顺序表中原来第 pos 个元素及以后元素均后移一个位置,腾出一个空位置插入新元素,并且顺序表长度增1。


STATU insertElem(SqList *pList, int pos, ElemType elem) {

int i = 0;

// 判断要插入的位置是否合理

if (pos < 0 || pos > pList->length)

return ERROR;

// 将data[pos]及后面的元素都向后移动一个位置

for (i = pList->length - 1; i > pos; i--) {

pList->data[i] = pList->data[i-1];

}

pList->data[pos] = elem;

pList->length++; // 顺序表长度加1

return OK;

}

删除数据元素

删除顺序表中的第 pos(0≤pos≤length-1) 个元素。

如果 pos 值不正确,则返回ERROR;

否则,将顺序表中的第 pos 个元素以后的元素均向前移动一个位置,这样覆盖了原来的第 pos个元素,并且顺序表长度减1。


STATU removeElem(SqList *pList, int pos, ElemType *pElem) {

int i = 0;

// 判断要删除的位置是否合理

if (pos < 0 || pos > pList->length)

return ERROR;

*pElem = pList->data[pos];

// 将data[pos]后面的元素都向前移动一个位置

for (i = pos; i < pList->length; i++) {

pList->data[i] = pList->data[i+1];

}

pList->length--; // 顺序表长度减1

return OK;

}

参考代码



以下为本人实现的顺序表的基本操作。欢迎指正。本人的编译环境为Visual Studio2010,C语言。

基本操作 


/***********************************************************************************************************************

[顺序表操作]

[1] initList, 初始化一个空的顺序表

[2] createList, 根据数组 elems 构建一个顺序表

[3] insertElem, 在顺序表中第 pos 个位置插入元素 elem

[4] removeElem, 在顺序表中移除第 pos 个元素,并由 pElem 返回其值

[5] getElem, 获取顺序表上位置为 pos 的元素,并由 pElem 返回其值

[6] locateElem, 获取元素 elem 在顺序表上第一次出现的位置,如果不存在返回 -1

[7] printList, 打印整个顺序表

***********************************************************************************************************************/

#include "stdafx.h"

#include <stdio.h>

#include <stdlib.h>

/***********************************************************************************************************************

第一部分,数据结构、宏定义

***********************************************************************************************************************/

#define MAXSIZE 10

typedef enum {          // 状态码

OK = 0,

ERROR = 1

} STATU;

typedef enum {          // C语言中没有bool型,为方便,自定义一个BOOL型

TRUE = 0,

FALSE = -1

} BOOL;

typedef int ElemType;    // 元素类型

typedef struct {     // 顺序表的结构类型

ElemType data[MAXSIZE];

int length;

} SqList;

/***********************************************************************************************************************

第二部分,函数实现

***********************************************************************************************************************/

/*******************************************************************************

Funtion      : initList

Description  : 初始化一个空的顺序表

Input        : SqList *pList

Output       : SqList *pList

Return Value : void

Author       : VictorZhang

Date         : 2015-04-10

*******************************************************************************/

void initList(SqList *pList) {

pList->length = 0;

}

/*******************************************************************************

Funtion      : createList

Description  : 根据数组 elems 构建一个顺序表

Input        : SqList *pList,

ElemType elems[],

int size

Output       : SqList *pList

Return Value : STATU(OK/ERROR)

Author       : VictorZhang

Date         : 2015-04-10

*******************************************************************************/

STATU createList(SqList *pList, ElemType elems[], int size) {

int i = 0;

// 判断数组大小是否超过最大限制

if (size > MAXSIZE)

return ERROR;

for (i = 0; i < size; i++) {

pList->data[i] = elems[i];

}

pList->length = size;

return OK;

}

/*******************************************************************************

Funtion      : insertElem

Description  : 在顺序表中第 pos 个位置插入元素 elem

Input        : SqList *pList,

int pos,

ElemType elem

Output       : SqList *pList

Return Value : STATU(OK/ERROR)

Author       : VictorZhang

Date         : 2015-04-10

*******************************************************************************/

STATU insertElem(SqList *pList, int pos, ElemType elem) {

int i = 0;

// 判断要插入的位置是否合理

if (pos < 0 || pos > pList->length)

return ERROR;

// 将data[pos]及后面的元素都向后移动一个位置

for (i = pList->length - 1; i > pos; i--) {

pList->data[i] = pList->data[i-1];

}

pList->data[pos] = elem;

pList->length++; // 顺序表长度加1

return OK;

}

/*******************************************************************************

Funtion      : removeElem

Description  : 在顺序表中移除第 pos 个元素,并由 pElem 返回其值

Input        : SqList *pList,

int pos,

ElemType *pElem

Output       : SqList *pList,

ElemType *pElem

Return Value : STATU(OK/ERROR)

Author       : VictorZhang

Date         : 2015-04-10

*******************************************************************************/

STATU removeElem(SqList *pList, int pos, ElemType *pElem) {

int i = 0;

// 判断要删除的位置是否合理

if (pos < 0 || pos > pList->length)

return ERROR;

*pElem = pList->data[pos];

// 将data[pos]后面的元素都向前移动一个位置

for (i = pos; i < pList->length; i++) {

pList->data[i] = pList->data[i+1];

}

pList->length--; // 顺序表长度减1

return OK;

}

/*******************************************************************************

Funtion      : getElem

Description  : 获取顺序表上位置为 pos 的元素,并由 pElem 返回其值

Input        : SqList list,

int pos,

ElemType *pElem

Output       : ElemType *pElem

Return Value : STATU(OK/ERROR)

Author       : VictorZhang

Date         : 2015-04-10

*******************************************************************************/

STATU getElem(SqList list, int pos, ElemType *pElem) {

// 判断位置是否合理

if (pos < 0 || pos > list.length - 1)

return ERROR;

*pElem = list.data[pos];

return OK;

}

/*******************************************************************************

Funtion      : locateElem

Description  : 获取元素 elem 在顺序表上第一次出现的位置,如果不存在返回 -1

Input        : SqList list, ElemType elem

Output       : N/A

Return Value : int

Author       : VictorZhang

Date         : 2015-04-10

*******************************************************************************/

int locateElem(SqList list, ElemType elem) {

int pos = 0;

for (pos = 0; pos < list.length; pos++) {

if (elem == list.data[pos])

return pos;

}

return -1;

}

/*******************************************************************************

Funtion      : printList

Description  : 打印整个顺序表

Input        : SqList list

Output       : N/A

Return Value : N/A

Author       : VictorZhang

Date         : 2015-04-10

*******************************************************************************/

void printList(SqList list) {

int i = 0;

if (0 == list.length) {

printf("SqList is empty\n");

return;

}

printf("SqList:");

for (i = 0; i < list.length; i++) {

printf(" %d", list.data[i]);

}

printf("\n");

}

测试例部分 

/***********************************************************************************************************************
第三部分,测试例
***********************************************************************************************************************/
void testCase0() {
    printf("================== testCase0 ==================\n");

    ElemType A[MAXSIZE] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    SqList list = {0};

    // 初始化链表
    initList(&list);
    printf("Init DList\n");
    printList(list);

    // 根据一个数组来创建顺序表
    int size = sizeof(A)/sizeof(ElemType);
    createList(&list, A, size);
    printf("Create List:\n");
    printList(list);

    // 再次初始化链表
    initList(&list);
    printf("Init DList\n");
    printList(list);
}

void testCase1() {
    printf("================== testCase1 ==================\n");
    STATU statu;
    ElemType A[5] = {0, 1, 2, 3, 4};
    SqList list = {0};

    // 初始化链表
    initList(&list);
    printf("Init DList\n");
    printList(list);

    // 根据一个数组来创建顺序表
    int size = sizeof(A)/sizeof(ElemType);
    createList(&list, A, size);
    printf("Create List:\n");
    printList(list);

    // 在尾部位置尝试插入元素
    statu = insertElem(&list, 5, 5);
    printf("Insert element:\n");
    if (OK != statu) {
        printf("Insert failed!\n");
    } else {
        printList(list);
    }

    // 在头部位置尝试插入元素
    statu = insertElem(&list, 0, -1);
    printf("Insert element:\n");
    if (OK != statu) {
        printf("Insert failed!\n");
    } else {
        printList(list);
    }

    // 在中间位置尝试插入元素
    statu = insertElem(&list, 3, 11);
    printf("Insert element:\n");
    if (OK != statu) {
        printf("Insert failed!\n");
    } else {
        printList(list);
    }

    // 尝试在不合理的位置上插入元素
    statu = insertElem(&list, 99, 15);
    if (OK != statu) {
        printf("Insert failed!\n");
    } else {
        printList(list);
    }
}

void testCase2() {
    printf("================== testCase2 ==================\n");
    STATU statu;
    ElemType elem;
    ElemType A[5] = {0, 1, 2, 3, 4};
    SqList list = {0};

    // 初始化链表
    initList(&list);
    printf("Init DList\n");
    printList(list);

    // 根据一个数组来创建顺序表
    int size = sizeof(A)/sizeof(ElemType);
    createList(&list, A, size);
    printf("Create List:\n");
    printList(list);

    // 尝试移除尾部位置的元素
    statu = removeElem(&list, 4, &elem);
    printf("Remove element pos(%d)\n", 4);
    if (OK != statu) {
        printf("Remove failed!\n");
    } else {
        printList(list);
    }

    // 尝试移除头部位置的元素
    statu = removeElem(&list, 0, &elem);
    printf("Remove element pos(%d)\n", 0);
    if (OK != statu) {
        printf("Remove failed!\n");
    } else {
        printList(list);
    }

    // 尝试移除中间位置的元素
    statu = removeElem(&list, 1, &elem);
    printf("Remove element pos(%d)\n", 1);
    if (OK != statu) {
        printf("Remove failed!\n");
    } else {
        printList(list);
    }

    // 尝试移除不合理位置的元素
    statu = removeElem(&list, 11, &elem);
    printf("Remove element pos(%d)\n", 11);
    if (OK != statu) {
        printf("Remove failed!\n");
    } else {
        printList(list);
    }
}

void testCase3() {
    printf("================== testCase3 ==================\n");
    STATU statu;
    ElemType elem;
    ElemType A[5] = {0, 1, 2, 3, 4};
    SqList list = {0};

    // 初始化链表
    initList(&list);
    printf("Init DList\n");
    printList(list);

    // 根据一个数组来创建顺序表
    int size = sizeof(A)/sizeof(ElemType);
    createList(&list, A, size);
    printf("Create List:\n");
    printList(list);

    // 获取指定位置上的元素
    int pos = 3;
    statu = getElem(list, pos, &elem);
    if (OK != statu) {
        printf("Get element failed!\n");
    } else {
        printf("The elem in pos(%d) is %d\n", pos, elem);
    }

    // 查找元素在双链表中第一次出现的位置
    elem = 4;
    pos = locateElem(list, elem);
    printf("%d is in pos(%d) of SqList\n", elem, pos);
    elem = 9;
    pos = locateElem(list, elem);
    printf("%d is in pos(%d) of SqList\n", elem, pos);
}

int _tmain(int argc, _TCHAR* argv[])
{
    testCase0();
    testCase1();
    testCase2();
    testCase3();
    return 0;
}

顺序表测试例代码

参考资料


《数据结构》(C语言版) ,严蔚敏、吴伟民

《数据结构习题与解析》(B级第3版),李春葆、喻丹丹

相关阅读


欢迎阅读 程序员的内功——数据结构和算法 系列

时间: 2024-08-27 21:48:47

顺序表的算法的相关文章

顺序表查找算法及其优化

顺序查找算法实现如下: var arr = [5, 2, 4, 3, 1] , sequentialSearch = function(arr, val) { var i = 0 , len = arr.length; for ( ; i < len; i++) { // 比较一次 if (arr[i] === val) { // 比较二次 return i; } } return i; // 返回len,则说明查找失败 } 这里并不是足够完美, 因为每次循环时都需要对i是否越界, 即是否小于l

顺序表基本算法

#ifndef __SEQLIST_H__ #define __SEQLIST_H__ #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> #define MAX 100 typedef int DataType; typedef struct Seqlist { DataType Data[M

SDUT 3327 顺序表应用4:元素位置互换之逆置算法

顺序表应用4:元素位置互换之逆置算法 Time Limit: 10 ms Memory Limit: 570 KiB Problem Description 一个长度为len(1<=len<=1000000)的顺序表,数据元素的类型为整型,将该表分成两半,前一半有m个元素,后一半有len-m个元素(1<=m<=len),设计一个时间复杂度为O(N).空间复杂度为O(1)的算法,改变原来的顺序表,把顺序表中原来在前的m个元素放到表的后段,后len-m个元素放到表的前段.注意:先将顺序

顺序表插入、删除算法用C语言来实现

#include<stdio.h> #include<stdlib.h> //-------- 线性表的动态分配顺序存储结构 ----------- int LIST_INIT_SIZE=100;   //顺序表存储空间初始尺寸 int LISTINCREMENT=10;  //顺序表存储空间分配增量 typedef  int  ElemType;          //顺序表元素的数据类型为整数 //存储结构定义:顺序表 typedef struct { ElemType *el

顺序表编程考点

1.顺序表删除算法 //顺序表删除算法 typedef struct{ Elemtype *elem; int length; int listsize; }Sqlist; int ListDelete_sq(Sqlist *L,int i) //删除顺序表L中的第i个元素 { int k; if(i<1 || i>L->length) //删除位置出错 return 0; for(k = i;k< L->length; k++) //从第i+1个位置开始,每个元素前移一个位

&quot;数据结构翻转课堂&quot;答疑实录——顺序表

[说明] 本文是<数据结构>翻转课堂在线答疑的实录,由云班课的"答疑/讨论"功能中导出数据整理而成.. [重要提示] 下面的内容,按时间从后往前的顺序提供,请直接到文章末尾,倒着看更顺畅. [课程实践答疑实录] 焦梦真2015-09-20 11:19:20说 太难了 贺利坚2015-09-20 11:25:48答 练就将军本色之时到了.待回头看,江山本是如此多娇! 高露2015-09-19 15:14:50 用指针和线性表那一块... 王增亮2015-09-15 21:18

数据结构实践项目——顺序表

[项目1 - 顺序表的基本运算] 领会"0207将算法变程序"部分建议的方法,将顺序表部分的算法变成程序. 实现顺序表基本运算有算法(对应视频0204创建线性表的实现和0205顺序表基本运算的实现),依据"最小化"的原则进行测试.所谓最小化原则,指的是利用尽可能少的基本运算,组成一个程序,并设计main函数完成测试. 作为第一个这种类型的实践(后续每一部分均有这种实践,这是我们学习的基础,也是实践成果积累的基础),结合相关的算法,给出建议的过程: (1)目的是要测试

《数据结构》复习之线性表(顺序表和链表)

线性表的概念 线性表的比较 线性表的数据结构 顺序表的算法操作 双链表的补充 总结 1.线性表的概念 线性表的存储结构有顺序存储结构和链式存储结构两种.前者成为顺序表,后者称为链表. 顺序表: 顺序表就是把线性表中的所有元素按照其逻辑顺序,一次存储到从指定的存储 位置开始的一块连续的存储空间中,如下图所示. 链表 在链表的存储中,每一个节点不仅包含所存元素本身的信息,还包含元素之间的逻辑关系的信息,即前驱节点包含后继节点的地址信息,这样就可以通过前驱节点中的地址信息方便地找到后继节点的位置,如下

顺序表算法设计笔记

1.已知长度为 n 的线性表 A 采用顺序存储结构.设计一个时间复杂度为O(n).空间复杂度为O(1)的算法,该算法删除线性表中所有值为 x 的元素数据元素. 以下两种方法都不满足要求: 如果删除一个值为 x 的元素都进行移动, 其时间复杂度为O(n^2),时间复杂度为O(1). 如果借助一个新的顺序表, 存放将A中所有不为x的元素,其时间复杂度O(n), 空间复杂度为O(n). 解法一:设删除 A 中所有值等于 x 元素后的顺序表为A1, 显然A1包含在 A 中, 为此A1重用 A 的空间.