數據結構(一)順序表

目錄

  • 一、概念
    • (一)數據結構的三元素
      • 1. 邏輯結構
        • (1)線性結構
        • (2)非線性結構
      • 2. 存儲結構
        • (1)順序存儲
        • (2)鏈式存儲
        • (3)索引存儲
      • 3. 運算
    • (二)時間復雜度
      • 1. 線性階
      • 2. 常數階
      • 3. 平方階
      • 4. 三次方階
      • 5. 對數階
      • 6. 時間復雜度排序
  • 二、順序表
    • (一)邏輯結構
    • (二)存儲結構
    • (三)操作
      • 1. 創建順序表
        • (1)返回值是創建的順序表
        • (2)參數傳入想要創建的順序表
          • ① 函數聲明
          • ② 注意點:
          • ③代碼實現
      • 2. 插入元素(尾插、任意位置插入)
        • (1)尾插
          • ① 函數聲明
          • ② 注意點:
          • ③代碼實現
        • (2)任意位置插入
          • ① 函數聲明
          • ② 注意點:
          • ③代碼實現
      • 3. 刪除元素(尾刪、任意位置刪除)
        • (1)尾刪
          • ① 函數聲明
          • ② 注意點:
          • ③代碼實現
        • (2)任意位置刪除
          • ① 函數聲明
          • ② 注意點:
          • ③代碼實現
      • 4. 修改指定位置
          • ① 函數聲明
          • ② 注意點:
          • ③代碼實現
      • 5. 查找指定位置
          • ① 函數聲明
          • ② 注意點:
          • ③代碼實現
      • 6. 清空順序表
          • ① 函數聲明
          • ② 注意點:
          • ③代碼實現
      • 7. 銷毀順序表
          • ① 函數聲明
          • ② 注意點:
          • ③代碼實現
      • 8. 排序
          • ① 函數聲明
          • ② 注意點:
          • ③代碼實現
      • 9. 翻轉
          • ① 函數聲明
          • ② 注意點:
          • ③代碼實現
      • 10. 剔重
          • ① 函數聲明
          • ② 注意點:
          • ③代碼實現
      • 11. 打印所有元素
          • ① 函數聲明
          • ② 注意點:
          • ③代碼實現
    • (四)使用C語言實現的順序表的源代碼已上傳資源

一、概念

可以更合理使用內存
提高程序的執行效率

C語言本質是操作內存

數據對象、數據元素、數據項
圖片

(一)數據結構的三元素

1. 邏輯結構

(1)線性結構

一對一的關系
數據連續

(2)非線性結構

樹型:
一對多

圖:
多對多

2. 存儲結構

數據在計算機尤其是內存中的存儲方式

(1)順序存儲
(2)鏈式存儲
(3)索引存儲

3. 運算

算法:有限步驟內解決問題的方法
算法不依賴于編程語言
特點:

  1. 有窮性
  2. 確定性
  3. 可行性
  4. 有0個或多個輸入,有一個或多個輸出

標準:

  1. 正確性
  2. 易讀性
  3. 健壯性:對非法數據的處理能力
  4. 高效性
  5. 低存儲

(二)時間復雜度

算法的時間復雜度定義為算法中可執行語句的頻度之和 記作 T(n)
語句頻度是指同一代碼執行的次數
T(n)是算法所需時間的一種估值,n 表示問題的規模

算法的時間復雜度的表示方式為:
O(頻度); ----------稱為 大 O 表示法

假設有三段代碼:
a 的時間復雜度為 2
b 的時間復雜度為 2n
c 的時間復雜度為2n^2
如果a、b、c組成一段程序,
那么算法的時間復雜度為
T(n) =T (2+2n+2n^2)
業內表示方法 還需T (2+2n+2n^2)要對進行簡化

使用大O表示法的簡化流程:
1.去掉運行時間中的所有常數項。
(例如 2+2n+2n^2,直接變為 2n+2n^2)
2.保留最高次冪項。
(2n^2+2n 變成 2n^2)
3.最高項存在但是系數不是1,則把系數置為1。
(2n^2 系數為2 去掉系數 n^2 )

所以,最終a、b和c合并而成的代碼的時間復雜度為O(n^2)。

1. 線性階

O(n)

2. 常數階

O(1)

3. 平方階

O(n^2)

4. 三次方階

O(n^3)

5. 對數階

O(logn)

6. 時間復雜度排序

O(1)< O(logn) < O(n) < O(nlogn) < O(n^2) <O(n^3) <O(2^n) <O(n!) < O(n^n)

