Day24 目錄遍歷、雙向鏈表、棧

day24 目錄遍歷、雙向鏈表、棧


顯示指定目錄下的所有 .h 文件

功能描述

遍歷指定目錄(遞歸進入子目錄),查找所有以 .h 為后綴的頭文件,將其完整路徑(路徑 + 文件名)存儲到雙向鏈表中,并正向或反向打印輸出。

核心技術點
  • 使用 opendir / readdir / closedir 進行目錄遍歷
  • 使用 DT_DIR 判斷是否為目錄,實現遞歸
  • 使用 sprintf 拼接路徑字符串
  • 使用 strcmp 判斷文件后綴是否為 .h
  • 使用雙向鏈表動態存儲匹配的文件路徑

雙向鏈表結構定義(DouLink.h
#ifndef _DOULINK_H_
#define _DOULINK_H_// 定義通用數據類型,用于存儲文件路徑
typedef struct person {char path[512];           // 存儲文件的完整路徑(含目錄)
} DATATYPE;// 雙向鏈表節點
typedef struct dou_node {DATATYPE data;            // 數據域struct dou_node *prev;    // 指向前一個節點struct dou_node *next;    // 指向后一個節點
} DouLinkNode;// 雙向鏈表管理結構
typedef struct list {DouLinkNode *head;        // 指向鏈表頭節點int clen;                 // 當前鏈表長度
} DouLinkList;// 遍歷方向枚舉
typedef enum {DIR_FORWARD,              // 正向遍歷DIR_BACKWARD              // 反向遍歷
} DIRECT;// 函數指針類型,用于查找、刪除等操作
typedef int (*PFUN)(DATATYPE* data, void* arg);// 函數聲明
DouLinkList *CreateDouLinkList();
int InsertHeadDouLinkList(DouLinkList *dl, DATATYPE *data);
int InsertTailDouLinkList(DouLinkList *dl, DATATYPE *data);
int InsertPosDouLinkList(DouLinkList *dl, DATATYPE *data, int pos);
DouLinkNode *FindDouLinkList(DouLinkList *dl, PFUN fun, void* arg);
int ModifyDouLinkList(DouLinkList *dl, char *name, DATATYPE *newdata);
int DeleteDouLinkList(DouLinkList *dl, char *name);
int GetSizeDouLinkList(DouLinkList *dl);
int IsEmptyDouLinkList(DouLinkList *dl);
int DestroyDouLinkList(DouLinkList *dl);
int ShowDouLinkList(DouLinkList *dl, DIRECT direct);#endif // _DOULINK_H_

? 說明:該頭文件定義了通用的雙向鏈表結構,適用于多種數據類型。當前用于存儲 .h 文件路徑。


雙向鏈表實現(DouLink.c
#include "DouLink.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 創建空雙向鏈表
DouLinkList *CreateDouLinkList() {DouLinkList *dl = malloc(sizeof(DouLinkList));if (NULL == dl) {perror("CreateDouLinkList malloc");return NULL;}dl->head = NULL;dl->clen = 0;return dl;
}// 頭插法插入節點
int InsertHeadDouLinkList(DouLinkList *dl, DATATYPE *data) {DouLinkNode *newnode = malloc(sizeof(DouLinkNode));if (NULL == newnode) {perror("InsertHeadDouLinkList malloc");return 1;}memcpy(&newnode->data, data, sizeof(DATATYPE));newnode->next = NULL;newnode->prev = NULL;if (IsEmptyDouLinkList(dl)) {dl->head = newnode;} else {newnode->next = dl->head;dl->head->prev = newnode;dl->head = newnode;}dl->clen++;return 0;
}// 正向或反向打印鏈表
int ShowDouLinkList(DouLinkList *dl, DIRECT direct) {DouLinkNode *tmp = dl->head;if (DIR_FORWARD == direct) {while (tmp) {printf("%s\n", tmp->data.path);  // 輸出文件路徑tmp = tmp->next;}} else {// 找到最后一個節點while (tmp && tmp->next) {tmp = tmp->next;}// 從尾向前遍歷while (tmp) {printf("%s\n", tmp->data.path);tmp = tmp->prev;}}return 0;
}// 判斷鏈表是否為空
int IsEmptyDouLinkList(DouLinkList *dl) {return 0 == dl->clen;
}// 尾插法插入節點
int InsertTailDouLinkList(DouLinkList *dl, DATATYPE *data) {if (IsEmptyDouLinkList(dl)) {return InsertHeadDouLinkList(dl, data);} else {DouLinkNode *newnode = malloc(sizeof(DouLinkNode));if (NULL == newnode) {perror("InsertTailDouLinkList malloc");return 1;}memcpy(&newnode->data, data, sizeof(DATATYPE));newnode->next = NULL;newnode->prev = NULL;DouLinkNode *tmp = dl->head;while (tmp->next) {tmp = tmp->next;}newnode->prev = tmp;tmp->next = newnode;}dl->clen++;return 0;
}// 在指定位置插入節點
int InsertPosDouLinkList(DouLinkList *dl, DATATYPE *data, int pos) {int size = GetSizeDouLinkList(dl);if (pos < 0 || pos > size) {printf("InsertPosDouLinkList pos error\n");return 1;}if (0 == pos) {return InsertHeadDouLinkList(dl, data);} else if (size == pos) {return InsertTailDouLinkList(dl, data);} else {DouLinkNode *newnode = malloc(sizeof(DouLinkNode));if (NULL == newnode) {perror("InsertPosDouLinkList malloc");return 1;}memcpy(&newnode->data, data, sizeof(DATATYPE));newnode->next = NULL;newnode->prev = NULL;DouLinkNode *tmp = dl->head;while (pos--) {tmp = tmp->next;}newnode->next = tmp;newnode->prev = tmp->prev;tmp->prev = newnode;newnode->prev->next = newnode;dl->clen++;}return 0;
}// 通用查找函數:通過函數指針匹配數據
DouLinkNode *FindDouLinkList(DouLinkList *dl, PFUN fun, void* arg) {DouLinkNode* tmp = dl->head;while (tmp) {if (fun(&tmp->data, arg)) {return tmp;}tmp = tmp->next;}return NULL;
}// 獲取鏈表長度
int GetSizeDouLinkList(DouLinkList *dl) {return dl->clen;
}// 銷毀鏈表(釋放所有節點和鏈表結構)
int DestroyDouLinkList(DouLinkList *dl) {DouLinkNode *tmp = NULL;while (dl->head) {tmp = dl->head;dl->head = dl->head->next;free(tmp);}free(dl);return 0;
}

? 理想運行結果

  • CreateDouLinkList() 返回一個空鏈表指針,head=NULL, clen=0
  • 插入操作后鏈表長度遞增,ShowDouLinkList 可按正/反順序輸出路徑
  • DestroyDouLinkList 釋放所有內存,無泄漏

目錄遍歷與頭文件查找(main.c
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "DouLink.h"// 指定起始路徑(可修改)
char path[] = "/home/linux/20250818cd";// 判斷文件是否為 .h 后綴
int is_headfile(char* path) {if (strlen(path) < 3) return 0;char* tmp = &path[strlen(path) - 2];  // 取最后兩個字符前的位置if (0 == strcmp(tmp, ".h")) {return 1;}return 0;
}// 遞歸遍歷目錄,將 .h 文件路徑插入鏈表
int do_ls(char* path, DouLinkList* dl) {DIR* dir = opendir(path);if (NULL == dir) {perror("opendir");return 1;}struct dirent* info;while ((info = readdir(dir)) != NULL) {char newpath[512] = {0};sprintf(newpath, "%s/%s", path, info->d_name);  // 拼接完整路徑if (info->d_type == DT_DIR) {// 忽略 . 和 ..if (strcmp(info->d_name, ".") == 0 || strcmp(info->d_name, "..") == 0) {continue;}// 遞歸進入子目錄do_ls(newpath, dl);} else {// 非目錄,檢查是否為 .h 文件DATATYPE data = {0};if (is_headfile(newpath)) {strcpy(data.path, newpath);InsertHeadDouLinkList(dl, &data);  // 頭插存儲}}}closedir(dir);return 0;
}// 主函數:創建鏈表、遍歷目錄、打印結果
int main(int argc, char** argv) {DouLinkList* dl = CreateDouLinkList();do_ls("/home/linux", dl);  // 從 /home/linux 開始遞歸查找printf("=== 所有 .h 文件路徑(正向輸出)===\n");ShowDouLinkList(dl, DIR_FORWARD);DestroyDouLinkList(dl);return 0;
}

? 理想運行結果示例

=== 所有 .h 文件路徑(正向輸出)===
/home/linux/20250818cd/test.h
/home/linux/20250818cd/include/utils.h
/home/linux/20250818cd/module/config.h
  • 成功遞歸進入所有子目錄
  • 正確識別 .h 文件并存儲完整路徑
  • 輸出順序取決于插入方式(頭插 → 逆序)

雙向鏈表(通用版)

功能說明

該雙向鏈表支持插入、刪除、查找、修改、遍歷等操作,適用于存儲結構化數據(如學生信息)。

數據結構定義(DouLink.h
#ifndef _DOULINK_H_
#define _DOULINK_H_typedef struct person {char name[32];char sex;int age;int score;
} DATATYPE;typedef struct dou_node {DATATYPE data;struct dou_node *prev;struct dou_node *next;
} DouLinkNode;typedef struct list {DouLinkNode *head;int clen;
} DouLinkList;typedef enum {DIR_FORWARD,DIR_BACKWARD
} DIRECT;typedef int (*PFUN)(DATATYPE* data, void* arg);// 函數聲明(略去重復部分)
DouLinkList *CreateDouLinkList();
int InsertHeadDouLinkList(DouLinkList *dl, DATATYPE *data);
int InsertTailDouLinkList(DouLinkList *dl, DATATYPE *data);
int InsertPosDouLinkList(DouLinkList *dl, DATATYPE *data, int pos);
DouLinkNode *FindDouLinkList(DouLinkList *dl, PFUN fun, void* arg);
int ModifyDouLinkList(DouLinkList *dl, PFUN fun, void* arg, DATATYPE *newdata);
int DeleteDouLinkList(DouLinkList *dl, PFUN fun, void* arg);
int GetSizeDouLinkList(DouLinkList *dl);
int IsEmptyDouLinkList(DouLinkList *dl);
int DestroyDouLinkList(DouLinkList *dl);
int ShowDouLinkList(DouLinkList *dl, DIRECT direct);#endif

? 說明:此版本 DATATYPE 包含姓名、性別、年齡、成績,適用于人員管理。


鏈表操作實現(DouLink.c
  • CreateDouLinkListInsertHead/InsertTail/InsertPosShowDouLinkListIsEmptyGetSize 實現同上(略)
  • 新增 ModifyDouLinkListDeleteDouLinkListDestroyDouLinkList
// 根據條件修改節點數據
int ModifyDouLinkList(DouLinkList *dl, PFUN fun, void *arg, DATATYPE *newdata) {DouLinkNode *tmp = FindDouLinkList(dl, fun, arg);if (NULL == tmp) {printf("ModifyDouLinkList failure...\n");return 1;}memcpy(&tmp->data, newdata, sizeof(DATATYPE));return 0;
}// 根據條件刪除節點
int DeleteDouLinkList(DouLinkList *dl, PFUN fun, void *arg) {DouLinkNode *tmp = FindDouLinkList(dl, fun, arg);if (NULL == tmp) {printf("del failure...\n");return 1;}if (tmp == dl->head) {dl->head = dl->head->next;if (dl->head) dl->head->prev = NULL;} else {if (tmp->next) tmp->next->prev = tmp->prev;tmp->prev->next = tmp->next;}free(tmp);dl->clen--;return 0;
}// 銷毀整個鏈表
int DestroyDouLinkList(DouLinkList *dl) {DouLinkNode *tmp;while (dl->head) {tmp = dl->head;dl->head = dl->head->next;free(tmp);}free(dl);return 0;
}

測試程序(test.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "DouLink.h"// 按姓名查找
int findperbyname(DATATYPE* data, void* arg) {return 0 == strcmp(data->name, (char*)arg);
}// 按年齡查找
int findperbyage(DATATYPE* data, void* arg) {return data->age == *(int*)arg;
}int main(int argc, char** argv) {DouLinkList* dl = CreateDouLinkList();DATATYPE data[] = {{"zhangsan", 'm', 20, 80},{"lisi", 'f', 23, 84},{"wangmaizi", 'f', 32, 90},{"guanerge", 'm', 50, 91},{"liubei", 'm', 51, 92},{"zhangfei", 'm', 50, 80},};InsertHeadDouLinkList(dl, &data[0]);InsertHeadDouLinkList(dl, &data[1]);InsertHeadDouLinkList(dl, &data[2]);printf("------------正向輸出--------------------\n");ShowDouLinkList(dl, DIR_FORWARD);printf("------------反向輸出--------------------\n");ShowDouLinkList(dl, DIR_BACKWARD);InsertTailDouLinkList(dl, &data[3]);printf("------------尾插后--------------------\n");ShowDouLinkList(dl, DIR_FORWARD);InsertPosDouLinkList(dl, &data[4], 2);printf("------------位置插入后--------------------\n");ShowDouLinkList(dl, DIR_FORWARD);int age = 50;DouLinkNode* tmp = FindDouLinkList(dl, findperbyage, &age);if (tmp) {printf("找到年齡為50的人: %s, 成績: %d\n", tmp->data.name, tmp->data.score);}ModifyDouLinkList(dl, findperbyname, "lisi", &data[5]);printf("------------修改后--------------------\n");ShowDouLinkList(dl, DIR_BACKWARD);DeleteDouLinkList(dl, findperbyname, "liubei");printf("------------刪除后--------------------\n");ShowDouLinkList(dl, DIR_BACKWARD);DestroyDouLinkList(dl);return 0;
}

? 理想運行結果

  • 正確插入、查找、修改、刪除
  • 輸出格式:name:xxx sex:x age:xx score:xx
  • 修改后 lisi 變為 zhangfeiliubei 被刪除

順序表與鏈表對比

對比項順序表鏈表
存儲方式連續內存空間物理上不連續,邏輯上連續
查找性能O(1) —— 支持隨機訪問O(n) —— 需遍歷
插入/刪除O(n) —— 需移動元素O(1) —— 只需修改指針(已知位置)
空間分配靜態/固定大小,易浪費或溢出動態分配,靈活,無空間浪費

循環鏈表

  • 將單鏈表最后一個節點的 next 指針指向頭節點第一個有效節點,形成環狀結構。
  • 空表判斷:head == NULL
  • 非空表遍歷條件:p->next != head(代替 p->next != NULL
  • 常用于約瑟夫環、循環任務調度等場景。

雙向鏈表(結構簡寫版)

typedef struct DulNode {ElemType data;               // 數據域struct DulNode *pri;         // 指向前驅struct DulNode *next;        // 指向后繼
} DulNode, *DuLinkList;

? 注意:原始代碼中 sturct 拼寫錯誤,已修正為 struct


棧(Stack)

定義

限定僅在表尾進行插入和刪除操作的線性表,遵循 “先進后出”(LIFO) 原則。

核心概念
  • 棧頂:允許操作的一端(插入/刪除)
  • 棧底:不允許操作的一端
  • 基本操作
    • 入棧(Push)
    • 出棧(Pop)
    • 獲取棧頂元素(GetTop)
分類
  • 順序棧(數組實現)
  • 鏈式棧(鏈表實現)
    在這里插入圖片描述
鏈式棧結構定義(LinkStack.h
#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_typedef struct {char name[50];char sex;int age;int score;
} DATATYPE;typedef struct _linkstacknode {DATATYPE data;struct _linkstacknode *next;
} LinkStackNode;typedef struct {LinkStackNode* top;   // 棧頂指針int clen;             // 元素個數
} LinkStack;// 函數聲明
LinkStack* CreateLinkStack();
int PushLinkStack(LinkStack* ls, DATATYPE* data);
int PopLinkStack(LinkStack* ls);
DATATYPE* GetTopLinkStack(LinkStack* ls);
int IsEmptyLinkStack(LinkStack* ls);
int GetSizeLinkStack(LinkStack* ls);
int DestroyLinkStack(LinkStack* ls);#endif

鏈式棧實現(LinkStack.c
#include "LinkStack.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>LinkStack* CreateLinkStack() {LinkStack* ls = malloc(sizeof(LinkStack));if (!ls) {perror("CreateLinkStack malloc error");return NULL;}ls->top = NULL;ls->clen = 0;return ls;
}int PushLinkStack(LinkStack* ls, DATATYPE* data) {LinkStackNode* newnode = malloc(sizeof(LinkStackNode));if (!newnode) {perror("PushLinkStack malloc error");return 1;}memcpy(&newnode->data, data, sizeof(DATATYPE));newnode->next = ls->top;ls->top = newnode;ls->clen++;return 0;
}int PopLinkStack(LinkStack* ls) {if (IsEmptyLinkStack(ls)) {printf("linkstack is empty\n");return 1;}LinkStackNode* tmp = ls->top;ls->top = ls->top->next;free(tmp);ls->clen--;return 0;
}DATATYPE* GetTopLinkStack(LinkStack* ls) {if (IsEmptyLinkStack(ls)) return NULL;return &ls->top->data;
}int IsEmptyLinkStack(LinkStack* ls) {return 0 == ls->clen;
}int GetSizeLinkStack(LinkStack* ls) {return ls->clen;
}int DestroyLinkStack(LinkStack* ls) {while (!IsEmptyLinkStack(ls)) {PopLinkStack(ls);}free(ls);return 0;
}

測試程序(test_stack.c
#include <stdio.h>
#include "LinkStack.h"int main() {LinkStack* ls = CreateLinkStack();DATATYPE data[] = {{"zhangsan", 'm', 20, 80},{"lisi", 'f', 23, 84},{"wangmaizi", 'f', 32, 90},{"guanerge", 'm', 50, 91},{"liubei", 'm', 51, 92}};for (int i = 0; i < 5; i++) {PushLinkStack(ls, &data[i]);}printf("出棧順序(LIFO):\n");while (!IsEmptyLinkStack(ls)) {DATATYPE* tmp = GetTopLinkStack(ls);printf("name:%s score:%d\n", tmp->name, tmp->score);PopLinkStack(ls);}DestroyLinkStack(ls);return 0;
}

? 理想運行結果

出棧順序(LIFO):
name:liubei score:92
name:guanerge score:91
name:wangmaizi score:90
name:lisi score:84
name:zhangsan score:80

使用棧實現 C 源文件符號匹配

原理
  • 遇到 ([{ 入棧
  • 遇到 )]} 檢查棧頂是否匹配,匹配則出棧,否則報錯
  • 文件結束時棧應為空,否則有未閉合符號
實現代碼(check_brackets.c
#include <stdio.h>
#include <string.h>
#include "LinkStack.h"// 記錄符號位置的結構
typedef struct {char c;int row;int col;
} SymData;int do_check(char* linebuf, LinkStack* ls, int num) {char* tmp = linebuf;SymData data = {0};SymData* top = NULL;int col = 1;while (*tmp) {switch (*tmp) {case '(':case '[':case '{':data.c = *tmp;data.row = num;data.col = col;PushLinkStack(ls, (DATATYPE*)&data);break;case ')':top = (SymData*)GetTopLinkStack(ls);if (!top || top->c != '(') {printf("括號不匹配: ) at row %d col %d\n", num, col);return 1;}PopLinkStack(ls);break;case ']':top = (SymData*)GetTopLinkStack(ls);if (!top || top->c != '[') {printf("括號不匹配: ] at row %d col %d\n", num, col);return 1;}PopLinkStack(ls);break;case '}':top = (SymData*)GetTopLinkStack(ls);if (!top || top->c != '{') {printf("括號不匹配: } at row %d col %d\n", num, col);return 1;}PopLinkStack(ls);break;}tmp++;col++;}return 0;
}int main() {LinkStack* ls = CreateLinkStack();FILE* fp = fopen("/home/linux/2.c", "r");if (!fp) {printf("fopen error\n");return 1;}int num = 1;char buf[1024];while (fgets(buf, sizeof(buf), fp)) {if (do_check(buf, ls, num)) {fclose(fp);DestroyLinkStack(ls);return 1;}num++;}if (IsEmptyLinkStack(ls)) {printf("? 所有括號匹配成功!\n");} else {SymData* top = (SymData*)GetTopLinkStack(ls);printf("? 存在未閉合符號: %c at row %d col %d\n", top->c, top->row, top->col);}fclose(fp);DestroyLinkStack(ls);return 0;
}

? 理想運行結果

  • 若括號全部匹配:輸出 ? 所有括號匹配成功!
  • 若有不匹配:輸出具體錯誤位置
  • 支持跨行匹配

棧的核心要點總結

  • 本質:受限制的線性表,僅允許在一端進行操作
  • 操作特性:先進后出(LIFO)
  • 兩端定義
    • 棧頂:可進行插入/刪除
    • 棧底:固定,不可操作
  • 主要作用
    • 遞歸調用管理
    • 表達式求值
    • 回溯算法
    • 符號匹配檢查
  • 基本操作
    • 入棧(Push)
    • 出棧(Pop)
    • 獲取棧頂(GetTop)

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

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

相關文章

JupyterLab 安裝(python3.10)

目錄 一、環境 二、安裝 三、啟動Jupyterlab 四、通過chrome瀏覽器進行訪問 五、打開Jupyter Notebook 六、pandas驗證 JupyterLab 是一個基于 Web 的交互式開發環境&#xff0c;是經典 Jupyter Notebook 的下一代版本。它支持多種編程語言&#xff08;如 Python、R、Juli…

【neo4j】安裝使用教程

一、安裝 1.0 前置條件 安裝配置好jdk17及以上 注意我使用的是neo4j 5.26.10版本&#xff0c;匹配java17剛好 Java Archive Downloads - Java SE 17.0.12 and earlier 無腦安裝即可 配置以下環境變量 1.1 安裝程序 Neo4j Deployment Center - Graph Database & Anal…

AECS(國標ECALL GB 45672-2025)

車載緊急呼叫功能作為車輛遇險時的響應機制&#xff0c;為司機和乘客的安全營救提供通信支持。為了能夠降低通信延遲&#xff0c;提高響應速度&#xff0c;基于4G/5G的下一代緊急呼叫技術&#xff08;NG eCall&#xff09;將在歐盟于2027年起成為強制標準&#xff0c;中國也已經…

week3-[循環嵌套]好數

week3-[循環嵌套]好數 題目描述 如果一個正整數 xxx 只有最左邊一位不是 000&#xff0c;其余都是 000&#xff0c;那么稱其為好數。例如 400040004000 和 222 都是好數&#xff0c;但是 120120120 不是。 給定正整數 nnn&#xff0c;在 111 到 nnn 間有多少個數是好數&#xf…

智能制造加速器:某新能源車智慧工廠無線網絡優化提升方案

隨著工業4.0和智能制造的快速發展&#xff0c;傳統制造工廠的網絡架構正面臨前所未有的挑戰。為了滿足柔性生產、實時數據驅動以及高可靠運營的需求&#xff0c;某新能源車智慧工廠啟動了一項無線網絡優化提升項目。本項目通過部署智能組網設備&#xff0c;構建高效、穩定、智能…

nginx-自制證書實現

nginx-自制證書實現一、 確認nginx是支持https功能的二、生成私鑰三、 根據ca.key生成nginx web服務器使用的證書簽名請求文件nginx.csr四、使用ca.key給nginx.csr進行簽名&#xff0c;生成公鑰證書nginx.crt五、將證書與域名綁定六、添加域名解析并訪問一、 確認nginx是支持ht…

FreeRTOS,事件標注組創建,xEventGroupCreate、xEventGroupCreateStatic

1. xEventGroupCreate ()&#xff1a;動態創建&#xff08;臨時借內存&#xff09; 作用&#xff1a; 向系統&#xff08;FreeRTOS 的堆內存&#xff09;“臨時申請” 一塊內存來存放事件組&#xff0c;不需要我們自己提前準備內存。 例子&#xff08;基于你的代碼修改&#xf…

Linux網絡socket套接字(上)

目錄 前言 1.Socket編程準備 1.理解源IP地址和目的IP地址 2.認識端口號 3.socket源來 4.傳輸層的典型代表 5.網絡字節序 6.socket編程接口 2.Socket編程UDP 1.服務端創建套接字 2.服務端綁定 3.運行服務器 4.客戶端訪問服務器 5.測試 6.補充參考內容 總結 前言…

RK android14 Setting一級菜單IR遙控器無法聚焦問題解決方法

文章目錄 前言 一、問題分析 1.1. 布局文件分析 1.2. Java代碼 二、解決方法 2.1.移除沖突的滾動標志 2.2.解決有問題的初始化調用 2.3.完整補丁 前言 在Android系統Settings應用(packages/apps/Settings)的首頁(SettingsHomepageActivity)中,存在一個 accessibility (無…

iOS 手勢與控件事件沖突解決清單

總結一份「iOS 手勢與控件事件沖突解決清單」&#xff0c;以后你遇到 UIButton / UITableView / UIScrollView 被手勢攔截就能快速排查了&#xff1a;&#x1f4cc; iOS 手勢與控件事件沖突常見解決辦法1?? cancelsTouchesInView&#x1f449; 最常用&#xff0c;決定手勢識別…

筆試——Day45

文章目錄第一題題目思路代碼第二題題目思路代碼第三題題目思路代碼第一題 題目 kanan和高音 思路 雙指針遍歷數組&#xff0c;更新左右端點并計算最大值 代碼 #include<iostream> #include<vector> using namespace std;int main() {int n; cin >> n;vect…

nnDetection網絡結構分析

基于 RetinaNet 框架擴展&#xff0c;核心用于處理 3D 體積數據&#xff08;如醫學影像 CT/MRI&#xff09;&#xff0c;通過 “Encoder-Decoder-Head” 架構實現多任務學習。以下從整體框架、核心模塊細節、技術特點、應用場景四個維度展開分析。一、整體框架概覽首先通過表格…

Torch -- 卷積學習day4 -- 完整項目流程

完整項目流程總結1. 環境準備與依賴導入import time import os import numpy as np import pandas as pd import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torch.utils.data import Dat…

MTK Linux DRM分析(七)- KMS drm_plane.c

一、簡介在 Linux DRM&#xff08;Direct Rendering Manager&#xff09;子系統中&#xff0c;Plane&#xff08;平面&#xff09;代表了一個圖像源&#xff0c;可以在掃描輸出過程中與 CRTC 混合或疊加顯示。每個 Plane 從 drm_framebuffer 中獲取輸入數據&#xff0c;并負責圖…

OpenHarmony之 藍牙子系統全棧剖析:從協議棧到芯片適配的端到端實踐(大合集)

1. 系統架構概述 OpenHarmony藍牙系統采用分層架構設計&#xff0c;基于HDF&#xff08;Hardware Driver Foundation&#xff09;驅動框架和系統能力管理&#xff08;System Ability&#xff09;機制實現。 1.1 架構層次 ┌─────────────────────────…

探索 Ultralytics YOLOv8標記圖片

1、下載YOLOv8模型文件 下載地址&#xff1a;https://docs.ultralytics.com/zh/models/yolov8/#performance-metrics 2、編寫python腳本 aaa.py import cv2 import numpy as np from ultralytics import YOLO import matplotlib.pyplot as pltdef plot_detection(image, box…

Matplotlib數據可視化實戰:Matplotlib子圖布局與管理入門

Matplotlib多子圖布局實戰 學習目標 通過本課程的學習&#xff0c;學員將掌握如何在Matplotlib中創建和管理多個子圖&#xff0c;了解子圖布局的基本原理和調整方法&#xff0c;能夠有效地展示多個數據集&#xff0c;提升數據可視化的效果。 相關知識點 Matplotlib子圖 學習內容…

【python實用小腳本-194】Python一鍵給PDF加水印:輸入文字秒出防偽文件——再也不用開Photoshop

Python一鍵給PDF加水印&#xff1a;輸入文字秒出防偽文件——再也不用開Photoshop PDF加水印, 本地腳本, 零會員費, 防偽標記, 瑞士軍刀 故事開場&#xff1a;一把瑞士軍刀救了投標的你 周五下午&#xff0c;你把 100 頁標書 PDF 發給客戶&#xff0c;卻擔心被同行盜用。 想加水…

開源 C++ QT Widget 開發(四)文件--二進制文件查看編輯

文章的目的為了記錄使用C 進行QT Widget 開發學習的經歷。臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 C QT Widget 開發&#xff08;一&#xff09;工程文件結構-CSDN博客 開源 C…

【密碼學實戰】X86、ARM、RISC-V 全量指令集與密碼加速技術全景解析

前言 CPU 指令集是硬件與軟件交互的核心橋梁&#xff0c;其設計直接決定計算系統的性能邊界與應用場景。在數字化時代&#xff0c;信息安全依賴密碼算法的高效實現&#xff0c;而指令集擴展則成為密碼加速的 “隱形引擎”—— 從服務器端的高吞吐量加密&#xff0c;到移動端的…