线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
接下来就是实现具体的增删改查操作....
线性表结构体
typedef int ElemType;
typedef struct {
ElemType *elem;
int Length;
int ListSize;
}SqList;
线性表初始化
void InitList(SqList *L) {
L->elem = (ElemType*)malloc(INIT_SIZE * sizeof(ElemType));
if (!L->elem) {
printf(">初始化失败...\n");
exit(1);
}
else {
L->ListSize = INIT_SIZE;
L->Length = 0;
printf(">初始化成功...\n");
}
}
线性表清空
void CreatList(SqList *L) {
if (L == NULL) {
printf(">清空失败,该表不存在...\n");
return 0;
}
L->Length = 0;
memset(L->elem, 0, sizeof(ElemType)*L->ListSize);
printf(">清空成功...\n");
}
线性表销毁
void DestroyList(SqList *L) {
free(L->elem);
L->Length = 0;
L->ListSize = 0;
printf(">销毁成功...\n");
}
线性表排序
void ListSort(SqList *L) {
int temp;
for (int i = 0; i < L->Length - 1; i++) {
for (int j = 0; j < L->Length - 1 - i; j++) {
if (L->elem[j] > L->elem[j + 1]) {
temp = L->elem[j];
L->elem[j] = L->elem[j + 1];
L->elem[j + 1] = temp;
}
}
}
}
添加元素
void InsertList(SqList *L, int pos, ElemType e) {
if (pos < 1 || pos > L->Length + 1) {
printf(">添加位置非法...\n");
return 0;
}
if (L->Length == L->ListSize)
AgainMalloc(L);
for (int i = L->Length - 1; i >= pos - 1; i--)
L->elem[i + 1] = L->elem[i];
L->elem[pos - 1] = e;
L->Length++;
printf(">[%d,%d]添加成功...\n", pos, e);
}
/* 扩充空间 */
void AgainMalloc(SqList *L) {
ElemType *p = (ElemType*)realloc(L->elem, (L->ListSize + INCREMENT) * sizeof(ElemType));
if (!p) {
printf(">存储空间不足...\n");
return 0;
}
L->elem = p;
L->ListSize += INCREMENT;
}
删除元素
void DeleteList(SqList *L, int pos) {
if (pos < 1 || pos > L->Length) {
printf(">删除位置非法...\n");
return 0;
}
int temp = L->elem[pos - 1];
for (int i = pos; i < L->Length; i++)
L->elem[i - 1] = L->elem[i];
L->Length--;
printf(">[%d,%d]删除成功...\n", pos, temp);
}
修改元素
void UpdateList(SqList *L, int pos, ElemType e) {
if (pos < 1 || pos > L->Length) {
printf(">修改位置非法...\n");
return 0;
}
int temp = L->elem[pos - 1];
L->elem[pos - 1] = e;
printf(">[%d,%d -> %d]修改成功...\n", pos, temp, L->elem[pos - 1]);
}
按值查询
void LocateList(SqList *L, ElemType e) {
for (int i = 0; i < L->Length; i++)
{
if (e == L->elem[i]) {
printf(">[%d,%d]\n", i + 1, e);
return 0;
}
}
printf(">未查询到该值...\n");
}
按位查询
void GetElem(SqList *L, int pos) {
if (pos <= 0 || pos > L->Length) {
printf(">查询位置非法...\n");
return 0;
}
printf(">[%d,%d]\n",pos,L->elem[pos-1]);
}
打印线性表
void PrintfList(SqList *L) {
printf("\n[Length:%2d ListSize:%2d]\n", L->Length, L->ListSize);
printf("[ ");
for (int i = 0; i < L->Length; i++)
printf("%d ", L->elem[i]);
printf("]\n\n");
}
最终测试
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define INIT_SIZE 20 // 初始存储空间
#define INCREMENT 10 // 增量空间
/* 主函数 */
int main() {
SqList L;
int temp;
//初始化
InitList(&L);
//插入随机数据
srand((unsigned)time(0));
for (int i = 1; i <= 22; i++) {
temp = rand() % (100 - 1 + 1) + 1;
InsertList(&L, i, temp);
}
PrintfList(&L);
//删除数据
DeleteList(&L, 2);
PrintfList(&L);
//更新数据
UpdateList(&L, 3, 99);
PrintfList(&L);
//按值查询
LocateList(&L, 99);
//按位查询
GetElem(&L, 4);
//排序
ListSort(&L);
PrintfList(&L);
//清空
CreatList(&L);
//销毁
DestroyList(&L);
}