嵌入式開發學習———Linux環境下數據結構學習(三)

單向循環鏈表

單向循環鏈表是一種特殊的單向鏈表,尾節點的指針指向頭節點,形成一個閉環。適用于需要循環訪問的場景,如輪詢調度。

  • 結構特點:每個節點包含數據域和指向下一個節點的指針,尾節點的指針指向頭節點而非空值。
  • 操作復雜度
    • 插入/刪除頭節點:O(1)
    • 插入/刪除尾節點:O(n)(需遍歷到尾部)
  • 代碼示例(C++)
struct Node {int data;Node* next;Node(int val) : data(val), next(nullptr) {}
};

雙向鏈表

雙向鏈表的每個節點包含前驅和后繼指針,支持雙向遍歷,但需要更多內存存儲指針。

  • 結構特點:節點包含前驅指針(prev)、數據域和后續指針(next)。
  • 操作復雜度
    • 任意位置插入/刪除:O(1)(已知前驅節點時)
    • 按值查找:O(n)
  • 代碼示例(C++)
struct DNode {int data;DNode* prev;DNode* next;DNode(int val) : data(val), prev(nullptr), next(nullptr) {}
};

?
作業:

?1.雙向鏈表的部分操作

#include "linklist.h"int main(int argc, const char *argv[])
{//定義一個頭linklistptr headptr=NULL;//定義循環變量int i;//定義位置變量int seat;//頭的初始化headptr=LinklistHeadnodeApply();//定義新輸入數據datatype nwedata;//循環輸入數據for(i=0;i<5;i++){puts("請輸入一個數:");scanf(" %d",&nwedata);//調用雙向鏈表的頭插函數LinklistHeadinsert(headptr,nwedata);}//調用雙向鏈表的遍歷函數nextLinklistShownext(headptr);//調用雙向鏈表的遍歷函數frontLinklistShowfront(headptr);//循環輸入數據for(i=0;i<5;i++){puts("請輸入一個數:");scanf(" %d",&nwedata);//雙向鏈表的尾插函數LinklistTailinsert(headptr,nwedata);}//調用雙向鏈表的遍歷函數nextLinklistShownext(headptr);//調用雙向鏈表的頭刪函數LinklistHeaddelete(headptr);//調用雙向鏈表的遍歷函數nextLinklistShownext(headptr);//調用雙向鏈表的尾刪函數LinklistTaildelete(headptr);//調用雙向鏈表的遍歷函數nextLinklistShownext(headptr);//分別輸入位置和新數據puts("輸入想插入的位置:");scanf(" %d",&seat);puts("輸入想插入的數據:");scanf(" %d",&nwedata);//調用雙向鏈鏈表按位置插入函數LinklistSeatinsert(headptr,seat,nwedata);//調用雙向鏈表的遍歷函數nextLinklistShownext(headptr);//輸入位置puts("輸入想刪除的位置:");scanf(" %d",&seat);//調用雙向鏈鏈表按位置插入函數LinklistSeatdelete(headptr,seat);//調用雙向鏈表的遍歷函數nextLinklistShownext(headptr);//分別輸入位置和新數據puts("輸入想要修改的位置:");scanf(" %d",&seat);puts("輸入想改成的數據:");scanf(" %d",&nwedata);//調用雙向鏈鏈表按位置修改函數LinklistSeatalter(headptr,seat,nwedata);//調用雙向鏈表的遍歷函數nextLinklistShownext(headptr);//輸入位置puts("輸入想查找的位置:");scanf(" %d",&seat);//調用雙向鏈鏈表按位置查找函數LinklistSeatsift(headptr,seat);return 0;
}
#ifndef _LINKLIST_H__
#define _LINKLIST_H__#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>//返回值枚舉
enum returntype
{//失敗返回FAULSE=-1,//成功返回SUCCESS
};//存儲數據類型
typedef int datatype;//雙向鏈鏈表結構體
typedef struct Node
{//數據域共用體union{//頭節點數據域int len;//普通節點數據域datatype data;};//前向指針域struct Node *front;//后向指針域struct Node *next;
}linklist,*linklistptr;//頭節點堆區申請函數
linklistptr LinklistHeadnodeApply(void);//普通節點堆區申請函數
linklistptr LinklistComnodeApply(datatype nwedata);//雙向鏈表的頭插函數
int LinklistHeadinsert(linklistptr headptr,datatype nwedata);//雙向鏈表的遍歷函數next
int LinklistShownext(linklistptr headptr);//雙向鏈表的遍歷函數front
int LinklistShowfront(linklistptr headptr);//雙向鏈表的尾插函數
int LinklistTailinsert(linklistptr headptr,datatype nwedata);//雙向鏈表的頭刪函數
int LinklistHeaddelete(linklistptr headptr);//雙向鏈表的尾刪函數
int LinklistTaildelete(linklistptr headptr);//雙向鏈鏈表按位置插入函數
int LinklistSeatinsert(linklistptr headptr,int seat,datatype nwedata);//雙向鏈鏈表按位置刪除函數
int LinklistSeatdelete(linklistptr headptr,int seat);//雙向鏈鏈表按位置修改函數
int LinklistSeatalter(linklistptr headptr,int seat,datatype nwedata);//雙向鏈鏈表按位置查找函數
linklistptr LinklistSeatsift(linklistptr headptr,int seat);#endif
#include "linklist.h"//頭節點堆區申請函數
linklistptr LinklistHeadnodeApply(void)
{//頭節點堆區申請linklistptr headptr=(linklistptr)malloc(sizeof(linklist));//判斷申請是否成功if(headptr==NULL){return NULL;}//初始化headptr->len=0;headptr->front=NULL;headptr->next=NULL;return headptr;
}//普通點堆區申請函數
linklistptr LinklistComnodeApply(datatype nwedata)
{//普通節點堆區申請linklistptr comptr=(linklistptr)malloc(sizeof(linklist));//判斷申請是否成功if(comptr==NULL){return NULL;}//初始化comptr->data=nwedata;comptr->front=NULL;comptr->next=NULL;return comptr;
}//雙向鏈表的頭插函數
int LinklistHeadinsert(linklistptr headptr,datatype nwedata)
{//定義普通節點指針linklistptr comptr=NULL;//判斷是否為nullif(headptr==NULL){return FAULSE;}//普通節點申請comptr=LinklistComnodeApply(nwedata);//申請判斷if(comptr==NULL){return FAULSE;}//頭插comptr->next=headptr->next;comptr->front=headptr;//判斷是否為首個數據if(headptr->next){headptr->next->front=comptr;}headptr->next=comptr;//個數自增headptr->len++;return SUCCESS;
}//雙向鏈表的遍歷函數next
int LinklistShownext(linklistptr headptr)
{//定義鏈表指針linklistptr ptr=NULL;//定義循環變量int i;//判斷是否為null//判斷鏈表是否為空if(headptr==NULL||headptr->len==0){return FAULSE;}//輸出ptr=headptr->next;puts("正序鏈表現有數據:");while(ptr){printf("%d ",ptr->data);ptr=ptr->next;}putchar(10);return SUCCESS;
}//雙向鏈表的遍歷函數front
int LinklistShowfront(linklistptr headptr)
{//定義鏈表指針linklistptr ptr=NULL;//定義循環變量int i;//判斷是否為NULL//判斷鏈表是否為空if(headptr==NULL||headptr->len==0){return FAULSE;}//找尾部ptr=headptr->next;while(ptr->next){ptr=ptr->next;}//輸出puts("逆序鏈表現有數據:");while(ptr!=headptr){printf("%d ",ptr->data);ptr=ptr->front;}putchar(10);return SUCCESS;
}//雙向鏈表的尾插函數
int LinklistTailinsert(linklistptr headptr,datatype nwedata)
{//定義鏈表指針和普通節點指針linklistptr ptr=NULL,comptr=NULL;//判斷頭是否為nullif(headptr==NULL){return FAULSE;}//找尾部ptr=headptr;while(ptr->next){ptr=ptr->next;}//初始化普通節點comptr=LinklistComnodeApply(nwedata);//判斷申請是否成功if(comptr==NULL){return FAULSE;}//尾插ptr->next=comptr;comptr->front=ptr;//個數自增headptr->len++;return SUCCESS;
}
//雙向鏈表的頭刪函數
int LinklistHeaddelete(linklistptr headptr)
{//定義鏈表指針和將刪節點指針linklistptr deltr=NULL,ptr=NULL;//判斷頭是否為nullif(headptr==NULL||headptr->len==0){return FAULSE;}//找到要刪除的數據第一個節點deltr=headptr->next;//頭刪headptr->next=deltr->next;//判斷是否只有一個節點if(deltr->next){deltr->next->front=headptr;}free(deltr);deltr=NULL;//個數自減headptr->len--;return SUCCESS;
}//雙向鏈表的尾刪函數
int LinklistTaildelete(linklistptr headptr)
{//定義鏈表指針和將刪節點指針linklistptr deltr=NULL,ptr=NULL;//判斷頭是否為nullif(headptr==NULL||headptr->len==0){return FAULSE;}//找尾部ptr=headptr;while(ptr->next){ptr=ptr->next;}ptr->front->next=NULL;free(ptr);ptr=NULL;headptr->len--;return SUCCESS;
}//雙向鏈鏈表按位置插入函數
int LinklistSeatinsert(linklistptr headptr,int seat,datatype nwedata)
{//定義循環變量int i;//定義鏈表指針和普通節點指針linklistptr ptr=NULL,comptr=NULL;//判斷頭是否為NULL//判斷位置是否合法if(headptr==NULL||seat<=0||seat>headptr->len+1){return FAULSE;}//找到對應位置的前一個位置ptr=headptr;for(i=0;i<seat-1;i++){ptr=ptr->next;}//初始化普通節點comptr=LinklistComnodeApply(nwedata);//if(comptr==NULL){return FAULSE;}//插入comptr->next=ptr->next;comptr->front=ptr;if(ptr->next!=NULL){ptr->next->front=comptr;}ptr->next=comptr;headptr->len++;return SUCCESS;
}//雙向鏈鏈表按位置刪除函數
int LinklistSeatdelete(linklistptr headptr,int seat)
{//定義循環變量int i;//定義鏈表指針和將刪節點指針linklistptr deltr=NULL,ptr=NULL;//判斷是否為NULL//判斷鏈表是否為空//判斷位置是否合法if(headptr==NULL||headptr->len==0||seat<=0||seat>headptr->len){return FAULSE;}//找到對應位置的前一個位置ptr=headptr;for(i=0;i<seat-1;i++){ptr=ptr->next;}deltr=ptr->next;ptr->next=deltr->next;if(deltr->next!=NULL){deltr->next->front=deltr->front;}free(deltr);deltr=NULL;headptr->len--;return SUCCESS;
}//雙向鏈鏈表按位置修改函數
int LinklistSeatalter(linklistptr headptr,int seat,datatype nwedata)
{//定義循環變量int i;//定義鏈表指針linklistptr ptr=NULL;//判斷是否為NULL//判斷鏈表是否為空//判斷位置是否合法if(headptr==NULL||headptr->len==0||seat<=0||seat>headptr->len){return FAULSE;}//找到對應位置ptr=headptr;for(i=0;i<seat;i++){ptr=ptr->next;}ptr->data=nwedata;return SUCCESS;
}//雙向鏈鏈表按位置查找函數
linklistptr LinklistSeatsift(linklistptr headptr,int seat)
{//定義循環變量int i;//定義鏈表指針linklistptr ptr=NULL;//判斷是否為NULL//判斷鏈表是否為空//判斷位置是否合法if(headptr==NULL||headptr->len==0||seat<=0||seat>headptr->len){return NULL;}//找到對應位置ptr=headptr;for(i=0;i<seat;i++){ptr=ptr->next;}printf("linklist[%d]=%d\n",seat,ptr->data);return ptr;
}

