国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu):詳解【順序表】的實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu):詳解【順序表】的實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 順序表的定義

順序表是用一段物理地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲(chǔ)。動(dòng)態(tài)順序表與數(shù)組的本質(zhì)區(qū)別是——根據(jù)需要?jiǎng)討B(tài)的開辟空間大小。

2. 順序表的功能

動(dòng)態(tài)順序表的功能一般有如下幾個(gè):

  • 初始化順序表
  • 打印順序表中的數(shù)據(jù)
  • 檢查順序表的容量
  • 順序表頭部插入數(shù)據(jù)
  • 順序表尾部插入數(shù)據(jù)
  • 順序表頭部刪除數(shù)據(jù)
  • 順序表尾部刪除數(shù)據(jù)
  • 順序表任意位置插入數(shù)據(jù)
  • 順序表任意位置刪除數(shù)據(jù)
  • 順序表中查找數(shù)據(jù)
  • 順序表中修改指定位置數(shù)據(jù)
  • 順序表的銷毀

3.順序表各功能的實(shí)現(xiàn)

3.1 創(chuàng)建順序表

typedef int SQDateType;//對(duì)int進(jìn)行重命名,可增加代碼的普適性。

typedef struct SeqList
{
	SQDateType* a;
	size_t size; //有效數(shù)據(jù)
	size_t capacity;//容量的空間大小
}SL;//對(duì)這個(gè)結(jié)構(gòu)體重命名為SL,書寫方便

數(shù)據(jù)結(jié)構(gòu):詳解【順序表】的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),c語言

3.2 初始化順序表
由于建立順序表后并沒有原始空間,所以我們自行動(dòng)態(tài)開辟空間,又因?yàn)楹罄m(xù)要進(jìn)行擴(kuò)容,所以我們必須初始化容量大小。

void SeqListInit(SL*ps)
{
	ps->a = (SQDateType*)malloc(sizeof(SQDateType) * 4);//初始化開辟4個(gè)int類型的空間
	//檢查是否開辟成功
	if (ps->a == NULL)
	{
		printf("malloc fail!\n");
		return;
	}
	ps->capacity = 4;//初始化容量大小為4
	ps->size = 0;
}

3.3 打印順序表中的數(shù)據(jù)
對(duì)順序表進(jìn)行增刪查改等操作后,我們要把數(shù)據(jù)打印在控制臺(tái)以便觀察。

void SeqListPrint(SL* ps)
{
	//判斷順序表中是否有數(shù)據(jù)
	assert(ps->size > 0);
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

3.4 檢查順序表的容量
對(duì)順序表進(jìn)行插入(增加)數(shù)據(jù)的操作時(shí),我們必須先對(duì)順序表進(jìn)行容量的檢查,若容量不夠,則擴(kuò)容。
并且擴(kuò)容的幅度一般是原來容量的2倍。

void CheckSeqListCapacity(SL*ps)
{
	assert(ps);//斷言
	//檢查容量是否已滿
	if (ps->capacity == ps->size)
	{
		//擴(kuò)容
		SQDateType* tmp = (SQDateType*)realloc(ps->a, ps->capacity * 2 * sizeof(SQDateType*));
		if (tmp == NULL)
		{
			printf("realloc fail!\n");
			return;
		}
		else
		{
			ps->a = tmp;
			ps->capacity *= 2;//容量增大為原來的兩倍
		}
	}
}

3.5 順序表頭部插入數(shù)據(jù)
頭插,意思是在順序表的最前面插入一個(gè)數(shù)據(jù)。我們需要把順序表里的原數(shù)據(jù)(如果原來有數(shù)據(jù)的話)從后往前向后挪一個(gè)空間,再把要插入的數(shù)據(jù)放到第一個(gè)位置即可。
數(shù)據(jù)結(jié)構(gòu):詳解【順序表】的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),c語言
代碼實(shí)現(xiàn)如下:

