數據結構 day02

3. 線性表

3.1. 順序表

3.1.3. 順序表編程實現

?操作:增刪改查

.h 文件?

#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#define N 10
typedef struct seqlist
{int data[N];int last; //代表數組中最后一個有效元素的下標
} seqlist_t;//1.創建一個空的順序表
seqlist_t *CreateEpSeqlist();
//2.向順序表的指定位置插入數據
int InsertIntoSeqlist(seqlist_t *p, int post, int data);
//3.遍歷順序表
void ShowSeqlist(seqlist_t *p);
//4.判斷順序表是否為滿,滿返回1,未滿返回0
int IsFullSeqlist(seqlist_t *p);
//5.判斷順序表是否為空
int IsEpSeqlist(seqlist_t *p);
//6.刪除順序表中指定位置的數據
int DeleteIntoSeqlist(seqlist_t *p, int post);
//7.清空順序表 (清空:訪問不到,但是內存中還有;銷毀:內存清空)
void ClearSeqList(seqlist_t *p);
//8.修改指定位置的數據,post為被修改數據位置,data為修改成的數據
int ChangePostSeqList(seqlist_t *p,int post,int data);
//9.查找指定數據出現位置,data為被查找的數據,返回下標,未找到返回-1
int SearchDataSeqList(seqlist_t *p,int data);
#endif

?1.創建一個空的順序表

#include <stdio.h>
#include "seqlist.h"
#include <stdlib.h>// 1.創建一個空的順序表
seqlist_t *CreateEpSeqlist()
{// 1. 動態申請一塊空間存放順序表seqlist_t *p = NULL;p = (seqlist_t *)malloc(sizeof(seqlist_t));// 2. 檢測空間是否開辟成功if (NULL == p){perror("malloc last!");return NULL;}else{// 空間開辟成功,對last初始化printf("malloc success!\n");p->last = -1;return p;}
}

2.向順序表的指定位置插入數據

#include <stdio.h>
#include "seqlist.h"// 2.向順序表的指定位置插入數據
int InsertIntoSeqlist(seqlist_t *p, int post, int data)
{// post容錯,post范圍,順序表滿了if (post > p->last + 1 || post < 0 || IsFullSeqlist(p)){perror("Insert Failed");return -1;}// 從post開始,到last,中間的元素向后移動一位for (int i = p->last; i >=post; i--){p->data[i+1] = p->data[i];}p->data[post] = data;p->last++;return 0;
}

3.遍歷順序表

#include <stdio.h>
#include "seqlist.h"//3.遍歷順序表
void ShowSeqlist(seqlist_t *p)
{for (int i = 0; i <= p->last; i++)printf("%-4d", p->data[i]);printf("\n");
}

4. 判斷順序表是否為滿

#include <stdio.h>
#include "seqlist.h"// 4.判斷順序表是否為滿,滿返回1,未滿返回0
int IsFullSeqlist(seqlist_t *p)
{// if (p->last + 1 == N)//     return 1;// else//     return 0;return p->last +1 == N;
}

5. 判斷順序表是否為空

#include <stdio.h>
#include "seqlist.h"// 5.判斷順序表是否為空
int IsEpSeqlist(seqlist_t *p)
{return p->last == -1;
}

?6. 刪除順序表中指定位置的數據

#include <stdio.h>
#include "seqlist.h"// 6.刪除順序表中制定位置的數據
int DeleteIntoSeqlist(seqlist_t *p, int post)
{// 容錯判斷if (IsEpSeqlist(p) || post < 0 || post > p->last){perror("Delete Failed!");return -1;}// 從下標為post+1 到last的元素向前移動一個單位for (int i = post + 1; i <= p->last; i++)p->data[i - 1] = p->data[i];p->last--;return 0;
}

7. 清空順序表