可以帶一個數測試,如問題規模n是16
1 < 4 < 16 < 64 < 256 < 4096 < 65536 < 16! < 16^16

二、順序表

(一)邏輯結構

線性結構

(二)存儲結構

順序存儲
內存中連續的空間

(三)操作

  • 目的:封裝成函數,供他人使用
  • 結構體定義:
//節點結構體定義
typedef struct node
{int data; //此處以int為例,可自行添加其他成員
}Nd_t;
//列表結構體定義
typedef struct list
{int count; //記錄當前存入了多少個值Nd_t listArr[MAX_SIZE]; 
}Ls_t;

1. 創建順序表

(1)返回值是創建的順序表

list_t *create_list_1();

(2)參數傳入想要創建的順序表
① 函數聲明

int create_list(Ls_t **list);

② 注意點:
  1. 參數必須傳入二級指針(需要改變main函數中的指針的值)
  2. 首先需要判定傳入函數的指針是否為一個空指針(因為接下來第一件事是要使用*list來接malloc的返回值,如果傳入的是一個空指針,會報段錯誤,所以需要提前檢查)
  3. 需要判定申請空間是否成功(申請失敗會返回NULL)
③代碼實現
//創建順序表并初始化
int create_list(Ls_t **list)
{if(NULL==list)//判定傳入的指針是否是一個空指針{printf("申請空間失敗\n");return -1;}//申請內存空間*list=(Ls_t *)malloc(sizeof(Ls_t));if(NULL==*list)//申請空間失敗{printf("申請空間失敗\n");return -1;}//初始化(*list)->count=0; memset(*list,0,sizeof(Ls_t));return 0;
}
  • 補充:memset函數
#include <string.h>
void *memset(void *s, int c, size_t n);
//s 要置值的內存首地址
//c 用于置值的值
//n 置值的大小

2. 插入元素(尾插、任意位置插入)

(1)尾插
① 函數聲明

int insert_list_by_tail(Ls_t *list,int num);

② 注意點:
  1. 需要判定傳入的順序表指針是否是空指針
  2. 需要判定順序表是否已滿
  3. 插入成功后,count++
③代碼實現
//在尾部插入數據
int insert_list_by_tail(Ls_t *list,int num)
{if(NULL == list) {printf("操作的表不存在\n");return -1;}if(MAX_SIZE == list->count){printf("順序表已滿\n");return -1;}//插入數據list->listArr[list->count].data=num;//順序表存入數據的數量+1list->count++;return 0;
}
(2)任意位置插入
① 函數聲明

int insert_list(Ls_t *list,int pos,int num);

② 注意點:
  1. 需要判定傳入的順序表指針是否是空指針
  2. 需要判定順序表是否已滿
  3. 判定插入位置是否合法,需要大于零,且需要保證順序表內存空間連續
  4. 插入成功后,count++
③代碼實現
int insert_list(Ls_t *list,int pos,int num)
{if(NULL == list) {printf("操作的表不存在\n");return -1;}if(MAX_SIZE == list->count){printf("順序表已滿\n");return -1;}if(pos < 0 || pos > list->count){printf("插入位置違法\n");return -1;}//從后往前,依次向后移動一位,直到到達插入位置int i=list->count;while(i!=pos){list->listArr[i]=list->listArr[i-1];i--;}//插入數據list->listArr[pos].data=num;//順序表存入數據的數量+1list->count++;return 0;
}

3. 刪除元素(尾刪、任意位置刪除)

(1)尾刪
① 函數聲明

int delete_list_by_tail(Ls_t *list);

② 注意點:
  1. 需要判定傳入的順序表指針是否是空指針
  2. 需要判定順序表是否已滿
  3. 直接count–即可,不必去清空值,此時原來的位置相當于已經聲明可以繼續寫入數據
③代碼實現
int delete_list_by_tail(Ls_t *list)
{if(NULL == list) {printf("操作的表不存在\n");return -1;}if(0==list->count){printf("順序表為空\n");return -1;}list->count--;return 0;
}
(2)任意位置刪除
① 函數聲明

int delete_list(Ls_t *list,int pos);

② 注意點:
  1. 需要判定列表指針是否是空指針
  2. 判斷表是否為空
  3. 判定刪除位置是否合法,需要大于零,且小于順序表當前容納值的數量;
  4. 刪除成功后,count需要減一
③代碼實現
int delete_list(Ls_t *list,int pos)
{if(NULL == list) {printf("操作的表不存在\n");return -1;}if(0==list->count){printf("順序表為空\n");return -1;}if(pos<0||pos>=list->count){printf("刪除位置違法\n");return -1;}for(int i=pos;i<list->count;i++){list->listArr[i]=list->listArr[i+1];}list->count--;return 0;
}