void SeqListPushFront(SL* ps, SQDateType x)
{
     assert(ps);
	//檢查是否要擴(kuò)容
	CheckSeqListCapacity(ps);

	int end = ps->size;
	for (end = ps->size ; end >0; end--)
	{
		ps->a[end] = ps->a[end - 1];
	}
	ps->a[end] = x;
	ps->size++;//有效數(shù)據(jù)+1
}

3.6 順序表尾部插入數(shù)據(jù)
尾插,意思是在順序表的最后面插入一個(gè)數(shù)據(jù)。只需要找到該位置的下標(biāo)(ps->size處)直接插入即可。
數(shù)據(jù)結(jié)構(gòu):詳解【順序表】的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),c語言

代碼實(shí)現(xiàn)如下:

void SeqListPushBack(SL* ps, SQDateType x)
{
     assert(ps);
     //檢查是否要擴(kuò)容
	CheckSeqListCapacity(ps);

	ps->a[ps->size] = x;
	ps->size++;//有效數(shù)據(jù)+1
}

3.7 順序表頭部刪除數(shù)據(jù)
頭刪,意思是刪除一個(gè)順序表最前面的數(shù)據(jù)。只需把原數(shù)據(jù)從前往后開始向前覆蓋一個(gè)空間即可。
數(shù)據(jù)結(jié)構(gòu):詳解【順序表】的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),c語言

代碼實(shí)現(xiàn)如下:

void SeqListPopFront(SL* ps)
{
	assert(ps->size > 0);//斷言,當(dāng)順序表內(nèi)有數(shù)據(jù)時(shí)才刪除
	
	for (int start = 0; start < ps->size; start++)
	{
		ps->a[start] = ps->a[start + 1];
	}
	ps->size--;//有效數(shù)據(jù)-1
}

3.8 順序表尾部刪除數(shù)據(jù)
尾刪,直接刪除順序表中最后一個(gè)數(shù)據(jù)即可。

void SeqListPopBack(SL* ps)
{
	assert(ps->size > 0);
	ps->size--;//有效數(shù)據(jù)-1
}

3.9 順序表任意位置插入數(shù)據(jù)
在順序表的pos位置處插入一個(gè)數(shù)據(jù),先要把pos處及其后面的原數(shù)據(jù)向后挪一個(gè)空間,再把數(shù)據(jù)放入pos處。
數(shù)據(jù)結(jié)構(gòu):詳解【順序表】的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),c語言
代碼實(shí)現(xiàn)如下:

void SeqListInsert(SL* ps, int pos, SQDateType x)
{
	assert(ps && pos < ps->size);//pos<size時(shí)才滿足
	CheckSeqListCapacity(ps);

	int end = ps->size ;
	for (end = ps->size ; end > pos; end--)
	{
		ps->a[end] = ps->a[end-1];
	}
	ps->a[pos] = x;//在pos的位置放入數(shù)據(jù)
	ps->size++;//有效數(shù)據(jù)+1
}

3.10 順序表任意位置刪除數(shù)據(jù)
在順序表的pos位置處刪除一個(gè)數(shù)據(jù),只要把pos處后面的數(shù)據(jù)向前覆蓋一個(gè)空間。
數(shù)據(jù)結(jié)構(gòu):詳解【順序表】的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),c語言
代碼實(shí)現(xiàn)如下:

void SeqListEarse(SL* ps, int pos)
{
	assert(ps && pos < ps->size);//pos<size時(shí)才滿足
	int start = pos;
	for (start = pos; start < ps->size; start++)
	{
		ps->a[start] = ps->a[start + 1];
	}
	ps->size--;//有效數(shù)據(jù)-1
}

3.11 順序表中查找數(shù)據(jù)
把順序表中的數(shù)據(jù)循環(huán)遍歷,判斷每個(gè)數(shù)據(jù)與查找數(shù)據(jù)是否相等,若相等,返回1,否則返回-1。

int  SeqListFind(SL* ps, SQDateType x)
{
	assert(ps && ps->size > 0);//表中有數(shù)據(jù)時(shí)才能查找
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
		{
			return 1;
			break;
		}
	}
	return -1;
}

