栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言-数据结构-动态顺序表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言-数据结构-动态顺序表

本代码编辑在CLion环境上,若要复制代码运行起来需要修改一些地方。

代码分为 3 个部分,头文件 list.h, 实现头文件的 list.c 和 main.c 文件。

大部分代码都有注释,但是没有配合对应的图解,需要在读代码是自己构想。

代码纯手写,如有不足之处,请多指教

main.c 部分
#include 
#include "list.h"

int main() {
    struct list* list = list_init();
    list_add(list, 99);
    list_print(list);
    list_add(list, 78);
    list_insert(list, 0, 88);
    list_print(list);
    list_add(list, 100);
    list_print(list);
    int e;
    list_remove(list, 1, &e);
    list_print(list);
    printf("%d %dn", list_get(list, 1), list_get(list, 2));
    list_set(list, 0, 5);
    list_print(list);

    list_free(list);
    return 0;
}
list.h 部分
//
// Created by Sur qing on 2022/5/17.
//

#ifndef SEQUENCE_LIST_H
#define SEQUENCE_LIST_H

struct list;



struct list* list_init();



void list_free(struct list* list);



int list_count(struct list* list);



void list_clear(struct list* list);



int list_isEmpty(struct list* list);



int list_contains(struct list* list, int e);



int list_insert(struct list* list, int index, int e);



void list_add(struct list* list, int e);



int list_set(struct list* list, int index, int e);



void list_remove(struct list* list, int index, int* e);



int list_get(struct list* list, int index);



void list_print(struct list* list);

#endif //SEQUENCE_LIST_H
list.c 部分
//
// Created by Sur qing on 2022/5/17.
//

#include 
#include "stdlib.h"
#include "stdio.h"

#include "list.h"


#define INIT_SIZE 50
#define INCR_SIZE 50

// 定义 list 结构体
struct list {
    int *data;
    int size;
    int count;
};

struct list* list_init() {
    // 为 list 结构体分配内存
    struct list* list = NULL;
    list = (struct list*) malloc(sizeof(struct list));
    assert(list != NULL);
    

    // 将 list 结构体初始化
    list->data = NULL;
    list->data = (int*) calloc(INIT_SIZE, sizeof(int));
    assert(list->data);
    
    list->size = INIT_SIZE;
    list->count = 0;

    return list;
}

void list_free(struct list* list) {
    assert(list);
    // 释放指向数据的内存
    free(list->data);
    // 释放指向结构体的内存
    free(list);

    return;
}

int list_count(struct list* list) {
    assert(list);
    assert(list->count >= 0);
    return list->count;
}

void list_clear(struct list* list) {
    assert(list);
    list->count = 0;

    return;
}

int list_isEmpty(struct list* list) {
    assert(list);
    return list->count == 0;
}

int list_contains(struct list* list, int e) {
    assert(list);
    int i;

    for (i = 0; i < list->count; i++) {
        if (list->data[i] == e) return 1;
    }

    return 0;
}

int list_insert(struct list* list, int index, int e) {
    assert(list);
    // 如果 下标不合法,返回 0 表示插入失败
    if (index < 0 || index > list->count) return 0;
    // 如果链表已经存满,则需要增加内存
    if (list->count >= list->size) {
        int* temp = NULL;
        temp = (int*) realloc(list->data, sizeof(int) * (list->size + INCR_SIZE));
        
        assert(list);
        list->data = temp;
        // 别忘了更新 list 的大小
        list->size += INCR_SIZE;
    }

    // 将index后面的元素往后移,为插入的元素腾出位置
    int i;
    for (i = list->count; i > index; i--) {
        list->data[i] = list->data[i - 1];
    }

    list->data[index] = e;
    list->count++;

    // 返回 1 表示插入成功
    return 1;
}

void list_add(struct list* list, int e) {
    assert(list);
    // 当在末尾添加元素时,数组满了的时候,调整内存大小,同 list_insert()
    if (list->count >= list->size) {
        int* temp = (int*) realloc(list->data, sizeof(int) * (list->size + INCR_SIZE));
        list->data = temp;
        list->size += INCR_SIZE;
    }

    list->data[list->count++] = e;

    return;
}

int list_set(struct list* list, int index, int e) {
    assert(list);
    // 如果index无效,返回 0 表示设置失败
    if (index < 0 || index > list->count) return 0;

    list->data[index] = e;

    return 1;
}

void list_remove(struct list* list, int index, int* e) {
    assert(list);
    // 如果index无效,返回 0 表示删除元素失败
    if (index < 0 || index > list->count) return;

    // 将删除后的元素值保存在 e 中
    *e = list->data[index];

    // 将index后面的元素往前移,填补删除后的空缺
    int i;
    for (i = index; i < list->count - 1; i++) {
        list->data[i] = list->data[i + 1];
    }

    list->count--;

    return;
}

int list_get(struct list* list, int index) {
    assert(list);
    assert(index >= 0 && index < list->count);

    return list->data[index];
}

void list_print(struct list* list) {
    assert(list);
    int i;

    for (i = 0; i < list->count - 1; i++) {
        printf("%d, ", list->data[i]);
    }
    printf("%dn", list->data[list->count - 1]);

    return;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917140.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号