实现顺序表的头插、尾插、头删、尾删(释放顺序表)
//头文件
#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);
}
输出结果:
思维导图: