動態順序表實現

目錄

1. 順序表的概念

2. 實現的功能

3. 順序表的定義

4.順序表的實現

4.1?seqlist.c

4.2 seqlist.h

4.3 test.c

5. 順序表的優缺點

5.1優點

5.2缺點


1. 順序表的概念

用一段物理地址連續的內存依次存儲數據元素的線性結構

本質就是數組,在數組基礎上要求數據是連續存儲的,不能有跳躍間隔。我們可以提前規劃好順序表的容量(靜態順序表),還可以根據添加數據動態增容(動態順序表)

2. 實現的功能

1. void Seqlistpirnt(SL* ps);//順序表打印
2. void SeqlistDestroy(SL* ps);//銷毀接口
3. void SeqlistCheckCapacity(SL* ps);//擴容函數
4. void SeqlistInit(SL* ps);//順序表初始化
5. void SeqlistPushBack(SL* ps, SLdatatype x);//尾插
6. void SeqlistPopBack(SL* ps);//尾刪
7. void SeqlistPushFront(SL* ps, SLdatatype x);//頭插
8. void SeqlistPopFront(SL* ps);//頭刪
9. int SeqlistFind(SL* ps, SLdatatype x);//找到x位置返回下標,沒找到返回-1

10. void SeqlistInsert(SL* ps, int pos, SLdatatype x);//制定pos下標位置插入
11. void SeqlistErase(SL* ps, int pos);//刪除pos位置的數據

3. 順序表的定義

需要三個參數

1. a:指向動態內存開辟的空間

2. size:數組中的有效數據

3. capacity:存儲的容量可動態增加

