手搓順序表(C語言)

目錄

SeqList.h?

SeqList.c?

?頭插尾插復用任意位置插入

頭刪尾刪復用任意位置刪除

SLtest.c?

測試示例

?順序表優劣分析


SeqList.h?

//SeqList.h#pragma once#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#define IN_CY 3typedef int SLdataType;typedef struct SeqList
{SLdataType* a;int size;int capacity;
}SeqList;//初始化函數
void SeqListInit(SeqList* ps);
//銷毀函數
void SeqListDestory(SeqList* ps);
//尾插
void SeqListPushBack(SeqList* ps, SLdataType x);
//尾刪
void SeqListPopBack(SeqList* ps);
//打印函數
void print(SeqList* ps);
//頭插
void SeqListPushFront(SeqList* ps, SLdataType x);
//頭刪
void SeqListPopFront(SeqList* ps);// 順序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLdataType x);
// 順序表刪除pos位置的值
void SeqListErase(SeqList* ps, int pos);

SeqList.c?

//SeqList.C#include "SeqList.h"//初始化順序表
void SeqListInit(SeqList* ps)
{assert(ps);ps->size = 0;ps->capacity = 3;ps->a = (SLdataType*)malloc(sizeof(SLdataType) * ps->capacity);//申請空間失敗if (ps->a == NULL){perror("SeqListInit");exit(-1);}
}//銷毀順序表
void SeqListDestory(SeqList* ps)
{assert(ps);ps->size = 0;ps->capacity = 0;free(ps->a);ps->a = NULL;
}//容量檢查
void SLCheckCapacity(SeqList* ps)
{assert(ps);if (ps->size == ps->capacity){ps->capacity += IN_CY;SLdataType* tmp = (SLdataType*)realloc(ps->a, sizeof(SLdataType) * ps->capacity);//申請空間失敗if (tmp == NULL){perror("SLCheckCapacity");exit(-1);}ps->a = tmp;}
}//尾插
void SeqListPushBack(SeqList* ps, SLdataType x)
{assert(ps);SLCheckCapacity(ps);ps->a[ps->size++] = x;
}//尾刪
void SeqListPopBack(SeqList* ps)
{assert(ps);assert(ps->size);ps->size--;
}//打印順序表
void print(SeqList* ps)
{assert(ps);int i;for (i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}//頭插
void SeqListPushFront(SeqList* ps, SLdataType x)
{assert(ps);SLCheckCapacity(ps);int end = ps->size;while (end--){ps->a[end + 1] = ps->a[end];}ps->size++;ps->a[0] = x;
}//頭刪
void SeqListPopFront(SeqList* ps)
{assert(ps);assert(ps->size);int i;for (i = 0; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}// 順序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLdataType x)
{assert(ps);//下標合法檢查assert(pos>= 0 && pos <= ps->size);SLCheckCapacity(ps);int end = ps->size;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->size++;ps->a[pos] = x;
}// 順序表刪除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{assert(ps);//下標合法檢查assert(pos >= 0 && pos < ps->size);int i;for (i = pos; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}

?頭插尾插復用任意位置插入

// 順序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLdataType x)
{assert(ps);//下標合法檢查assert(pos>= 0 && pos <= ps->size);SLCheckCapacity(ps);int end = ps->size;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->size++;ps->a[pos] = x;
}//頭插
void SeqListPushFront(SeqList* ps, SLdataType x)
{SeqListInsert(ps, 0, x);
}//尾插
void SeqListPushBack(SeqList* ps, SLdataType x)
{SeqListInsert(ps, ps->size, x);
}

頭刪尾刪復用任意位置刪除

// 順序表刪除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{assert(ps);//下標合法檢查assert(pos >= 0 && pos < ps->size);int i;for (i = pos; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}//頭刪
void SeqListPopFront(SeqList* ps)
{SeqListErase(ps, 0);
}//尾刪
void SeqListPopBack(SeqList* ps)
{SeqListErase(ps, ps->size - 1);
}

SLtest.c?

//SLtest.c#include "SeqList.h"void SLtest1()
{SeqList s1;SeqListInit(&s1);SeqListPushBack(&s1, 1);SeqListPushBack(&s1, 2);SeqListPushBack(&s1, 3);print(&s1);SeqListPushBack(&s1, 4);SeqListPushBack(&s1, 5);print(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);print(&s1);SeqListDestory(&s1);
}void SLtest2()
{SeqList s1;SeqListInit(&s1);SeqListPushFront(&s1, 1);SeqListPushFront(&s1, 2);SeqListPushFront(&s1, 3);print(&s1);SeqListPushFront(&s1, 4);SeqListPushFront(&s1, 5);print(&s1);//SeqListPopFront(&s1);//SeqListPopFront(&s1);SeqListPopFront(&s1);print(&s1);SeqListPopFront(&s1);print(&s1);SeqListPopFront(&s1);print(&s1);SeqListPopFront(&s1);print(&s1);SeqListDestory(&s1);
}void SLtest3()
{SeqList s1;SeqListInit(&s1);SeqListInsert(&s1, 0, 1);SeqListInsert(&s1, 0, 2);SeqListInsert(&s1, 0, 3);print(&s1);SeqListInsert(&s1, s1.size, 4);SeqListInsert(&s1, s1.size, 5);SeqListInsert(&s1, s1.size, 6);print(&s1);SeqListInsert(&s1, 1, 7);print(&s1);SeqListErase(&s1, s1.size - 1);print(&s1);}
int main()
{//測試尾插尾刪//SLtest1();//測試頭插頭刪//SLtest2();//測試任意位置插入刪除SLtest3();return 0;
}

測試示例

尾插:

尾刪:

頭插:

頭刪:

任意位置插入:

任意位置刪除:

?順序表優劣分析

? ? ? ? 由于順序表是一塊連續的空間,因此可以直接通過下標訪問而無需遍歷尋找,所以在需要大量訪問的程序中具有優勢,對緩存的利用率高。而當空間不夠擴容時一般是呈2倍的增長,勢必會有一定的空間浪費。例如當前容量為100,滿了以后增容到200,我們再繼續插入了5個數據,后面沒有數據插入了,那么就浪費了95個數據空間。且對于異地擴容需要申請新空間,拷貝數據,釋放舊空間。會有不小的消耗。

? ? ? ? 尾插和尾刪的時間復雜度為O(1),因此適用于只需要尾插尾刪的場景。而頭插頭刪和任意位置插入刪除為了保證數據的順序性需要一個一個挪動數據,時間復雜度為0(n),因此對于需要大量隨機存取的程序來說開銷較大。

? ? ? ? 因此順序表通常應用于元素高效存儲+頻繁訪問的場景。

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

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

相關文章

深入分析C#中的“編寫器”概念——代碼修改、注解與重構

文章目錄 1. 編寫器&#xff08;Writer&#xff09;的概念2. 編寫器的作用和工作原理3. 編寫器的重要性4. 寫入器常用方法5. 寫入器示例6. 編寫器示例——使用Fody進行代碼注解和重構7. 總結 在軟件開發過程中&#xff0c;代碼的維護和更新是至關重要的。C#作為一種流行的編程語…

單詞學習——不斷更新

suppress: sup - press 抑制&#xff0c;鎮壓 subtle: sub - tle 微妙的 suspend: sus - pend 延緩&#xff0c;懸掛 supplement: sup - ple - ment: 補充 suspicious: sus - pi - cious 可疑的 depress: de -press 壓抑 emit: e - mit 發出 entail: en - tail 涉及 fo…

3.00001 postgres如何初始化系統參數?

文章目錄 加載參數整體流程參數結構舉例&#xff1a;ConfigureNamesBool 初始化參數 InitializeGUCOptionsbuild_guc_variablesInitializeOneGUCOptionInitializeGUCOptionsFromEnvironment 命令行添加SelectConfigFiles配置 加載參數整體流程 我們先看下guc參數是如何管理的。…

VUE3 學習筆記(6):data數據的監聽、表單綁定、操作DOM

data數據的監聽&#xff08;偵聽&#xff09; 對于data的值的監聽&#xff0c;可以用watch中與data中的參數命名一致的值做為函數進行獲取監聽變動前后的值再做邏輯判斷&#xff0c;如下圖所示。 示例代碼 <template><div><p :class"classDemo">{…

npm install 出錯,按照版本不匹配解決

一、現象 npm install npm WARN config global --global, --local are deprecated. Use --locationglobal instead. npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: panshi-main-web0.1.0 npm ERR! Found…

七大獲取免費https的方式

想要實現https訪問最簡單有效的的方法就是安裝SSL證書。只要證書正常安裝上以后&#xff0c;瀏覽器就不會出現網站不安全提示或者訪問被攔截的情況。下面我來教大家怎么去獲取免費的SSL證書&#xff0c;又如何安裝證書實現https訪問。 一、選擇免費SSL證書提供商 有多家機構提…

C#數據類型變量、常量

一個變量只不過是一個供程序操作的存儲區的名字。 在 C# 中&#xff0c;變量是用于存儲和表示數據的標識符&#xff0c;在聲明變量時&#xff0c;您需要指定變量的類型&#xff0c;并且可以選擇性地為其分配一個初始值。 在 C# 中&#xff0c;每個變量都有一個特定的類型&…

頭歌OpenGauss數據庫-I.復雜查詢第10關:換座位

任務描述 本關任務&#xff1a;改變相鄰倆學生的座位。 小美是一所中學的信息科技老師&#xff0c;她有一張 tb_Seat座位表&#xff0c;平時用來儲存學生名字和與他們相對應的座位 id。 tb_Seat表結構數據如下&#xff1a; idname1Elon2Donny3Carey4Karin5Larisa 現在小美想改變…

規則引擎 | 減少判斷嵌套

文章目錄 目前市面上具體的規則引擎產品有&#xff1a;droolsVisualRulesEasy RulesMandaraxIBM iLog其中使用最為廣泛并且開源的是drools

windows驅動開發-PCI討論(二)

認識PCI設備&#xff0c;還是要從配置空間說起&#xff0c;當PCI在ACPI和PCI復合體上電和枚舉完成后&#xff0c;PCI根復合體會從PCI設備讀出PCI設備的配置空間&#xff0c;許多信息(例如寄存器、內存空間、中斷信息等等)都是是從配置空間獲取的&#xff0c;所以接下來會詳細講…

動手學操作系統(三、通過IO接口直接控制顯卡)

動手學操作系統&#xff08;三、通過IO接口直接控制顯卡&#xff09; 在之前的學習內容中&#xff0c;我們成功編寫了MBR主引導記錄&#xff0c;在終端上進行了打印顯示&#xff0c;在這一節我們使用MBR通過IO接口來直接控制顯卡輸出字符。 文章目錄 動手學操作系統&#xff0…

PostgreSQL Windows 數據庫主從模式 熱同步

1.操作主服務器 1.1修改pg_hba.conf // 這邊就設置所有用戶&#xff0c;所有ip都可以交互 host replication all 0.0.0.0/0 md52.2 創建流復制用戶 // 創建流復制用戶replicator CREATE USER replica REPLICATION LOGIN PASSWORD replica…

邏輯回歸(頭歌)

第1關&#xff1a;邏輯回歸算法大體思想 #encodingutf8import numpy as np#sigmoid函數 def sigmoid(t):#輸入&#xff1a;負無窮到正無窮的實數#輸出&#xff1a;轉換后的概率值#********** Begin **********#result 1.0 / (1 np.exp(-t))#********** End **********#retur…

43、Flink 的 Window Join 詳解

1.Window Join a&#xff09;概述 Window join 作用在兩個流中有相同 key 且處于相同窗口的元素上&#xff0c;窗口可以通過 window assigner 定義&#xff0c;并且兩個流中的元素都會被用于計算窗口的結果。 兩個流中的元素在組合之后&#xff0c;會被傳遞給用戶定義的 Joi…

外匯天眼:野村證券和Laser Digital與GMO互聯網集團合作發行日元和美元穩定幣

野村控股和Laser Digital將與GMO互聯網集團合作&#xff0c;在日本探索發行日元和美元穩定幣。GMO互聯網集團的美國子公司GMO-Z.com Trust Company, Inc. 在紐約州金融服務部的監管框架下&#xff0c;在以太坊、恒星幣和Solana等主要區塊鏈上發行穩定幣。GMO-Z.com Trust Compa…

MySQL增刪查改進階

數據庫約束表的關系增刪查改 目錄 一.數據庫約束類型 NOT NULL約束類型 UNIQUE 唯一約束 DEFAULT 默認值約束 PRIMARY KEY&#xff1a;主鍵約束 FOREIGN KEY :W外鍵約束 二&#xff0c;查詢 count&#xff08;&#xff09;兩種用法 sum&#xff0c;avg&#xff0c;max…

Vue3_創建項目

目錄 一、創建vue項目 1.下載vue 2.進入剛才創建的項目 3.安裝依賴 4.運行項目 ?5.打包項目放入生產環境 二、vue項目組成 1.項目文件結構 2.項目重要文件 Vue (發音為 /vju?/&#xff0c;類似 view) 是一款用于構建用戶界面的 JavaScript 框架。它基于標準 HTML、C…

Go語言中實現RSA加解密、簽名驗證算法

隨著互聯網的高速發展&#xff0c;人們對安全的要求也越來越高。密碼學中兩大經典算法&#xff0c;一個是對稱加解密&#xff0c;另一個是非對稱加解密&#xff0c;這里就來分享一下非對稱加密算法的代表&#xff1a;RSA加解密。 在Go語言中實現RSA加解密還是比較簡單的&#…

【安全產品】基于HFish的MySQL蜜罐溯源實驗記錄

MySQL蜜罐對攻擊者機器任意文件讀取 用HFish在3306端口部署MySQL蜜罐 配置讀取文件路徑 攻擊者的mysql客戶端版本為5.7(要求低于8.0) 之后用命令行直連 mysql -h 124.222.136.33 -P 3306 -u root -p 可以看到成功連上蜜罐的3306服務&#xff0c;但進行查詢后會直接lost con…

ai機器人電銷資源有哪些?真的能幫到我們提高效率嗎ai智能語音機器人部署

隨著互聯網科技的發展&#xff0c;各種各樣的科技產物都應用于電銷企業&#xff0c;ai機器人電銷就是其中一個。那么ai機器人電銷可靠嗎&#xff1f;ai機器人電銷資源有哪些&#xff1f;我們一起來看看。 AI機器人在電銷資源方面有以下一些用途和功能&#xff1a; 自動識別潛在…