3.12 順序表中修改指定位置數(shù)據(jù)
只要在順序表中找到指定位置,把修改的值賦給它即可。

void SeqListModify(SL* ps, int pos, SQDateType x)
{
	assert(ps && pos < ps->size);//要修改的位置要小于數(shù)據(jù)個(gè)數(shù)
	ps->a[pos] = x;
}

3.13 順序表的銷毀
順序表的空間的動(dòng)態(tài)開辟的,最后需要free釋放空間,避免造成空間泄漏。

void SeqListDestory(SL* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->size = 0;
}

4. 完整代碼

SeqList.h

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int SQDateType;

typedef struct SeqList
{
	SQDateType* a;
	size_t size; //有效數(shù)據(jù)
	size_t capacity;//容量的空間大小
}SL;

//初始化順序表
void SeqListInit(SL* ps);

//頭部插入數(shù)據(jù)
void SeqListPushFront(SL* ps, SQDateType x);

//尾部插入數(shù)據(jù)
void SeqListPushBack(SL* ps, SQDateType x);

//頭部刪除數(shù)據(jù)
void SeqListPopFront(SL* ps);

//尾部刪除數(shù)據(jù)
void SeqListPopBack(SL* ps);

//任意位置插入數(shù)據(jù)
void SeqListInsert(SL* ps, int pos,SQDateType x);

//任意位置刪除數(shù)據(jù)
void SeqListEarse(SL* ps, int pos);

//打印數(shù)據(jù)函數(shù)
void SeqListPrint(SL* ps);

//查找數(shù)據(jù)
int SeqListFind(SL* ps, SQDateType x);

//修改指定位置數(shù)據(jù)
void SeqListModify(SL* ps, int pos, SQDateType x);

//銷毀順序表
void SeqListDestory(SL* ps);

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 

#include "SeqList.h"

void SeqListInit(SL*ps)
{
	ps->a = (SQDateType*)malloc(sizeof(SQDateType) * 4);//初始化開辟4個(gè)int類型的空間
	if (ps->a == NULL)
	{
		printf("malloc fail!\n");
		return;
	}
	ps->capacity = 4;
	ps->size = 0;
}

void CheckSeqListCapacity(SL*ps)
{
	assert(ps);
	//檢查容量是否已滿
	if (ps->capacity == ps->size)
	{
		//擴(kuò)容
		SQDateType* tmp = (SQDateType*)realloc(ps->a, ps->capacity * 2 * sizeof(SQDateType*));
		if (tmp == NULL)
		{
			printf("realloc fail!\n");
			return;
		}
		else
		{
			ps->a = tmp;
			ps->capacity *= 2;
		}
	}
}


void SeqListPushFront(SL* ps, SQDateType x)
{
	assert(ps);
	CheckSeqListCapacity(ps);

	int end = ps->size;
	for (end = ps->size ; end >0; end--)
	{
		ps->a[end] = ps->a[end - 1];
	}
	ps->a[end] = x;
	ps->size++;
}

void SeqListPrint(SL* ps)
{
	//判斷順序表中是否有數(shù)據(jù)
	assert(ps->size > 0);
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

void SeqListPushBack(SL* ps, SQDateType x)
{
	CheckSeqListCapacity(ps);

	ps->a[ps->size] = x;
	ps->size++;
}

void SeqListPopFront(SL* ps)
{
	assert(ps->size > 0);
	for (int start = 0; start < ps->size; start++)
	{
		ps->a[start] = ps->a[start + 1];
	}
	ps->size--;
}

void SeqListPopBack(SL* ps)
{
	assert(ps->size > 0);
	ps->size--;
}

void SeqListInsert(SL* ps, int pos, SQDateType x)
{
	assert(ps && pos < ps->size);
	CheckSeqListCapacity(ps);

	int end = ps->size ;
	for (end = ps->size ; end > pos; end--)
	{
		ps->a[end] = ps->a[end-1];
	}
	ps->a[pos] = x;
	ps->size++;
}

void SeqListEarse(SL* ps, int pos)
{
	assert(ps && pos < ps->size);
	int start = pos;
	for (start = pos; start < ps->size; start++)
	{
		ps->a[start] = ps->a[start + 1];
	}
	ps->size--;
}

int  SeqListFind(SL* ps, SQDateType x)
{
	assert(ps && ps->size > 0);
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
		{
			return 1;
			break;
		}
	}
	return -1;
}