#include <stdio.h>
#include "seqlist.h"// 7.清空順序表 (清空:訪問不到,但是內存中還有;銷毀:內存清空)
void ClearSeqList(seqlist_t *p)
{p->last = -1;
}

8. 修改指定位置的數據

#include <stdio.h>
#include "seqlist.h"// 8.修改指定位置的數據,post為被修改數據位置,data為修改成的數據
int ChangePostSeqList(seqlist_t *p, int post, int data)
{// 容錯判斷if (post < 0 || post > p->last || IsEpSeqlist(p)){perror("Change Failed!");return -1;}// 修改指定位置的數據p->data[post] = data;return 0;
}

9. 查找指定數據出現位置

#include <stdio.h>
#include "seqlist.h"// 9.查找制定數據出現位置,data為被查找的數據,返回下標,未找到返回-1
int SearchDataSeqList(seqlist_t *p, int data)
{for (int i = 0; i <= p->last; i++)if (p->data[i] == data)return i;return -1;
}

?main.c

#include <stdio.h>
#include "seqlist.h"
#include <stdlib.h>int main(int argc, char const *argv[])
{// 創建空順序表seqlist_t *p = NULL;p = CreateEpSeqlist();// 插入數據InsertIntoSeqlist(p, 0, 1);InsertIntoSeqlist(p, 1, 2);InsertIntoSeqlist(p, 2, 3);InsertIntoSeqlist(p, 3, 4);InsertIntoSeqlist(p, 4, 5);// 遍歷順序表ShowSeqlist(p);// 刪除指定位置的數據DeleteIntoSeqlist(p, 2);ShowSeqlist(p);// 修改指定位置的數據ChangePostSeqList(p, 1, 999);ShowSeqlist(p);// 查找指定數據的位置printf("post = %d\n", SearchDataSeqList(p, 4));// 清空順序表ClearSeqList(p);printf("%d\n",IsEpSeqlist(p));// 釋放空間free(p);return 0;
}

3.2. 鏈表 Link

? ? ? ? 鏈表又叫單鏈表,鏈式存儲結構,用于存儲邏輯關系為 “ 一對一 ” 的數據。每個元素配有指針域,存儲和訪問時通過指針域指向下一個節點的地址。

3.2.1. 鏈表的特性

邏輯結構:線性結構

存儲結構:鏈式存儲

特點:內存可以不連續

解決問題:長度固定,插入和刪除操作繁瑣

操作:增刪改查

struct node_t
{int data;    // 數據域struct node_t next;    // 指針域,存放下一個節點的地址
};

3.2.2. 單向鏈表

1)有頭單向鏈表

? ? ? ? 第一位數據域無效,無法存儲數據

2)無頭單向鏈表

? ? ? ? 第一位數據域有效

?單向鏈表的基本操作

?1. 定義結構體數組,作為鏈表的一個節點

typedef struct Link_list
{int data;struct Link_list *next;
}link_node_t, *link_list_t;

2. 定義鏈表節點

    link_node_t A = {'a', NULL};link_node_t B = {'b', NULL};link_node_t C = {'c', NULL};link_node_t D = {'d', NULL};

3. 定義頭指針

? ? ? ? 無頭

link_list_t h = &A;

????????有頭? ? ? ? ? ? 定義頭節點,讓頭指針指向頭節點

link_node_t S = {'\0', &A};
link_list_t h = &S;

4. 遍歷鏈表

? ? ? ? 無頭

    while (h != NULL){printf("%-4c", h->data);h = h->next;}printf("\n");

? ? ? ? 有頭

按照有頭節點方式遍歷

while (h->next != NULL)
{h = h->next;printf("%-4c", h->data);
}

按照無頭節點方式遍歷

h = h->next;
while(h != NULL)
{printf("%-4c", h->data);h = h->next;
}
?有頭單向鏈表的函數操作

頭文件 .h?