運行示例:


2.牛客網刷題

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

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

相關文章

【華為機試】684. 冗余連接

文章目錄684. 冗余連接描述示例 1示例 2提示解題思路核心分析問題轉化算法選擇策略1. 并查集 (Union-Find) - 推薦2. 深度優先搜索 (DFS)3. 拓撲排序算法實現詳解方法一&#xff1a;并查集 (Union-Find)方法二&#xff1a;深度優先搜索 (DFS)數學證明并查集算法正確性證明時間復…

Ⅹ—6.計算機二級綜合題7---10套

目錄 第7套 【填空題】 【修改題】 【設計題】 第8套 【填空題】 【修改題】 【設計題】 第9套 【填空題】 【修改題】 【設計題】 第10套 【填空題】 【修改題】 【設計題】 第7套 【填空題】 題目要求:給定程序中,函數fun的功能是:將形參s所指字符串中所…

【三橋君】大語言模型計算成本高,MoE如何有效降低成本?

? 你好&#xff0c;我是 ?三橋君? &#x1f4cc;本文介紹&#x1f4cc; >> 一、引言 在AI技術飛速發展的當下&#xff0c;大語言模型&#xff08;LLM&#xff09;的參數規模不斷增長&#xff0c;但隨之而來的計算成本問題也日益凸顯。如何在保持高效推理能力的同時擴…