4. 修改指定位置

① 函數聲明

int modify_list(Ls_t *list,int pos,int num);

② 注意點:
  1. 需要判定列表指針是否是空指針
  2. 判斷表是否為空
  3. 判定修改位置是否合法,需要大于零,且小于順序表當前容納值的數量;
③代碼實現
int modify_list(Ls_t *list,int pos,int num)
{if(NULL == list) {printf("操作的表不存在\n");return -1;}if(0==list->count){printf("順序表為空\n");return -1;}if(pos<0||pos>=list->count){printf("修改位置違法\n");return -1;}list->listArr[pos].data=num;return 0;
}

5. 查找指定位置

① 函數聲明

int search_list(Ls_t *list,int pos,int *num);

② 注意點:
  1. 需要判定列表指針是否是空指針
  2. 判定查詢位置是否合法,需要大于零,且小于順序表當前容納值的數量;
③代碼實現
int search_list(Ls_t *list,int pos,int *num)
{if(NULL == list) {printf("操作的表不存在\n");return -1;}if(0==list->count){printf("順序表為空\n");return -1;}if(pos<0||pos>=list->count){printf("查詢位置違法\n");return -1;}*num=list->listArr[pos].data;return 0;
}

6. 清空順序表

① 函數聲明

int clean_list(Ls_t *list);

② 注意點:
  1. 需要判定列表指針是否是空指針
  2. 只需將count置0即可,各函數都是根據count來進行操作,因此即使原來順序表的值并未清空也不影響
③代碼實現
int clean_list(Ls_t *list)
{if(NULL == list) {printf("操作的表不存在\n");return -1;}list->count=0;return 0;
}

7. 銷毀順序表

① 函數聲明

int destroy_list(Ls_t **list);

② 注意點:
  1. 需要先確保傳入的指針并非空指針,再去判斷*list是否為空
  2. 釋放完堆區的空間后,再將main函數中的指針置為NULL
③代碼實現
int destroy_list(Ls_t **list)
{if(NULL == list) {printf("操作的指針不存在\n");return -1;}if(NULL == *list) {printf("操作的表不存在\n");return -1;}free(*list);*list=NULL;return 0;
}

8. 排序

① 函數聲明

int sort_list(Ls_t *list,int s);

② 注意點:
  1. 先確保傳入的指針并非空指針
  2. 判斷表是否為空
  3. 第二個參數為0是正序排序,否則倒序排序
