順序錶及順序錶前後增删代碼(C語言)

清晨白米稀飯. 2022-01-08 03:19:02 阅读数:372

增删

順序錶及順序錶前後增删代碼(C語言)

一、順序錶

1.1概念及結構

順序錶是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構,一般情况下采用數組存儲。在數組上完成數據的增删查改。(順序錶就是數組,但是在數組的基礎上,要求數據是從頭開始並且連續存儲的,不能跳躍間隔存放
順序錶一般可以分為:
1. 靜態順序錶:使用定長數組存儲元素。
在這裏插入圖片描述
2. 動態順序錶:使用動態開辟的數組存儲。
在這裏插入圖片描述

二、順序錶增删代碼(C語言)

靜態順序錶只適用於確定知道需要存多少數據的場景。靜態順序錶的定長數組導致N定大了,空間開多了浪費,開少了不够用。所以現實中基本都是使用動態順序錶,根據需要動態的分配空間大小,所以下面我們實現動態順序錶。
我們創建
一個頭文件:SeqList.h
兩個源文件:1、SeqList.c 2、Test.c
SeqList.h 文件下的 代碼:

#include<stdio.h>
#include<stdlib.h>
typedef int SLDataType;
//動態順序錶
typedef struct SeqList//定義一個結構體
{

SLDataType *a;
int size;//大小 錶示數組中儲存了多少個數據
int capacity;
}SL;
void SeqListnewcapacity(SL* ps);//增容函數
void SeqListPrint(SL* ps);//打印函數
void SeqListDestory(SL* ps);//釋放空間
//接口函數 命名規範參照STL
void SeqListPushInit(SL* ps);//初始化結構體
void SeqListPushBack(SL* ps, SLDataType x);//在順序錶後面增加一個數
void SeqListPopBack(SL* ps);//删除順序錶最後一個
void SeqListPushFront(SL* ps, SLDataType x);//在順序錶前面增加一個數
void SeqListPopFront(SL* ps);//在順序錶前面删除一個數

SeqList.c文件下的代碼 (主要為函數的實現)

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
void SeqListPrint(SL* ps)//打印函數
{

for (int i = 0; i < ps->size; i++)
{

printf("%d ", ps->a[i]);
}
printf("\n");
}
void SeqListPushInit(SL* ps)//結構體初始化---Init 初始化
{

ps->a = NULL;
ps->capacity = ps->size = 0;
}
void SeqListnewcapacity(SL* ps)//開辟一個空間
{

if (ps->size == ps->capacity)
{

//newcapacity——新容量
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
//如果ps->capacity=0那麼newcapacity就等於4,
//否則就等於capacity的兩倍
SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));
//開劈一個空間
if (tmp == 0)
{

printf("realloc fail\n");
exit(-1);//終止程序
}
ps->a = tmp;
ps->capacity = newcapacity;
}
}
void SeqListDestory(SL* ps)//釋放前面開辟的空間
{

free(ps->a);
ps->a = NULL;
ps->capacity = ps->size = 0;
}
void SeqListPushBack(SL* ps, SLDataType x)//在順序錶後面增加一個數
{

SeqListnewcapacity(ps);
ps->a[ps->size] = x;
ps -> size++;
}
void SeqListPopBack(SL* ps)//删除末尾數
{

if (ps->size != 0)
{

ps->size--;
}
}
void SeqListPushFront(SL* ps, SLDataType x)//在順序錶前面增加一個數
{

SeqListnewcapacity(ps);
int end = ps->size - 1;
while (end >= 0)
{

ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[0] = x;
ps->size++;
}
void SeqListPopFront(SL* ps)
{

if (ps->size != 0)
{

int begin = 1;
while (begin < ps->size)
{

ps->a[begin - 1] = ps->a[begin];
begin++;
}
ps->size--;
}
}

Test.c文件下的代碼:

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
TestSeqList1()
{

SL s1;//定義一個s1
SeqListPushInit(&s1);
SeqListPushBack(&s1, 1);
SeqListPushBack(&s1, 2);
SeqListPushBack(&s1, 3);
SeqListPushBack(&s1, 4);
SeqListPushBack(&s1, 5);
SeqListPrint(&s1);
SeqListPopBack(&s1);
SeqListPopBack(&s1);
SeqListPopBack(&s1);
SeqListPrint(&s1);
SeqListDestory(&s1);
}
TestSeqList2()
{

SL s1;//定義一個s1
SeqListPushInit(&s1);
SeqListPushBack(&s1, 1);
SeqListPushBack(&s1, 2);
SeqListPushBack(&s1, 3);
SeqListPushBack(&s1, 4);
SeqListPushBack(&s1, 5);
SeqListPrint(&s1);
SeqListPushFront(&s1, 10);
SeqListPushFront(&s1, 40);
SeqListPrint(&s1);
SeqListPopFront(&s1);
SeqListPopFront(&s1);
SeqListPopFront(&s1);
SeqListPrint(&s1);
SeqListDestory(&s1);
}
int main()
{

//TestSeqList1();//順序錶的尾增删
TestSeqList2();//順序錶的前增删
//為了測試方便前後的增删分開
return 0;
}
版权声明:本文为[清晨白米稀飯.]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201080319017830.html