数据结构-概念及顺序表

发布于:2025-06-19 ⋅ 阅读:(20) ⋅ 点赞:(0)

实现顺序表的头插、尾插、头删、尾删(释放顺序表)

//头文件

#ifndef __SEQ_H__
#define __SEQ_H__
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100  // 顺序表的最大容量
typedef struct {
    int data[MAX_SIZE];  // 存储数据的数组
    int length;          // 当前顺序表的长度
} SeqList;

void initList(SeqList *L);
int insertAtHead(SeqList *L, int element);
int insertAtTail(SeqList *L, int element);
int deleteAtHead(SeqList *L);
int deleteAtTail(SeqList *L);
void freeList(SeqList *L);
void printList(SeqList *L);

#endif                
// 主函数 文件
#include "seq.h"
// 测试函数
int main() {
    SeqList list;
    initList(&list);
    
    // 测试插入操作
    insertAtTail(&list, 10);
    insertAtTail(&list, 20);
    insertAtHead(&list, 5);
    insertAtTail(&list, 30);
    printList(&list);                                             
    
    // 测试删除操作
    printf("删除头部元素: %d\n", deleteAtHead(&list));
    printf("展示删除头部元素的效果\n");
    printList(&list);
    printf("插入头部元素: %d\n", insertAtHead(&list,100));
    printf("展示插入后的效果\n");
    printList(&list);
    printf("插入尾部元素: %d\n", insertAtTail(&list,50));
    printf("展示插入后的效果\n");
    printList(&list);
    printf("删除尾部元素: %d\n", deleteAtTail(&list));
    

    printList(&list);
    
    // 释放顺序表
    freeList(&list);
    printf("释放顺序表后: ");
    printList(&list);
    
    return 0;
}
                    

//功能函数文件
#include "seq.h"

// 初始化顺序表
void initList(SeqList *L) {
    L->length = 0;  // 初始长度为0
}


// 头删法:删除顺序表的第一个元素
int deleteAtHead(SeqList *L) {
    if (L->length <= 0) {
        printf("顺序表为空,无法删除\n");
        return 0;  // 删除失败
    }

    int deleted = L->data[0];  // 保存被删除的元素

    // 将后面的元素前移一位
    for (int i = 0; i < L->length - 1; i++) {
        L->data[i] = L->data[i+1];
    }

    L->length--;  // 长度减1
    return deleted;  // 返回被删除的元素
}

// 尾删法:删除顺序表的最后一个元素
int deleteAtTail(SeqList *L) {
    if (L->length <= 0) {
        printf("顺序表为空,无法删除\n");
        return 0;  // 删除失败
    }

    L->length--;  // 长度减1
    return L->data[L->length];  // 返回被删除的元素
}
// 头插法:在顺序表的头部插入元素                                   
int insertAtHead(SeqList *L, int element) {
    if (L->length >= MAX_SIZE) {
        printf("顺序表已满,无法插入\n");
        return 0;  // 插入失败
    }
     // 将所有元素后移一位
    for (int i = L->length; i > 0; i--) {
        L->data[i] = L->data[i-1];
    }
    L->data[0] = element;  // 在头部插入新元素
    L->length++;           // 长度加1
    return 1;  // 插入成功
}
// 尾插法:在顺序表的尾部插入元素                            
int insertAtTail(SeqList *L, int element) {
    if (L->length >= MAX_SIZE) {
        printf("顺序表已满,无法插入\n");
        return 0;  // 插入失败
    }

    L->data[L->length] = element;  // 在尾部插入新元素
    L->length++;                   // 长度加1
    return 1;  // 插入成功
}

// 释放顺序表(对于静态数组实现的顺序表,只需重置长度)
void freeList(SeqList *L) {
    L->length = 0;  // 重置长度为0
    // 由于使用的是静态数组,不需要释放内存
}

// 打印顺序表
void printList(SeqList *L) {
    printf("顺序表内容: ");
    for (int i = 0; i < L->length; i++) {
        printf("%d ", L->data[i]);
    }
    printf("\n长度: %d\n", L->length);
}

输出结果:

思维导图:


网站公告

今日签到

点亮在社区的每一天
去签到