顺序表数组法构建(C语言描述)

简介: 如何使用C语言通过数组方法构建有序顺序表,包括顺序表的创建、插入、删除和打印等。

数组式顺序表

#include <stdio.h>
#include <stdlib.h>

#define MAX 5

//为数据构建一个键值作为比较的准则
typedef struct dataType {
    int key;    //通过数据中的key作为准则构建有顺序的表
    char name[20];
}DATA,*LPDATA;

//描述顺序表这种结构
typedef struct SqList_tlg {
    LPDATA memory;     //存放数据的容器
    int curSize;     //当前表实际元素个数
    int maxSize;     //顺序表的最大容量
}SQLIST,*LPSQLIST;

//创建顺序表
LPSQLIST createSqlist(){
    LPSQLIST list = (LPSQLIST)malloc(sizeof(SQLIST));
    if (NULL == list) {
        printf("顺序表申请失败!\n");
        return NULL;
    }
    list->memory = (LPDATA)malloc(sizeof(DATA) * MAX);
    if (NULL == list->memory) {
        printf("容器内存申请失败!\n");
        return NULL;
    }
    list->curSize = 0;
    list->maxSize = MAX;
    return list;
}

//寻找插入的合适位置
int searchPos(LPSQLIST sqList,DATA data) {
    if (NULL == sqList)
        exit(0);
    for (int i = 0; i < sqList->curSize; i++)
    {
        if (sqList->memory[i].key > data.key) {
            return i;
        }
    }
    return sqList->curSize;
}
//顺序表扩容
void reallSqList(LPSQLIST sqList) {
    sqList->maxSize += 10;
    if (NULL != sqList) {
        int* p = (int*)realloc(sqList->memory, sizeof(DATA) * sqList->maxSize);
        if (NULL != p) {
            printf("顺序表已扩容!\n");
            sqList->memory = p;
        }
        else {
            printf("顺序表扩容失败!\n");
            return;
        }
    }
}
//插入
void insertData(LPSQLIST sqList,DATA data) {
    if (NULL == sqList)
        exit(0);
    //1.直接插入到表后面
    if (sqList->curSize >= sqList->maxSize) {
        //给顺序表扩容
        reallSqList(sqList);
    }
    sqList->memory[sqList->curSize++] = data;
    //2.挪动到合适的位置
    for (int i = sqList->curSize - 1; i > 0; i--)
    {
        if (sqList->memory[i].key < sqList->memory[i - 1].key) {
            DATA temp = sqList->memory[i];
            sqList->memory[i] = sqList->memory[i - 1];
            sqList->memory[i - 1] = temp;
        }
        else {
            break;
        }
    }

    //找到应该插入的位置直接插入数据
    //int pos = searchPos(sqList, data);
    //for (int i = sqList->curSize - 1; i > pos; i--)
    //{
    //    if (sqList->memory[i].key < sqList->memory[i - 1].key) {
    //        DATA temp = sqList->memory[i];
    //        sqList->memory[i] = sqList->memory[i - 1];
    //        sqList->memory[i - 1] = temp;
    //    }
    //    else {
    //        break;
    //    }
    //}
}
//删除
int searchByKey(LPSQLIST sqList, int key) {
    for (int i = 0; i < sqList->curSize; i++)
    {
        if (sqList->memory[i].key == key)
            return i;
    }
    return -1;   //没有找到
}
void deleteByKey(LPSQLIST sqList, int key) {
    if (empty(sqList))
        exit(0);
    //找到key的位置, 数组元素向前覆盖
    int pos = searchByKey(sqList, key);
    if (pos == -1) {
        printf("未找到指定数据,删除失败!\n");
        return;
    }
    else {
        for (int i = pos; i < sqList->curSize; i++)
        {
            sqList->memory[i] = sqList->memory[i + 1];
        }
        sqList->curSize--;
    }
}
//销毁表
void destroy(LPSQLIST* sqList) {
    if (sqList == NULL)
        exit(0);
    free((*sqList)->memory);
    (*sqList)->memory = NULL;
    free(*sqList);
    *sqList = NULL;
}

//万金油函数
int empty(LPSQLIST list) {
    if (list == NULL)
        exit(0);
    return list->curSize == 0;
}
int size(LPSQLIST list) {
    if (list == NULL)
        exit(0);
    return list->curSize;
}

//遍历顺序表: 打印数组中数据
void printSqList(LPSQLIST sqList) {
    if (NULL == sqList)
        exit(0);
    for (int i = 0; i < sqList->curSize; i++) {
        printf("key:%d,data:%s\n", 
            sqList->memory[i].key, 
            sqList->memory[i].name);
    }
    printf("\n");
}

int main()
{
    LPSQLIST sqList = createSqlist();
    DATA array[9] = { {2,"张三"},{4,"李四"},{1,"貂蝉"},
    {9,"卢梦"},{8,"涨涨"},{5,"哈哈"} ,{7,"哼哼"},{6,"琵琶"},{3,"老贵"} };
    for (int i = 0; i < 9; i++)
    {
        insertData(sqList,array[i]);
    }
    printSqList(sqList);

    deleteByKey(sqList, 5);
    printSqList(sqList);

    if (sqList != NULL) {
        printf("顺序表未销毁!\n");
    }
    destroy(&sqList);
    if (sqList == NULL) {
        printf("顺序表已经销毁!\n");
    }

    system("pause");
    return 0;
}
相关文章
|
10天前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
33 3
|
19天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
34 6
|
22天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
28天前
|
存储 人工智能 BI
C语言:数组的分类
C语言中的数组分为一维数组、多维数组和字符串数组。一维数组是最基本的形式,用于存储一系列相同类型的元素;多维数组则可以看作是一维数组的数组,常用于矩阵运算等场景;字符串数组则是以字符为元素的一维数组,专门用于处理文本数据。
|
26天前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
|
30天前
|
存储 数据管理 编译器
揭秘C语言:高效数据管理之数组
揭秘C语言:高效数据管理之数组
|
29天前
|
C语言 C++
保姆式教学C语言——数组
保姆式教学C语言——数组
16 0
保姆式教学C语言——数组
|
28天前
|
C语言
C语言数组
C语言数组
16 0
|
29天前
|
存储 C语言 索引
c语言回顾-数组(全网最详细,哈哈哈) (下)
c语言回顾-数组(全网最详细,哈哈哈) (下)
42 0
|
29天前
|
存储 编译器 C语言
c语言回顾-数组(全网最详细,哈哈哈)(上)
c语言回顾-数组(全网最详细,哈哈哈)(上)
55 0