#ifndef __LINKLIST_H__
#define __LINKLIST_H__typedef int datatype;
typedef struct node_t
{datatype data;       // 數據域struct node_t *next; // 指針域,指向自身結構體的指針
} link_node_t, *link_list_t;// 1.創建一個空的有頭單向鏈表
link_list_t createEmptyLinkList();
// 2.鏈表指定位置插入數據
int insertIntoPostLinkList(link_node_t *p, int post, datatype data);
// 3.計算鏈表的長度。
int lengthLinkList(link_node_t *p);
// 4.遍歷鏈表
void showLinkList(link_node_t *p);
// 5.鏈表指定位置刪除數據
int deletePostLinkList(link_node_t *p, int post);
// 6.判斷鏈表是否為空
int isEmptyLinkList(link_node_t *p);
// 7.清空單向鏈表
void clearLinkList(link_node_t *p);
// 8.修改指定位置的數據 post 被修改的位置 data修改成的數據
int changePostLinkList(link_node_t *p, int post, datatype data);
// 9.查找指定數據出現的位置 data被查找的數據 //search 查找
int searchDataLinkList(link_node_t *p, datatype data);
// 10.刪除單向鏈表中出現的指定數據,data代表將單向鏈表中出現的所有data數據刪除
int deleteDataLinkList(link_node_t *p, datatype data);
// 11.轉置鏈表
// 解題思想:
//(1) 將頭節點與當前鏈表斷開,斷開前保存下頭節點的下一個節點,
//    保證后面鏈表能找得到,定義一個q保存頭節點的下一個節點,
//    斷開后前面相當于一個空的鏈表,后面是一個無頭的單向鏈表
//(2) 遍歷無頭鏈表的所有節點,
//    將每一個節點當做新節點插入空鏈表頭節點的下一個節點
//    (每次插入的頭節點的下一個節點位置)
void reverseLinkList(link_node_t *p);
#endif

1. 創建一個空的有頭單項鏈表

link_node_t *createEmptyLinkList()
{link_list_t h = (link_list_t)malloc(sizeof(link_node_t));// 容錯判斷if (h == NULL){perror("空間開辟失敗\n");return NULL;}// 頭節點初始化h->next=NULL;return h;
}

2. 鏈表指定位置插入節點

int insertIntoPostLinkList(link_node_t *p, int post, datatype data)
{link_list_t pnew = NULL; // 指向新節點// 容錯判斷if(post > lengthLinkList(p) || post < 0){perror("post 范圍錯誤");return -1;}// 創建新節點并初始化pnew = (link_list_t)malloc(sizeof(link_node_t));pnew->data = data;pnew ->next = NULL;// 移動頭指針,指向插入位置的前一個節點for(int i = 0; i < post; i++){p = p->next;}// 鏈接插入節點pnew->next = p->next;p ->next = pnew;return 0;
}

3. 計算鏈表長度

int lengthLinkList(link_node_t *p)
{int len = 0;while (p->next != NULL){p = p->next;len++;}return len;
}

4. 遍歷鏈表

void showLinkList(link_node_t *p)
{while (p->next != NULL){p = p->next;printf("%-4d", p->data);}
}

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

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

相關文章

數據恢復-01-機械硬盤的物理與邏輯結構

磁盤存儲原理 磁盤存儲數據的原理&#xff1a; 磁盤存儲數據的原理是利用磁性材料在磁場作用下的磁化性質&#xff0c;通過在磁盤表面上劃分成許多小區域&#xff0c;根據不同的磁化方向來表示0和1的二進制數據&#xff0c;通過讀寫磁頭在磁盤上的移動&#xff0c;可以實現數據…

wordpress get_footer();與wp_footer();的區別的關系

在WordPress中&#xff0c;get_footer() 和 wp_footer() 是兩個不同的函數&#xff0c;它們在主題開發中扮演著不同的角色&#xff0c;但都與頁面的“頁腳”部分有關。以下是它們的區別和關系&#xff1a; 1. get_footer() get_footer() 是一個用于加載頁腳模板的函數。它的主…