Python游戲開發利器:Pygame從入門到實戰全解析

引言 Pygame是Python中最受歡迎的2D游戲開發庫之一&#xff0c;基于SDL&#xff08;Simple DirectMedia Layer&#xff09;構建&#xff0c;支持圖形渲染、音效處理、事件響應等核心功能。無論是開發簡單的休閑游戲&#xff0c;還是復雜的交互式應用&#xff0c;Pygame都能提供…

行為型模式-協作與交互機制

行為型模式聚焦于對象間的行為交互&#xff0c;通過規范對象協作方式提升系統的靈活性與可擴展性。在分布式系統中&#xff0c;由于多節點異步通信、網絡不可靠性及狀態一致性挑戰&#xff0c;行為型模式需針對分布式特性進行適應性設計。本文從觀察者、策略、命令、責任鏈、狀…

spring boot 整合 Spring Cloud、Kafka 和 MyBatis菜鳥教程

環境準備確保項目中已引入 Spring Boot、Spring Cloud、Kafka 和 MyBatis 的依賴。以下是一個典型的 Maven 依賴配置&#xff1a;<dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artif…

20 BTLO 藍隊靶場 Sticky Situation 解題記錄

難度&#xff1a;5/10考察技能: Windows admin, Autopsy 使用場景&#xff1a;分析USB設備使用情況Autopsy使用注意&#xff1a;用管理員打開&#xff0c;在實際分析時注意先復制一個鏡像文件&#xff0c;保存好原文件常用的Windows USB 取證的位置:Windows XP:Registry Key: U…