③代碼實現
int sort_list(Ls_t *list,int s)
{if(NULL == list) {printf("操作的表不存在\n");return -1;}if(0==list->count){printf("順序表為空\n");return -1;}int flag=0;for(int i=0;i<list->count-1;i++){flag=0;for(int j=0;j<list->count-1-i;j++){if(0==s){ //正序排序if(list->listArr[j].data>list->listArr[j+1].data){Nd_t temp=list->listArr[j];list->listArr[j]=list->listArr[j+1];list->listArr[j+1]=temp;flag=1;}}else{if(list->listArr[j].data<list->listArr[j+1].data){Nd_t temp=list->listArr[j];list->listArr[j]=list->listArr[j+1];list->listArr[j+1]=temp;flag=1;}}}if(0==flag) break;}return 0;
}

9. 翻轉

① 函數聲明

int overturn_list(Ls_t *list);

② 注意點:
  1. 先確保傳入的指針并非空指針
  2. 判斷表是否為空
③代碼實現
int overturn_list(Ls_t *list){if(NULL == list) {printf("操作的表不存在\n");return -1;}if(0==list->count){printf("順序表為空\n");return -1;}int i=0,j=list->count-1;Nd_t temp;while(i<j){temp=list->listArr[i];list->listArr[i]=list->listArr[j];list->listArr[j]=temp;i++;j--;}printf("翻轉完成\n");return 0;
}

10. 剔重

① 函數聲明

int dedup_list(Ls_t *list);

② 注意點:
  1. 先確保傳入的指針并非空指針
  2. 判斷表是否為空
  3. 兩側遍歷,第一層是從第一個元素遍歷到倒數第二個元素(j=i+1);第二層是從第i+1個開始遍歷,然后比較與當前第i個元素是否相等,相等就刪除第j個元素,后面的元素依次向前移動一個位置,此時j無需再自加1
③代碼實現
int dedup_list(Ls_t *list)
{if(NULL == list) {printf("操作的表不存在\n");return -1;}if(0==list->count){printf("順序表為空\n");return -1;}int i,j;for(i=0;i<list->count-1;i++){for(j=i+1;j<list->count;j){if(list->listArr[j].data==list->listArr[i].data){for(int k=j;k<list->count-1;k++){list->listArr[k]=list->listArr[k+1];}list->count--;}else{j++;}}}return 0;
}

11. 打印所有元素

① 函數聲明

int show_list(Ls_t *list);

② 注意點:
  1. 需要判定列表指針是否是空指針
③代碼實現
int show_list(Ls_t *list)
{if(NULL == list) {printf("操作的表不存在\n");return -1;}for(int i=0;i<list->count;i++){printf("%d ",list->listArr[i].data);}putchar(10);return 0;
}

(四)使用C語言實現的順序表的源代碼已上傳資源

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

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

相關文章

Linux下Git的基本使用

認識Git 先基于Windows下的git操作&#xff0c;熟悉了git的基本概念和使用&#xff0c;直接參考這幾篇文章&#xff1a; Git概述、安裝與本地倉庫的基本操作-CSDN博客 Git本地倉庫與遠程倉庫的交互-CSDN博客 GtiHub遠程倉庫之間的交互-CSDN博客 Git倉庫的分支操作-CSDN博客 倉庫…

深度學習中點云在預處理時的增強策略

在深度學習中&#xff0c;點云數據的增強策略主要用于提升模型的泛化能力和魯棒性。點云是一種表示三維數據的形式&#xff0c;由一組三維坐標點組成&#xff0c;廣泛應用于計算機視覺、自動駕駛和機器人等領域。對點云數據進行預處理和增強可以有效提高模型的性能。以下是一些…

服裝服飾商城小程序的作用是什么

要說服裝商家&#xff0c;那數量是非常多&#xff0c;廠家/經銷門店/小攤/無貨源等&#xff0c;線上線下同行競爭激烈&#xff0c;雖然用戶群體廣涵蓋每個人&#xff0c;但每個商家肯定都希望更多客戶被自己轉化&#xff0c;渠道運營方案營銷環境等不可少。 以年輕人為主的消費…

詳細介紹推薦系統的實現原理與理論公式

目錄 什么是推薦系統? 統計概況 推薦系統的類型 推薦系統——明確反饋 推薦系統——隱式反饋 評級矩陣

triton源碼分析之setup.py

一 執行流程 在執行pip install -e .的時候,便會執行這個文件,文件的入口為: setup(name=os.environ.get("TRITON_WHEEL_NAME", "triton"),version="3.0.0" + os.environ.get("TRITON_WHEEL_VERSION_SUFFIX", ""),auth…

國產PS插件新選擇;StartAI平替中的佼佼者!

前言 在設計的世界里&#xff0c;每一個細節都至關重要。設計師們常常面臨時間緊迫、創意受限、工具復雜等挑戰。Photoshop雖強大&#xff0c;但繁瑣的操作和高昂的成本往往令人望而卻步。今天我就為大家介紹一款PSAI插件——StartAI&#xff0c;一款專為Photoshop設計的國產A…

【Linux終端探險】:從入門到熟練,玩轉基礎命令的秘密(一)

文章目錄 &#x1f680;Linux基礎命令?1. 查看目錄命令&#x1f4a5;2. 切換目錄&#x1f44a;3. 創建目錄??4. 刪除目錄/文件&#x1f6b2;5. 修改目錄/文件&#x1f308;6. 拷貝目錄/文件 &#x1f680;Linux基礎命令 ?1. 查看目錄命令 在Linux中&#xff0c;查看目錄的…

C語言?位優先與低位優先的不同之處是什么?

一、問題 C語?的最?特?就是可移植性好。根據機器類型的不同&#xff0c;?位優先與低位優先也不同。那么&#xff0c;最好的可移植的 C 程序應該同時適?這兩種類型的計算機。下?了解?下?位優先與低位優先的不同之處。 二、解答 所謂的?位優先&#xff0c;就是最低的地…

AUS GLOBAL 榮獲 Brokersview 頒獎盛典多項殊榮

2024年1月31日在迪拜 Sheikh Zayed Rd - Trade Centre - Trade Centre 1 舉行的 Brokersview 頒獎盛典上&#xff0c;AUS GLOBAL&#xff08;澳洲環球&#xff09;再次展現了其在金融行業的卓越實力&#xff0c;并榮獲多項殊榮。 AUS GLOBAL 作為一家全球領先的金融服務提供商…

一個交易者的自白:念念不忘的交易,10個日內9個虧

一、新手: 面對爆倉,我像個白癡 我是在2012年開始接觸的&#xff0c;這些年里我嘗到了殘酷失敗的滋味&#xff0c;更品嘗過勝利帶來的喜悅。剛剛接觸時很自信&#xff0c;總想著自己有一天一定會變成千萬富翁的&#xff0c;用杠桿獲取暴利。 在我首次爆倉的時候&#xff0c;我的…

NVIDIA DeepStream全面開發指南

本指南全面介紹了NVIDIA DeepStream SDK&#xff0c;包括其架構、功能、應用開發、部署以及高級特性。DeepStream是一個流分析工具包&#xff0c;支持從多種來源輸入視頻數據&#xff0c;并利用AI和計算機視覺技術生成環境洞察&#xff0c;適用于從邊緣到云的開發和部署。 文章…

構建智慧化居家養老服務體系:以數據驅動實現高效便捷服務

隨著社會的快速發展和人口老齡化趨勢的加劇&#xff0c;如何為老年人提供高質量、便捷的養老服務成為了一個亟待解決的問題。近年來&#xff0c;民政部 國家數據局關于組織開展基本養老服務綜合平臺試點的通知&#xff0c;以及廣州市人民政府辦公廳印發的《廣州市居家社區養老服…

什么是BFC

1.什么是BFC BFC即Block Formatting Contexts&#xff08;塊級格式化上下文&#xff09;&#xff0c;是W3C CSS2.1規范中的一個概念。BFC是指瀏覽器中創建了一個獨立的渲染區域&#xff0c;并且擁有一套渲染規則&#xff0c;它決定了其子元素如何定位&#xff0c;以及與其他元…

如何衡量安全閥檢測的價格與價值?一文揭曉答案

安全閥作為工業設備中的重要組件&#xff0c;其性能的穩定性和可靠性直接影響著整個系統的安全運行。因此&#xff0c;對安全閥進行定期檢測和維護顯得尤為重要。 那么&#xff0c;安全閥檢測一個需要多少錢呢&#xff1f; 在這篇文章中&#xff0c;佰德將從檢測費用構成、市…

8086 匯編筆記(一):寄存器

前言 8086 CPU 有 14 個寄存器&#xff0c;每個寄存器有一個名稱。這些寄存器是&#xff1a;AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW 一、通用寄存器 8086 CPU 的所有寄存器都是 16 位的&#xff0c;可以存放兩個字節。AX、BX、CX、DX 這 4個寄存器通常用…

Adobe Bridge BR v14.0.3 安裝教程 (多媒體文件組織管理工具)

Adobe系列軟件安裝目錄 一、Adobe Photoshop PS 25.6.0 安裝教程 (最流行的圖像設計軟件) 二、Adobe Media Encoder ME v24.3.0 安裝教程 (視頻和音頻編碼渲染工具) 三、Adobe Premiere Pro v24.3.0 安裝教程 (領先的視頻編輯軟件) 四、Adobe After Effects AE v24.3.0 安裝…

mysql手動新建數據庫

點擊號輸入數據庫名&#xff0c;端口號&#xff0c;密碼&#xff0c;連接到sa數據庫新建數據庫&#xff0c;語言必須選擇utf8mb4新建數據庫用戶給數據庫用戶設置對應權限給數據庫用戶勾選權限

登峰造極,北斗相伴——紀念人類首次登頂珠穆朗瑪峰71周年

71年前的今天&#xff0c;1953年5月29日11時30分&#xff0c;人類實現了一個偉大的壯舉&#xff1a;首次登上了珠穆朗瑪峰&#xff0c;這座海拔8848.86米的世界最高峰。這是一次充滿了艱辛、勇氣和智慧的探險&#xff0c;也是一次改變了人類歷史和文化的探險。 自那以后&#…

【全球展會招商】2025COSP深圳國際戶外展乘風而至,啟赴新程!

展會介紹 “2025-COSP深圳國際戶外展覽會”將于展出面積達40,000㎡&#xff0c;展出品牌60家包含戶外露營展區、 車旅生活展區 、戶外運動展區、水上運動展區 、 民宿旅居展區等熱門產品專區&#xff0c;充分滿足供應商及采購商、行業人士及運動愛好者的需求&#xff0c;打造展…

如何為 pip 配置鏡像源加速下載

在使用 Python 的過程中&#xff0c;我們常常需要使用 pip 來安裝各種第三方庫。然而&#xff0c;由于網絡環境的影響&#xff0c;默認的 PyPI 源可能會出現下載速度緩慢甚至無法連接的情況。為了解決這一問題&#xff0c;我們可以通過配置 pip 的鏡像源來加速下載。 本文將詳…