void SeqListModify(SL* ps, int pos, SQDateType x)
{
	assert(ps && pos < ps->size);
	ps->a[pos] = x;
}

void SeqListDestory(SL* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->size = 0;
}

test.c文章來源地址http://www.zghlxwxcb.cn/news/detail-839802.html

#define _CRT_SECURE_NO_WARNINGS 

#include "SeqList.h"

void SeqListTest()
{
	SL sl;
	
	//在這里調(diào)用各數(shù)據(jù)接口(函數(shù))進(jìn)行測試
}

int main()
{

	SeqListTest();

	return 0;
}

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu):詳解【順序表】的實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 順序表—C語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)

    順序表—C語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)

    本期帶大家一起來用C語言代碼實(shí)現(xiàn)順序表?????? 順序表是一段物理地址連續(xù)的存儲(chǔ)單元,依次存儲(chǔ)數(shù)據(jù)元素的線性結(jié)構(gòu)。分為靜態(tài)順序表與動(dòng)態(tài)順序表。 ?? ?? ?? 靜態(tài)順序表 :使用定長數(shù)組用來存儲(chǔ)數(shù)據(jù) 優(yōu)點(diǎn) :操作簡單,代碼實(shí)現(xiàn)容易 缺點(diǎn) :定長數(shù)組很受限制,數(shù)

    2023年04月24日
    瀏覽(29)
  • 『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑧ - 動(dòng)態(tài)順序表詳解(附完整源碼)

    『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑧ - 動(dòng)態(tài)順序表詳解(附完整源碼)

    本章內(nèi)容 寫在前面 1.靜態(tài)與動(dòng)態(tài)是指什么? 2.動(dòng)態(tài)順序表結(jié)構(gòu)的定義 3.動(dòng)態(tài)順序表的函數(shù)接口實(shí)現(xiàn) 4.動(dòng)態(tài)順序表的問題及思考 5.關(guān)于順序表的OJ題 6.OJ答案及解析 1.移除元素 2.刪除有序數(shù)組中的重復(fù)項(xiàng) ?3.合并兩個(gè)有序數(shù)組 7.動(dòng)態(tài)順序表完整源碼 1.SeqList.h 2.SeqList.c ? ? 上一章

    2024年02月16日
    瀏覽(25)
  • 『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑦ - 靜態(tài)順序表詳解(附完整源碼)

    『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑦ - 靜態(tài)順序表詳解(附完整源碼)

    本章內(nèi)容 1.什么是線性表 2.什么是順序表? 3.靜態(tài)順序表結(jié)構(gòu)的定義 4.靜態(tài)順序表的函數(shù)接口實(shí)現(xiàn) 5.靜態(tài)順序表的問題及思考 ? ? 線性表(linear list)是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實(shí)際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),常見的線性表:順序表、鏈表、棧、

    2024年02月15日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu):詳解【順序表】的實(shí)現(xiàn)

    數(shù)據(jù)結(jié)構(gòu):詳解【順序表】的實(shí)現(xiàn)

    順序表是用一段 物理地址連續(xù) 的存儲(chǔ)單元 依次存儲(chǔ)數(shù)據(jù)元素 的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲(chǔ)。動(dòng)態(tài)順序表與數(shù)組的本質(zhì)區(qū)別是—— 根據(jù)需要?jiǎng)討B(tài)的開辟空間大小。 動(dòng)態(tài)順序表的功能一般有如下幾個(gè): 初始化順序表 打印順序表中的數(shù)據(jù) 檢查順序表的容量 順序表頭部

    2024年03月14日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu):順序表 模擬實(shí)現(xiàn)及詳解

    數(shù)據(jù)結(jié)構(gòu):順序表 模擬實(shí)現(xiàn)及詳解

    目錄 一、線性表 二、順序表 2.1順序表的概念及結(jié)構(gòu) 2.1.1靜態(tài)順序表 2.2.2動(dòng)態(tài)順序表 2.2動(dòng)態(tài)順序表接口實(shí)現(xiàn) ? 線性表( linear list )是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實(shí)際中廣泛使 用的數(shù)據(jù)結(jié)構(gòu),常見的線性表:順序表、鏈表、棧、隊(duì)列、字符串

    2024年01月22日
    瀏覽(18)
  • 【數(shù)據(jù)結(jié)構(gòu)】C語言實(shí)現(xiàn)順序表(超級(jí)詳細(xì))

    目錄 概念及結(jié)構(gòu) 接口函數(shù)實(shí)現(xiàn) 順序表的初始化 容量判斷 ?順序表尾插 ?順序表尾刪 順序表頭插 順序表頭刪 順序表查找 順序表指定位置插入 順序表指定位置刪除 打印順序表 銷毀順序表 順序表完整代碼 順序表作為線性表的一種,它是用一段 物理地址連續(xù)的存儲(chǔ)單元依次

    2024年04月10日
    瀏覽(17)
  • 【C語言數(shù)據(jù)結(jié)構(gòu)】模擬·順序表·總項(xiàng)目實(shí)現(xiàn)

    【C語言數(shù)據(jù)結(jié)構(gòu)】模擬·順序表·總項(xiàng)目實(shí)現(xiàn)

    ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???? ?? ?? ?? 個(gè)人主頁 :阿然成長日記 ??點(diǎn)擊可跳轉(zhuǎn) ?? 個(gè)人專欄: ??數(shù)據(jù)結(jié)構(gòu)與算法??C語言進(jìn)階 ?? 不能則學(xué),不知?jiǎng)t問,恥于問人,決無長進(jìn) ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 我在上一篇博客中,

    2024年02月15日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)初階】二、 線性表里的順序表(C語言實(shí)現(xiàn)順序表)

    【數(shù)據(jù)結(jié)構(gòu)初階】二、 線性表里的順序表(C語言實(shí)現(xiàn)順序表)

    ========================================================================= 相關(guān)代碼gitee自取 : C語言學(xué)習(xí)日記: 加油努力 (gitee.com) ?========================================================================= 接上期 : 【數(shù)據(jù)結(jié)構(gòu)初階】一. 復(fù)雜度講解_高高的胖子的博客-CSDN博客 ?=======================================

    2024年02月08日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)】線性表的順序存儲(chǔ)結(jié)構(gòu)及實(shí)現(xiàn)——C語言版

    【數(shù)據(jù)結(jié)構(gòu)】線性表的順序存儲(chǔ)結(jié)構(gòu)及實(shí)現(xiàn)——C語言版

    線性表的順序存儲(chǔ)結(jié)構(gòu)稱為 順序表 ,其基本思想是 用一段地址連續(xù)的存儲(chǔ)單元一次存儲(chǔ)線性表的數(shù)據(jù)元素。 設(shè)順序表的每個(gè)元素占用 c 個(gè)存儲(chǔ)單元,則第 i 個(gè)元素的存儲(chǔ)地址為: 所以, 只要確定了存儲(chǔ)順序表的起始地址(即基地址),計(jì)算任意一個(gè)元素的存儲(chǔ)地址的時(shí)間

    2024年03月15日
    瀏覽(33)
  • 數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn))

    數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實(shí)現(xiàn))

    順序表是數(shù)據(jù)結(jié)構(gòu)里面很基礎(chǔ)的一類,它是線性表的一種,其它線性表還有鏈表、棧和隊(duì)列等,今天來和博主一起學(xué)習(xí)關(guān)于順序表的知識(shí)吧。 順序表,它分為兩類: 動(dòng)態(tài)順序表 和 靜態(tài)順序表 ,這兩個(gè)表的區(qū)別就是 前者的空間不固定 ,是 支持?jǐn)U容 的,后者的 空間是固定

    2024年02月03日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包