顺序表代码实现

本文详细介绍了在C语言中使用SeqList数据结构实现顺序表的头插法、尾插法、指定位置插入、指定元素删除以及指定位置删除的操作方法,并提供了完整的代码示例。
摘要由CSDN通过智能技术生成

头插法插入元素

过程
头插法

代码

//头插法
void insertHeadSeqList(SeqList *list, int data) {
    if (list->size == list->length) {
        expandSeqList(list);
    }
    for (int i = list->size; i > 0; --i) {
        list->data[i] = list->data[i - 1];
    }
    list->data[0] = data;
    list->size++;
}

尾插法插入元素

过程
尾插法

代码

//尾插法
void insertTailSeqList(SeqList *list, int data) {
    if (list->size == list->length) {
        expandSeqList(list);
    }
    list->data[list->size++] = data;
}

指定位置插入

过程
指定位置插入

代码

//指定下标插入
void insertSeqList(SeqList *list, int data, int index) {
    if (index < 0 || index > list->size) {
        printf("插入失败!\n");
        return;
    }
    if (list->size == list->length) {
        expandSeqList(list);
    }
    for (int i = list->size; i > index; --i) {
        list->data[i] = list->data[i - 1];
    }
    list->data[index] = data;
    list->size++;
}

指定元素删除

过程
指定元素删除

代码

//指定元素删除
void deleteDataSeqList(SeqList *list, int data) {
    for (int i = 0; i < list->size; ++i) {
        if (list->data[i] == data) {
            for (int j = i; j < list->size - 1; j++) {
                list->data[j] = list->data[j + 1];
            }
            list->size--;
            i--;
        }
    }
}

指定位置删除

过程
指定位置删除
代码

//指定下标删除
void deleteIndexSeqList(SeqList *list, int index) {
    if (index < 0 || index > list->size - 1) {
        printf("删除失败!\n");
        return;
    }
    for (int i = index; i < list->size - 1; i++) {
        list->data[i] = list->data[i + 1];
    }
    list->size--;
}

完整代码实现

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

//顺序表
typedef struct SeqList {
    int *data; //数据
    int size; //有效数据大小
    int length; //当前总容量长度
} SeqList;

//初始化
void initSeqList(SeqList *list) {
    list->size = 0;
    list->length = 10;
    list->data = (int *) malloc(sizeof(int) * list->length);
}

//扩容
void expandSeqList(SeqList *list) {
    list->length += 10;
    int *data = (int *) realloc(list->data, sizeof(int) * list->length);
    list->data = data;
}

//头插法
void insertHeadSeqList(SeqList *list, int data) {
    if (list->size == list->length) {
        expandSeqList(list);
    }
    for (int i = list->size; i > 0; --i) {
        list->data[i] = list->data[i - 1];
    }
    list->data[0] = data;
    list->size++;
}

//尾插法
void insertTailSeqList(SeqList *list, int data) {
    if (list->size == list->length) {
        expandSeqList(list);
    }
    list->data[list->size++] = data;
}

//指定下标插入
void insertSeqList(SeqList *list, int data, int index) {
    if (index < 0 || index > list->size) {
        printf("插入失败!\n");
        return;
    }
    if (list->size == list->length) {
        expandSeqList(list);
    }
    for (int i = list->size; i > index; --i) {
        list->data[i] = list->data[i - 1];
    }
    list->data[index] = data;
    list->size++;
}

//指定元素删除
void deleteDataSeqList(SeqList *list, int data) {
    for (int i = 0; i < list->size; ++i) {
        if (list->data[i] == data) {
            for (int j = i; j < list->size - 1; j++) {
                list->data[j] = list->data[j + 1];
            }
            list->size--;
            i--;
        }
    }
}

//指定下标删除
void deleteIndexSeqList(SeqList *list, int index) {
    if (index < 0 || index > list->size - 1) {
        printf("删除失败!\n");
        return;
    }
    for (int i = index; i < list->size - 1; i++) {
        list->data[i] = list->data[i + 1];
    }
    list->size--;
}

//打印顺序表
void printSeqList(SeqList *list) {
    for (int i = 0; i < list->size; ++i) {
        printf("%d ", list->data[i]);
    }
    printf("\n");
    printf("有效数据大小:%d\n", list->size);
    printf("当前容量大小:%d\n", list->length);
}

//测试代码
void test() {
    SeqList list;
    initSeqList(&list);
    int sel, data, index;
    while (true) {
        printf("1.头插法插入\n2.尾插法插入\n3.指定下标插入\n4.指定元素删除\n5.指定下标删除\n6.打印顺序表\n");
        scanf("%d", &sel);
        switch (sel) {
            case 1: {
                printf("元素:");
                scanf("%d", &data);
                insertHeadSeqList(&list, data);
                break;
            }
            case 2: {
                printf("元素:");
                scanf("%d", &data);
                insertTailSeqList(&list, data);
                break;
            }
            case 3: {
                printf("元素:");
                scanf("%d", &data);
                printf("下标:");
                scanf("%d", &index);
                insertSeqList(&list, data, index);
                break;
            }
            case 4: {
                printf("元素:");
                scanf("%d", &data);
                deleteDataSeqList(&list, data);
                break;
            }
            case 5: {
                printf("下标:");
                scanf("%d", &index);
                deleteIndexSeqList(&list, index);
                break;
            }
            case 6: {
                printSeqList(&list);
                break;
            }
            default:
                return;
        }
        system("pause");
        system("cls");
    }
}

int main() {
    test();
    return 0;
}
  • 32
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花园宝宝没有天线

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值