DeepSeek 通過 API 對接第三方客戶端 告別“服務器繁忙”

本文首發于只抄博客&#xff0c;歡迎點擊原文鏈接了解更多內容。 前言 上一期分享了如何在本地部署 DeepSeek R1 模型&#xff0c;但通過命令行運行的本地模型&#xff0c;問答的交互也要使用命令行&#xff0c;體驗并不是很好。這期分享幾個第三方客戶端&#xff0c;涵蓋了桌…

跟著李沐老師學習深度學習(十一)

經典的卷積神經網絡 在本次筆記中主要介紹一些經典的卷積神經網絡模型&#xff0c;主要包含以下&#xff1a; LeNet&#xff1a;最早發布的卷積神經網絡之一&#xff0c;目的是識別圖像中的手寫數字&#xff1b;AlexNet&#xff1a; 是第一個在大規模視覺競賽中擊敗傳統計算機…

使用JavaScript實現深淺拷貝

1. 拷貝的基本概念和必要性 在 JavaScript 中&#xff0c;數據類型分為基本數據類型&#xff08;如 Number、String、Boolean、Null、Undefined、Symbol&#xff09;和引用數據類型&#xff08;如 Object、Array&#xff09;。基本數據類型存儲的是值本身&#xff0c;而引用數…

解析瀏覽器中JavaScript與Native交互原理:以WebGPU為例

引言 隨著Web應用復雜度的提升&#xff0c;開發者對瀏覽器訪問本地硬件能力的需求日益增長。然而&#xff0c;瀏覽器必須在開放性與安全性之間找到平衡——既不能放任JavaScript&#xff08;JS&#xff09;隨意操作系統資源&#xff0c;又要為高性能計算、圖形渲染等場景提供支…

T-Sql 打印所有用戶表的建表腳本

-- 聲明一個變量用于存儲表名 DECLARE TableName NVARCHAR(128); -- 聲明一個游標&#xff0c;用于遍歷所有用戶表 DECLARE TableCursor CURSOR FOR SELECT name FROM sys.tables WHERE type U; -- 打開游標 OPEN TableCursor; -- 從游標中獲取第一行數據 FETCH NEXT FROM Ta…

25/2/16 <算法筆記> MiDas原理

MiDaS&#xff08;Monocular Depth Sensing&#xff09;是一種基于單目深度估計的技術&#xff0c;它通過深度學習方法使用單張RGB圖像&#xff08;普通2D圖像&#xff09;來估算場景的深度圖&#xff08;Depth Map&#xff09;。相比于傳統的依賴專用深度傳感器&#xff08;如…

python+halcon 解讀labelme標注生成marksimage

這一段代碼封裝了一個類&#xff0c;需要傳統一個圖片和標注后json文件所在的地址&#xff0c;標注的選項是polygon&#xff0c;主要是用于unet深度學習網絡 在初始化時需要輸入文件&#xff08;imagejeson&#xff09;路徑&#xff0c;多分類任務的label_list。會在項目目錄下…

從技術債務到架構升級,滴滴國際化外賣的變革

背 景 商家營銷簡述 在外賣平臺的運營中&#xff0c;我們致力于通過靈活的補貼策略激勵商家&#xff0c;與商家共同打造良好的合作關系&#xff0c;也會提供多樣化的營銷活動&#xff0c;幫助商家吸引更多用戶下單。通過這些活動&#xff0c;不僅能夠提高商家的銷量&#xff0c…

英語—四級CET4考試—技巧篇—選詞填空—實操教學—2014 年 6 月大學英語四級考試真題(第 2 套)

&#x1f3e0;個人主頁&#xff1a;fo安方的博客? &#x1f482;個人簡歷&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;目前中南大學MBA在讀&#xff0c;也考取過HCIE Cloud Computing、CCIE Security、PMP、CISP、RHCE、CCNP RS、PEST 3等證書。&#x1f433; &…