安裝及配置Go語言開發環境與VSCode集成指南

安裝Go語言開發 安裝Go語言開發環境是第一步。訪問Go官網&#xff0c;下載適合操作系統的安裝包&#xff0c;如果進不去可以訪問Go官方鏡像站。 根據自己的系統選擇對應的安裝包&#xff0c;我這邊是Windows系統就點擊安裝第一個即可。 點擊下一步即可。 驗證安裝是否成功可以…

專題:2025微短劇行業生態構建與跨界融合研究報告|附100+份報告PDF匯總下載

原文鏈接&#xff1a; https://tecdat.cn/?p43384 分析師&#xff1a;Boyu Wang 在此對 Boyu Wang 對本文所作的貢獻表示誠摯感謝&#xff0c;他在武漢大學完成了數據科學與大數據技術專業的學習。擅長 R 語言、Python、機器學習、數據可視化。 中國短視頻行業在經歷爆發式增…

配置NGINX

Nginx環境配置與前端VUE部署安裝nginx&#xff1a;命令sudo yum update && sudo yum install nginx部署:拷貝前端到目錄/home/publish/idasweb/下修改nginx配置&#xff1a;進入到/etc/nginx目錄下&#xff0c;修改nginx.conf中user www-data為user root&#xff0c;不…

MySQL深度理解-MySQL索引優化