//#define N 100
//typedef int SLdatatype;
//
靜態順序表
//typedef struct Seqlist
//{
//    SLdatatype a[N];
//	int size;//表示數組中存儲了多少個有效數據
//
//}Seqlist;typedef int SLdatatype;
//動態順序表
typedef struct Seqlist
{SLdatatype* a;//指向存儲數組的空間int size;//表示數組中存儲了多少個有效數據int capacity;//容量}SL;

4.順序表的實現

分為三個文件

4.1?seqlist.c

實現函數的功能

#define _CRT_SECURE_NO_WARNINGS h
#include"seqlist.h"//動態增容
void SeqlistCheckCapacity(SL* ps)
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLdatatype* tmp = (SLdatatype*)realloc(ps->a, newcapacity * sizeof(SLdatatype));if (tmp == NULL){exit(-1);}ps->a = tmp;ps->capacity = newcapacity;}
}
//打印輸出順序表
void Seqlistpirnt(SL* ps)
{for (int i = 0; i < ps->size; i++)printf("%d", ps->a[i]);printf("\n");
}
//銷毀順序表
void SeqlistDestroy(SL* ps)
{free(ps->a);ps->a = NULL;ps->capacity = ps->size = 0;
}
//順序表初始化
void SeqlistInit(SL* ps)
{ps->a = NULL;ps->capacity = ps->size = 0;
}
//尾部插入
void SeqlistPushBack(SL* ps, SLdatatype x)
{//SeqlistCheckCapacity(ps);//ps->a[ps->size] = x;//ps->size++;SeqlistInsert(ps, ps->size, x);
}
//尾部刪除
void SeqlistPopBack(SL* ps)
{ps->a[ps->size - 1] = 0;//if(ps->size>0)//溫柔的處理方式//ps->size--;assert(ps->size>0);//暴力的處理方式SeqlistErase(ps, ps->size);}
//頭部插入
void SeqlistPushFront(SL* ps, SLdatatype x)
{		//SeqlistCheckCapacity(ps);//for (int i = ps->size-1; i >= 0; i--)//{//	ps->a[i+1] = ps->a[i];//}//ps->a[0] = x;//ps->size++;SeqlistInsert(ps, 0, x);
}
//頭部刪除
void SeqlistPopFront(SL* ps)
{//if(ps->size>0)//{//	for (int i = 0; i < ps->size; i++)//	{//		ps->a[i] = ps->a[i + 1];//	}//	ps->size--;//}SeqlistErase(ps, 0);}
//查找特定的數
int SeqlistFind(SL* ps, SLdatatype x)
{for (int i = 0; i < ps->size; i++){if (ps->a[i] == x)return i;}return -1;
}
//插入數據到指定位置
void SeqlistInsert(SL* ps, int pos, SLdatatype x)
{	SeqlistCheckCapacity(ps);//assert(pos >= 0 && pos <= ps->size);if (pos > ps->size || pos < 0){printf("越界了\n");return;}ps->size++;for (int i = ps->size - 1; i > pos; i--){ps->a[i] = ps->a[i - 1];}ps->a[pos] = x;
}
//刪除指定位置的數
void SeqlistErase(SL* ps, int pos)
{if (pos == ps->size - 1){ps->size--;return;}for (int i = pos; i < ps->size-1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}
4.2 seqlist.h

方便調用函數

#define _CRT_SECURE_NO_WARNINGS h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int SLdatatype;//動態順序表
typedef struct Seqlist
{SLdatatype* a;int size;//表示數組中存儲了多少個有效數據int capacity;}SL;
void Seqlistpirnt(SL* ps);
void SeqlistDestroy(SL* ps);//銷毀接口
void SeqlistCheckCapacity(SL* ps);//擴容函數
void SeqlistInit(SL* ps);
void SeqlistPushBack(SL* ps, SLdatatype x);
void SeqlistPopBack(SL* ps);
void SeqlistPushFront(SL* ps, SLdatatype x);
void SeqlistPopFront(SL* ps);
int SeqlistFind(SL* ps, SLdatatype x);//找到x位置返回下標,沒找到返回-1void SeqlistInsert(SL* ps, int pos, SLdatatype x);//制定pos下標位置插入
void SeqlistErase(SL* ps, int pos);//刪除pos位置的數據
4.3 test.c

進行測試,使用

#define _CRT_voidSECURE_NO_WARNINGS h
#include"seqlist.h"void TestSeqList1()
{SL s1;SeqlistInit(&s1);SeqlistPushBack(&s1, 1);SeqlistPushBack(&s1, 2);SeqlistPushBack(&s1, 3);SeqlistPushBack(&s1, 4);SeqlistPushBack(&s1, 5);Seqlistpirnt(&s1);SeqlistPopBack(&s1);SeqlistPopBack(&s1);Seqlistpirnt(&s1);SeqlistDestroy(&s1);
}void TestSeqList2()
{SL s1;SeqlistInit(&s1);SeqlistPushFront(&s1, 1);SeqlistPushFront(&s1, 2);SeqlistPushFront(&s1, 3);SeqlistPushFront(&s1, 4);SeqlistPushFront(&s1, 5);Seqlistpirnt(&s1);SeqlistPopFront(&s1);SeqlistPopFront(&s1);Seqlistpirnt(&s1);//int t = SeqlistFind(&s1, 2);//printf("%d\n", t);//int pos;//scanf("%d", &pos);//SeqlistInsert(&s1, pos, 6);//Seqlistpirnt(&s1);//scanf("%d", &pos);//SeqlistErase(&s1, pos);//Seqlistpirnt(&s1);SeqlistPopFront(&s1);//SeqlistPopFront(&s1);//Seqlistpirnt(&s1);SeqlistDestroy(&s1);
}
void TestSeqList3()//
{SL s1;int t = SeqlistFind(&s1, 2);}
int main()
{TestSeqList1();TestSeqList2();
}

5. 順序表的優缺點

5.1優點

1.支持隨機訪問(用下標訪問)需要隨機訪問結構,支持算法可以更好適用

2.cpu高速緩存命中率(連續存儲)

5.2缺點

1.頭部中部插入刪除時間效率低O(N)

2.連續的物理空間,空間不夠了以后需要增容

增容有一定程度的消耗

為了避免增容一般都按倍數去增容,用不完可能存在浪費


這篇到這里就結束了,希望可以幫到你

(づ ̄3 ̄)づ╭?~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12913.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12913.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12913.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零手寫實現 tomcat-11-filter 過濾器

創作緣由 平時使用 tomcat 等 web 服務器不可謂不多&#xff0c;但是一直一知半解。 于是想著自己實現一個簡單版本&#xff0c;學習一下 tomcat 的精髓。 系列教程 從零手寫實現 apache Tomcat-01-入門介紹 從零手寫實現 apache Tomcat-02-web.xml 入門詳細介紹 從零手寫…

基于Springboot的學生心理壓力咨詢評判(有報告)。Javaee項目,springboot項目。

演示視頻&#xff1a; 基于Springboot的學生心理壓力咨詢評判&#xff08;有報告&#xff09;。Javaee項目&#xff0c;springboot項目。 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三層體系…

Yalmip使用教程(8)-常見報錯及調試方法

博客中所有內容均來源于自己學習過程中積累的經驗以及對yalmip官方文檔的翻譯&#xff1a;https://yalmip.github.io/tutorials/ 這篇博客將詳細介紹使用yalmip工具箱編程過程中的常見錯誤和相應的解決辦法。 1.optimize的輸出參數 眾所周知&#xff0c;optimize是yalmip用來求…

5.7日學習記錄及相關問題解答

1. 閱讀文章 復習 JAVA基礎——接口&#xff08;全網最詳細教程&#xff09; Java之對象的多態性&#xff08;使用生活中通俗的例子講解&#xff09; 新學 JavaWeb——Servlet&#xff08;全網最詳細教程包括Servlet源碼分析&#xff09; 有用 創建Dynamic Web Project工程&…

PS濾鏡插件Camera Raw 15.4升級,開啟智能修圖

前段時間Adobe 更新了photoshop 的智能AI填充功能&#xff0c;深受很多設計師朋友的喜愛。Camera Raw作為PS的一個濾鏡插件對RAW圖片的處理上面有一定的優勢&#xff0c;Camera Raw 15.4升級了&#xff0c;開啟智能修圖木事&#xff0c;一起來看看吧&#xff01; Camera Raw濾鏡…

【2024華為HCIP831 | 高級網絡工程師之路】刷題日記(18)

個人名片&#xff1a;&#x1faaa; &#x1f43c;作者簡介&#xff1a;一名大三在校生&#xff0c;喜歡AI編程&#x1f38b; &#x1f43b;???個人主頁&#x1f947;&#xff1a;落798. &#x1f43c;個人WeChat&#xff1a;hmmwx53 &#x1f54a;?系列專欄&#xff1a;&a…

ClassificationPrimitive 內部原理

ClassificationPrimitive 內部原理 發明 ClassificationPrimitive的真是個天才。其原理是利用 webgl 的模板緩沖區實現。 渲染兩次, 首先是繪制模板, 然后繪制真正的內容。 示意圖: function createClass() {const { program, uniforms } WebGLProgram.buildPrograms(gl, …

代碼隨想錄算法訓練營第36期DAY22

DAY22 654最大二叉樹 自己做的時候忽略了&#xff1a;nums.length>1的題給條件。所以每次遞歸都要判斷是否size()>1&#xff0c;不要空的。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *rig…

牛客網刷題 | BC84 牛牛學數列2

目前主要分為三個專欄&#xff0c;后續還會添加&#xff1a; 專欄如下&#xff1a; C語言刷題解析 C語言系列文章 我的成長經歷 感謝閱讀&#xff01; 初來乍到&#xff0c;如有錯誤請指出&#xff0c;感謝&#xff01; 描述 這次牛牛又換了個數…

sql中的exists和in的區別

在SQL中&#xff0c;EXISTS 和 IN 都用于子查詢&#xff0c;但它們的用法和目的有所不同。 ### EXISTS EXISTS 是一個邏輯運算符&#xff0c;用于檢查子查詢是否返回任何行。如果子查詢返回至少一行&#xff0c;那么 EXISTS 子句的結果為 TRUE&#xff1b;否則&#xff0c;結果…

一個用Kotlin編寫簡易的串行任務調度器

引言 由于項目中有處理大量后臺任務并且串行執行的需求&#xff0c;特意寫了一個簡易的任務調度器&#xff0c;方便監控每個任務執行和異常情況&#xff0c;任務之間互不影響。正如上所述&#xff0c;Kotlin中的TaskScheduler類提供了一個強大的解決方案&#xff0c;用于使用S…

「AIGC」Python實現tokens算法

本文主要介紹通過python實現tokens統計,避免重復調用openai等官方api,開源節流。 一、設計思路 初始化tokenizer使用tokenizer將文本轉換為tokens計算token的數量二、業務場景 2.1 首次加載依賴 2.2 執行業務邏輯 三、核心代碼 from transformers import AutoTokenizer imp…

React: memo

React.memo 允許你的組件在 props 沒有改變的情況下跳過重新渲染。 const MemoizedComponent memo(SomeComponent, arePropsEqual?)React 通常在其父組件重新渲染時重新渲染一個組件。你可以使用 memo 創建一個組件&#xff0c;當它的父組件重新渲染時&#xff0c;只要它的新…

centos7服務器采用局域網內筆記本代理上網

一、背景 某臺服務器操作系統是centos 7&#xff0c;不能上網。我想在上面裝個ftp軟件&#xff1a;vsftpd。 二、思路 要安裝這個軟件&#xff0c;有2種方案 1&#xff09;設置該臺centos7可以上網 2&#xff09;離線安裝vsftpd 鑒于各種依賴&#xff0c;萬一因為依賴不全或…

《海峽科技與產業》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

問題解答 問&#xff1a;《海峽科技與產業》期刊是什么級別&#xff1f; 答&#xff1a;國家級 主管單位&#xff1a;中華人民共和國科學技術部 主辦單位&#xff1a;科技部海峽兩岸科學技術交流中心 問&#xff1a;《海峽科技與產業》影響因子&#xff1f; 答&#xff1a;…

相位;傅里葉變換和傅里葉級數是什么;歐拉公式是什么,和傅里葉關系;

目錄 相位 傅里葉變換公式使用舉例 實際案例 傅里葉變換和傅里葉級數是什么

隨筆:棋友們

我是在小學二年級學會中國象棋的&#xff0c;準確說&#xff0c;是學會象棋的下棋規則的&#xff0c;師傅是二舅。我最早的對手就是同學波仔。波仔比我略早學會象棋&#xff0c;總用連珠炮欺負我&#xff0c;開局幾步棋就把我將死。我不知道怎么破解。輪到我先走時&#xff0c;…

扭虧為盈的賽力斯,真正進入穩態了嗎?

“72小時內大定破1萬臺”。5月15日&#xff0c;問界新M5開啟全國大規模交付&#xff0c;從當前取得的成績來看&#xff0c;賽力斯的“富貴”似乎還將延續。 其實&#xff0c;此前基于問界新M7等車型的爆火&#xff0c;賽力斯已經找到了創收軌道。財報顯示&#xff0c;2024年一…

alist網盤自動同步

alist網盤自動同步 alist可以設置目錄定時轉存到各個網盤&#xff0c;做到夸網盤&#xff0c;多備份的效果可以將自己掛載的alist 下的各個目錄相互間進行同步&#xff0c;原理是采用alist原始api調用執行同步原理1.匹配文件名稱是否相同,2.文件大小是否相同&#xff0c;相同會…

一文詳細解析Google編碼規范工具cpplint的下載安裝與使用

目錄 一、什么是cpplint 二、cpplint能實現的功能 三、cpplint的下載與使用 1、配置python環境 2、安裝cpplint 四、cpplint常用命令講解 1、常用命令查看 2、常用命令詳解 3、命令使用方式 五、 cpplint的實用技巧 1、集成cpplint 1.1、修改調用接口. 1.2、直接把…