一.正文
嗨嗨嗨!大家好!今天我為大家分享的是數(shù)據(jù)結(jié)構(gòu)知識(shí)——順序表。廢話不多數(shù),讓我們開(kāi)始今天的知識(shí)分享吧。
二.正文
1.1認(rèn)識(shí)數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。數(shù)據(jù)結(jié)構(gòu)反映數(shù)據(jù)的內(nèi)部構(gòu)成,即數(shù)據(jù)由那部分構(gòu)成,以什么方式構(gòu)成,以及數(shù)據(jù)元素之間呈現(xiàn)的結(jié)構(gòu)。
1.2循序表與數(shù)組之間的關(guān)系
其實(shí)數(shù)組就是最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)就是對(duì)數(shù)據(jù)進(jìn)行有效的管理。你可能有疑問(wèn)了?“既然我們有了數(shù)組為什么還要循序表呢?”
數(shù)組和順序表雖然在存儲(chǔ)結(jié)構(gòu)上相似,但它們?cè)诟拍顚用妗㈧`活性以及應(yīng)用場(chǎng)景上有所不同。具體分析如下:
1. 概念層面:數(shù)組是編程語(yǔ)言中的一種數(shù)據(jù)類(lèi)型,用于存儲(chǔ)固定數(shù)量的同類(lèi)型元素,而順序表是一種數(shù)據(jù)結(jié)構(gòu),它強(qiáng)調(diào)的是元素之間“一對(duì)一”的邏輯關(guān)系。順序表不僅可以存儲(chǔ)數(shù)據(jù),還可以表達(dá)數(shù)據(jù)之間的邏輯順序,這是數(shù)組所不具備的。
2. 靈活性:數(shù)組的大小在聲明時(shí)就已經(jīng)確定,無(wú)法動(dòng)態(tài)改變,而順序表作為一種數(shù)據(jù)結(jié)構(gòu),可以根據(jù)需要?jiǎng)討B(tài)地增加或減少元素,這在處理不確定數(shù)量的數(shù)據(jù)時(shí)更加靈活。
3. 應(yīng)用場(chǎng)景:數(shù)組適用于那些元素?cái)?shù)量固定且需要頻繁訪問(wèn)的情況,如用于實(shí)現(xiàn)簡(jiǎn)單的查找和排序算法。順序表則更適用于需要頻繁插入和刪除操作的場(chǎng)景,因?yàn)樗梢员3謹(jǐn)?shù)據(jù)的有序性并且能夠快速地調(diào)整存儲(chǔ)空間。
總的來(lái)說(shuō),盡管數(shù)組可以作為順序表的一種實(shí)現(xiàn)方式,但順序表作為一種數(shù)據(jù)結(jié)構(gòu),其設(shè)計(jì)和使用都是為了解決更加復(fù)雜的數(shù)據(jù)組織和處理問(wèn)題。在實(shí)際應(yīng)用中,選擇使用數(shù)組還是順序表,取決于具體的應(yīng)用需求和場(chǎng)景。?
2.1循序表的概念
循序表是線性表的一種。本質(zhì)是基于數(shù)組對(duì)數(shù)據(jù)進(jìn)行增刪查改等操作的。
2.2線性表
線性表是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。線性表是一種在實(shí)際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),常見(jiàn)的線性表:循序表、鏈表、棧、隊(duì)列、字符串~
線性表在邏輯上是線性結(jié)構(gòu),也就是連續(xù)的一條直線。但是在物理結(jié)構(gòu)上并不一定是連續(xù)的,線性表在物理上存儲(chǔ)時(shí),通常以數(shù)組和鏈?zhǔn)浇Y(jié)構(gòu)的形式存儲(chǔ)。
案例:蔬菜分為綠葉類(lèi)、瓜類(lèi)、菌菇類(lèi)。線性表指的是具有部分相同特性的一類(lèi)數(shù)據(jù)結(jié)構(gòu)的集合
2.3順序表的實(shí)現(xiàn)
在這里為大家?guī)?lái)的循序表實(shí)現(xiàn)了對(duì)于數(shù)組元素實(shí)現(xiàn)增刪查改這四個(gè)功能(同學(xué)們可以自行補(bǔ)充功能)
在這里我們實(shí)現(xiàn)該循序表采用了多文件形式。
分為頭文件SeqList.h和源文件SeqList.c和test.c。
SeqList.h:實(shí)現(xiàn)我們使用各個(gè)函數(shù)過(guò)程中的聲明。
SeqList.c:實(shí)現(xiàn)各個(gè)函數(shù)的實(shí)現(xiàn)。
test.c:當(dāng)我們實(shí)現(xiàn)一個(gè)功能或函數(shù)的時(shí)候,在該文件中進(jìn)行測(cè)試,測(cè)試所寫(xiě)函數(shù)是否正常運(yùn)行。
廢話不多數(shù)直接上代碼:
SeqList.h
#pragma once
//#define SLDateType int
typedef int SLDateType;
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef struct SeqList
{
SLDateType* arr;
int size;
int capacity;
}SL;
void SLInit();//循序表的初始化
void SLDestroy();//順序表的銷(xiāo)毀
void SLPushBack();//尾部插入
void SLPushFront();//頭部插入
void SLPopBack();//尾部刪除
void SLPopFront();//頭部刪除
void SLInsert();//指定位置插入
void SLErase();//指定位置刪除
int SLFind();//查找數(shù)據(jù)
SeqList.c:
#include"SeqList.h"
void SLInit(SL*ps)//循序表的初始化函數(shù)的實(shí)現(xiàn)
{
ps->arr = NULL;
ps->size = ps->capacity = 0;
}
void SLDestroy(SL* ps)//順序表銷(xiāo)毀的函數(shù)實(shí)現(xiàn)
{
if ((ps->arr) != NULL)
{
free(ps->arr);
}
ps->arr = NULL;
ps->size = ps->capacity = 0;
}
void SLCheckCapacity(SL*ps)
{
if (ps->capacity == ps->size)
{
int NewCapacity = ps->capacity == 0 ? 6 : 2 * ps->capacity;
SLDateType* tmp =(SLDateType*) realloc(ps->arr, NewCapacity * sizeof(SLDateType));
if (tmp ==NULL)
{
perror("realloc faile!");
return 1;
}
ps->arr= tmp;
ps->capacity = NewCapacity;
}
}
void SLPrint(SL* ps)
{
for (int i = 0; i < ps->size; i++)
{
printf("%d ", ps->arr[i]);
}
printf("\n");
}
//void SLPrint(SL s)
//{
// for (int i = 0; i <s .size; i++)
// {
// printf("%d ", s.arr[i]);
// }
// printf("\n");
//}
void SLPushBack(SL*ps,SLDateType x)//尾插函數(shù)的實(shí)現(xiàn)
{
assert(ps);
SLCheckCapacity(ps);
ps->arr[ps->size] = x;
ps->size++;
}
void SLPushFront(SL*ps,SLDateType x)//頭插函數(shù)的實(shí)現(xiàn)
{
assert(ps);
SLCheckCapacity(ps);
for (int i =ps-> size; i>0; i--)
{
ps->arr[i] = ps->arr[i - 1];
}
ps->arr[0] = x;
ps->size++;
}
void SLPopBack(SL*ps)//頭刪函數(shù)的實(shí)現(xiàn)
{
assert(ps);
assert(ps->size);
ps->size--;
}
void SLPopFront(SL* ps)//尾刪函數(shù)的實(shí)現(xiàn)
{
for (int i = 0; i <(ps->size)-1 ; i++)
{
ps->arr[i] = ps->arr[i + 1];
}
ps->size--;
}
void SLInsert(SL*ps,int pos,SLDateType x)//指定位置的插入
{
assert(ps);
assert(pos >= 0 && pos <= ps->size);
SLCheckCapacity(ps);
for (int i = ps->size; i >=pos+1; i--)
{
ps->arr[i] = ps->arr[i- 1];
}
ps->arr[pos] = x;
ps->size++;
}
void SLErase(SL*ps,int pos)
{
assert(ps);
assert(pos >= 0 && pos < ps->size);
for (int i = pos; i <= ps->size - 2; i++)
{
ps->arr[i] = ps->arr[i+1];
}
ps->size--;
}
int SLFind(SL* ps, SLDateType x)
{
assert(ps);
for (int i = 0; i <ps-> size; i++)
{
if (ps->arr[i] ==x)
{
return i;
}
}
return -1;
}
tes.c:
#include"SeqList.h"
int main()
{
SL sl;
SLInit(&sl);
SLPushBack(&sl, 0);
SLPushBack(&sl, 1);
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
//SLPushFront(&sl, 3);
// SLPushFront(&sl, 4);
//SLPopBack(&sl);
// SLPopFront(&sl);
// SLInsert(&sl, 3, 99);
//SLErase(&sl, 1);
SLFind(&sl, 2);
SLPrint(&sl);
int find = SLFind(&sl, 2);
if (find < 0)
{
printf("沒(méi)有找到\n");
}
else
{
printf("找到了,該數(shù)據(jù)下標(biāo)是%d\n", find);
}
return 0;
}
上面test.c代碼是本人自己在測(cè)試功能的時(shí)候用的,同學(xué)們自己根據(jù)實(shí)際需求測(cè)試自己的代碼即可。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-852106.html
三.結(jié)言
今天的知識(shí)分享就到此結(jié)束了。咱們下次再見(jiàn)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-852106.html
到了這里,關(guān)于C語(yǔ)言—實(shí)現(xiàn)循序表的增刪查改的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!