顺序表数组法构建(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;
}
相关文章
|
7天前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
21小时前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
11 2
|
23小时前
|
C语言
链式顺序表实现(C语言描述)
本文介绍了如何在C语言中实现链式顺序表,包括数据结构的定义、节点的创建、数据的插入和删除以及链表的打印和销毁。
11 2
|
23小时前
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
7 0
|
7天前
|
存储 编译器 C语言
【C语言】数组(一维、二维数组的简单介绍)
【C语言】数组(一维、二维数组的简单介绍)
|
22小时前
|
C语言
C语言数组练习以及场景练习题
C语言数组练习以及场景练习题
12 0
|
23小时前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
8 0
|
3天前
|
C语言
C语言数组练习之让生锈大脑转一下(练习篇)
C语言数组练习之让生锈大脑转一下(练习篇)
19 0
|
5天前
|
存储 C语言
初识C语言4——数组
初识C语言4——数组
34 0
|
1月前
|
存储 编译器 C语言
【C语言基础考研向】09 一维数组
数组是一种有序集合,用于存储相同类型的数据,便于统一操作与管理。例如,将衣柜底层划分为10个格子存放鞋子,便于快速定位。在C语言中,数组定义格式为 `类型说明符数组名[常量表达式];`,如 `int a[10];` 表示定义了一个包含10个整数的数组。数组初始化时可以直接赋值,也可以部分赋值,且数组长度必须固定。数组在内存中连续存储,访问时需注意下标范围,避免越界导致数据异常。数组作为参数传递时,传递的是首地址,修改会影响原数组。