1.Order by與Group by優化1.1Case1employees表中建立了name&#xff0c;position和age索引&#xff0c;并且使用了order by age進行排序操作&#xff1a;EXPLAIN SELECT * FROM employees WHERE name LiLei and position dev order by age最終explain的結果發現使用了idx_nam…

「Linux命令基礎」用戶和用戶組實訓

用戶與用戶組關系管理 在Linux系統中,用戶和用戶組的關系就像班級里的學生和小組。一個用戶可以同時屬于多個組,這種靈活的成員關系為權限管理提供了便利。創建用戶時,系統會自動生成一個與用戶同名的主組,這個組會成為用戶創建文件時的默認屬組。 理解用戶和用戶組的關系…

Https以及CA證書

目錄 1. 什么是 HTTPS 通信機制流程 證書驗證過程 CA證書 瀏覽器如何校驗證書合法性呢&#xff1f; 1. 什么是 HTTPS HTTP 加上加密處理和認證以及完整性保護后即是 HTTPS。 它是為了解決 HTTP 存在的安全性問題&#xff0c;而衍生的協議&#xff0c;那使用 HTTP 的缺點有…

數字圖像處理(四:圖像如果當作矩陣,那加減乘除處理了矩陣,那圖像咋變):從LED冬奧會、奧運會及春晚等等大屏,到手機小屏,快來挖一挖里面都有什么

數字圖像處理&#xff08;四&#xff09;三、&#xff08;準備工作&#xff1a;玩具咋玩&#xff09;圖像以矩陣形式存儲&#xff0c;那矩陣一變、圖像立刻跟著變&#xff1f;原圖發揮了鈔能力之后的圖上述代碼包含 10 個圖像處理實驗&#xff0c;每個實驗會生成對應處理后的圖…

SpringBoot航空訂票系統的設計與實現

文章目錄前言詳細視頻演示具體實現截圖后端框架SpringBoot持久層框架Hibernate成功系統案例&#xff1a;代碼參考數據庫源碼獲取前言 博主介紹:CSDN特邀作者、985高校計算機專業畢業、現任某互聯網大廠高級全棧開發工程師、Gitee/掘金/華為云/阿里云/GitHub等平臺持續輸出高質…

2025年PostgreSQL 詳細安裝教程(windows)

前言 PostgreSQL 是一個功能強大的開源關系型數據庫管理系統(ORDBMS)&#xff0c;以下是對它的全面介紹&#xff1a; 基本概況 名稱&#xff1a;通常簡稱為 "Postgres" 類型&#xff1a;對象-關系型數據庫管理系統 許可&#xff1a;開源&#xff0c;采用類MIT許可…

Java日志按天切分方法

使用 Logrotate&#xff08;推薦&#xff09;Logrotate 是 Linux 系統自帶的日志管理工具&#xff0c;支持自動切割、壓縮和刪除舊日志。步驟&#xff1a;創建 Logrotate 配置文件在 /etc/logrotate.d/ 下新建配置文件&#xff08;如 java-app&#xff09;&#xff1a;sudo nan…

進階向:基于Python的本地文件內容搜索工具

概述 大家好&#xff01;今天我們將一起學習如何用Python創建一個簡單但強大的本地文件內容搜索工具。這個工具特別適合處理大量文本文件時的快速檢索需求。 為什么要學習這個工具 如果你剛接觸編程&#xff0c;完全不用擔心&#xff01;我會從零開始講解&#xff0c;確保每…

多模態AI的可解釋性

多模態AI的可解釋性挑戰 在深入探討解決方案之前&#xff0c;首先需要精確地定義問題。多模態模型因其固有的復雜性&#xff0c;其內部決策過程對于人類觀察者而言是不透明的。 模態融合機制 (Modal Fusion Mechanism)&#xff1a;模型必須將來自不同來源&#xff08;如圖像和文…

MySQL深度理解-MySQL事務優化

1.什么是事務事務就是進行多個操作&#xff0c;要么同時執行成功&#xff0c;要么同時執行失敗。2.事務的特性 - ACID特性2.1原子性Atomicity原子性&#xff08;Atomicity&#xff09;&#xff1a;當前事務的操作要么同時成功&#xff0c;要么同時失敗。原子性由undo log日志來…