線性代數中的正交和標準正交向量

在線性代數中&#xff0c;理解正交向量和正交向量至關重要&#xff0c;尤其是對于機器學習中的應用。這篇博文將簡化這些概念&#xff0c;而不會太深入地深入研究復雜的數學。 正交向量 如果兩個向量的點積等于零&#xff0c;則認為這兩個向量是正交的。但點積到底是什么呢&am…

企業文件共享中的權限管理與安全風險防范

在企業的日常運營中&#xff0c;文件共享是必不可少的一項工作。然而&#xff0c;文件共享過程中如果權限管理不當&#xff0c;極易引發安全風險&#xff0c;導致企業敏感信息泄露。因此&#xff0c;加強文件共享中的權限管理與安全風險防范&#xff0c;對于保障企業信息安全至…

急停信號的含義

前言&#xff1a; 大家好&#xff0c;我是上位機馬工&#xff0c;碩士畢業4年年入40萬&#xff0c;目前在一家自動化公司擔任軟件經理&#xff0c;從事C#上位機軟件開發8年以上&#xff01;我們在開發C#的運動控制程序的時候&#xff0c;一個必要的步驟就是確認設備按鈕的急停…

數據結構:圖;鄰接矩陣和鄰接表

鄰接矩陣&#xff1a; 1.概念&#xff1a; 鄰接矩陣是圖的存儲結構之一&#xff0c;通過二維數組表示頂點間的連接關系。 2.具體例子 &#xff1a; 一.無向圖鄰接矩陣示例&#xff1a; 示例圖&#xff08;頂點&#xff1a;A、B、C&#xff0c;邊&#xff1a;A-B、B-C&…

Kubernetes-master 組件

以下是Kubernetes Master Machine的組件。 etcd 它存儲集群中每個節點可以使用的配置信息。它是一個高可用性鍵值存儲&#xff0c;可以在多個節點之間分布。只有Kubernetes API服務器可以訪問它&#xff0c;因為它可能具有一些敏感信息。這是一個分布式鍵值存儲&#xff0c;所…

【第2章:神經網絡基礎與實現——2.1 前饋神經網絡的結構與工作原理】

老鐵們好!今天我們要來一場長達兩萬字的超詳細技術探險,我會像拆解樂高積木一樣把前饋神經網絡(Feedforward Neural Network)的每個零件擺在臺面上,用最接地氣的方式讓你徹底搞懂這個深度學習基石的工作原理。準備好了嗎?我們開始吧! 第一章:神經網絡的 “樂高積木” 1…

【云安全】云原生- K8S kubeconfig 文件泄露

什么是 kubeconfig 文件&#xff1f; kubeconfig 文件是 Kubernetes 的配置文件&#xff0c;用于存儲集群的訪問憑證、API Server 的地址和認證信息&#xff0c;允許用戶和 kubectl 等工具與 Kubernetes 集群進行交互。它通常包含多個集群的配置&#xff0c;支持通過上下文&am…

【環境安裝】重裝Docker-26.0.2版本

【機器背景說明】Linux-Centos7&#xff1b;已有低版本的Docker 【目標環境說明】 卸載已有Docker&#xff0c;用docker-26.0.2.tgz安裝包安裝 1.Docker包下載 下載地址&#xff1a;Index of linux/static/stable/x86_64/ 2.卸載已有的Docker 卸載之前首先停掉服務 sudo…

字節跳動后端二面

&#x1f4cd;1. 數據庫的事務性質&#xff0c;InnoDB是如何實現的&#xff1f; 數據庫事務具有ACID特性&#xff0c;即原子性、一致性、隔離性和持久性。InnoDB通過以下機制實現這些特性&#xff1a; &#x1f680; 實現細節&#xff1a; 原子性&#xff1a;通過undo log實…