數據結構(三)雙向鏈表

一、什么是 make 工具?

make 是一個自動化構建工具,主要用于管理 C/C++ 項目的編譯和鏈接過程。它通過讀取 Makefile 文件中定義的規則,自動判斷哪些文件被修改,并僅重新編譯這些部分,從而大幅提高構建效率。


二、什么是 Makefile?

Makefilemake 工具的配置文件,它以純文本形式存在,主要用于描述:

  • 構建目標(如:最終生成的可執行文件)

  • 依賴關系(如:源代碼、頭文件)

  • 構建命令(如:gcc 編譯命令)

通過 Makefile,我們可以實現對大型項目的自動化編譯管理。


三、Makefile 的基本語法

1. 基本格式

目標文件: 依賴文件列表 命令(以Tab鍵開頭)

注意:命令必須以 Tab 縮進,否則 make 會報錯。

示例:

a.out: main.c fun.c

? ? gcc main.c fun.c -o a.out -I$(INC) -L$(LIB)

  • 目標文件:a.out(最終生成的可執行文件)

  • 依賴文件:main.c、fun.c

  • 命令:gcc 編譯命令,帶有頭文件和庫路徑參數


四、常用編譯參數說明

  • -I$(INC):指定頭文件目錄(如 include/

  • -L$(LIB):指定庫文件目錄(如 lib/

  • -o:指定輸出文件名稱


五、Makefile 中的變量使用

1. 自定義變量

CC = gcc

TARGET = app

SRC = main.c fun.c

INC = ./include

LIB = ./lib

引用變量方式:$(變量名

$(TARGET): $(SRC)

? ? $(CC) $(SRC) -o $(TARGET) -I$(INC) -L$(LIB)

2. 系統自動變量

  • $@:表示當前規則的目標文件

  • $^:所有依賴文件(去重)

  • $<:第一個依賴文件

示例:

app: main.c fun.c tool.c gcc $^ -o $@

等價于:

gcc main.c fun.c tool.c -o app


六、make 的時間戳機制

make 會對比文件的時間戳來判斷是否需要重新編譯:

  • 若依賴文件比目標文件更新 → 執行構建命令

  • 否則跳過(顯示 make: 'xxx' is up to date.

這種機制確保了編譯效率,尤其適合大型項目。


七、GCC 編譯的四個階段

  1. 預處理(Preprocessing)
    處理 #include#define 等預處理指令,生成 .i 文件:

    gcc -E main.c -o main.i

  2. 編譯(Compilation)
    .i 轉為匯編 .s 文件:

    gcc -S main.i -o main.s

  3. 匯編(Assembly)
    .s 文件生成 .o 目標文件:

    gcc -c main.s -o main.o

  4. 鏈接(Linking)
    將多個 .o 文件和庫鏈接為可執行程序:

    gcc main.o fun.o -o app


八、Makefile 示例(推薦寫法)

# 定義變量  
CC = gcc  
CFLAGS = -I./include -Wall  # 編譯選項:指定頭文件目錄 + 顯示警告  
LDFLAGS = -L./lib -lm       # 鏈接選項:指定庫目錄 + 鏈接數學庫  
TARGET = app  
SRCS = main.c fun.c  
OBJS = $(SRCS:.c=.o)        # 將 .c 文件轉換為 .o 文件(如 main.c → main.o)  # 默認目標(第一個目標為默認)  
all: $(TARGET)  # 生成可執行文件  
$(TARGET): $(OBJS)  $(CC) $(OBJS) -o $@ $(LDFLAGS)  # 生成目標文件(.o)  
%.o: %.c                    # 模式規則:所有 .o 依賴對應的 .c  $(CC) -c $< -o $@ $(CFLAGS)  # 清理編譯產物  
clean:  rm -f $(OBJS) $(TARGET)  

使用方法

  • 編譯項目:make(默認執行?all?目標)
  • 清理文件:make clean
  • 重新編譯:make clean && make

九、Makefile 使用方法

操作命令
編譯項目make(默認執行 all)
清理項目make clean
重新編譯make clean && make

十、雙線鏈表基礎語法

頭文件

#ifndef _SIZEOF_DOUBLE_
#define _SIZEOF_DOUBLE_typedef struct stu
{int id;char name[32];int score;
}Data_type;typedef struct dounode
{Data_type data;struct dounode *ppre;struct dounode *pnext;
}DNode;typedef struct doulink
{DNode *phead;int clen;
}Dlink;extern Dlink *creatDoulink();
extern int IsEmptyDouLink(Dlink *pdlink);
extern int insertHeadDouLink(Dlink *pdlink, Data_type data);
extern void printDouLink(Dlink *pdlink, int dir);
extern int insertTailDouLink(Dlink *pdlink, Data_type data);
extern int deleteHeadDouLink(Dlink *pdlink);
extern int deleteTailDouLink(Dlink *pdlink);
extern int DestroyDouLink(Dlink *pdlink);extern DNode *findNameDouLink(Dlink *pdlink, char *s);extern int modifyScoreByName(Dlink *pdlink, char *s, int Score);
extern int deleteNodeByName(Dlink *pdlink, char *s);
#endif

定義函數

#include "doulink.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>Dlink *creatDoulink()
{Dlink *pdlink = malloc(sizeof(Dlink));if (NULL == pdlink){printf("malloc error\n");return NULL;}pdlink->phead = NULL;pdlink->clen = 0;return pdlink;
}int IsEmptyDouLink(Dlink *pdlink)
{return NULL == pdlink->phead;
}int insertHeadDouLink(Dlink *pdlink, Data_type data)
{DNode *pnode = malloc(sizeof(DNode));if(NULL == pnode){printf("malloc error\n");return -1;}pnode->data = data;pnode->pnext = NULL;pnode->ppre = NULL;if(IsEmptyDouLink(pdlink)){pdlink->phead = pnode;}else{pnode->pnext = pdlink->phead;pdlink->phead->ppre = pnode;pdlink->phead = pnode; }pdlink->clen++;return 0;
}void printDouLink(Dlink *pdlink, int dir)
{if(IsEmptyDouLink(pdlink)){return ;}DNode *temp = pdlink->phead;if(dir){while(temp){printf("%d %s %d\n", temp->data.id, temp->data.name, temp->data.score);temp = temp->pnext;}}else{temp = pdlink->phead;while(temp->pnext){temp = temp->pnext;   }while(temp){printf("%d %s %d\n", temp->data.id, temp->data.name, temp->data.score);temp = temp->ppre;}}return ;
}int insertTailDouLink(Dlink *pdlink, Data_type data)
{if(IsEmptyDouLink(pdlink)){insertHeadDouLink(pdlink, data);return 1;}else{DNode *pnode = malloc(sizeof(DNode));if(NULL == pnode){printf("malloc error\n");return -1;}pnode->data = data;pnode->ppre = NULL;pnode->pnext = NULL;DNode *temp = pdlink->phead;while (temp->pnext){temp = temp->pnext;}pnode->ppre = temp;temp->pnext = pnode;pdlink->clen++;return 1;}
}int deleteHeadDouLink(Dlink *pdlink)
{if(IsEmptyDouLink(pdlink)){return -1;}if(pdlink->phead->pnext == NULL){free(pdlink->phead);pdlink->phead = NULL;pdlink->clen--;return 1;}else{DNode *temp = pdlink->phead->pnext;temp->ppre = NULL;free(pdlink->phead);pdlink->phead = temp;pdlink->clen--;return 1;}}int deleteTailDouLink(Dlink *pdlink)
{if(IsEmptyDouLink(pdlink)){return -1;}if(pdlink->phead->pnext == NULL){free(pdlink->phead);pdlink->phead = NULL;pdlink->clen--;return 1;}else{DNode *temp = pdlink->phead;while(temp->pnext){temp = temp->pnext;}temp->ppre->pnext = NULL;free(temp);pdlink->clen--;return 1;}
}int DestroyDouLink(Dlink *pdlink)
{DNode *temp = pdlink->phead;while(temp){pdlink->phead = temp->pnext;free(temp);temp = pdlink->phead;}free(pdlink);return 1;
}DNode *findNameDouLink(Dlink *pdlink, char *s)
{if(IsEmptyDouLink(pdlink)){return NULL;}DNode *temp = pdlink->phead;while(temp){if(strcmp(temp->data.name, s) == 0){return temp;}temp = temp->pnext;}return NULL;
}int modifyScoreByName(Dlink *pdlink, char *s, int Score)
{DNode *temp = findNameDouLink(pdlink, s);if(temp == NULL){return -1;}temp->data.score = Score;return 1;
}int deleteNodeByName(Dlink *pdlink, char *s)
{if(IsEmptyDouLink(pdlink)){return -1;}DNode *temp = findNameDouLink(pdlink, s);if(temp->ppre == NULL){deleteHeadDouLink(pdlink);return 1;}if(temp->pnext == NULL){deleteTailDouLink(pdlink);return 1;}temp->pnext->ppre = temp->ppre;temp->ppre->pnext = temp->pnext;free(temp);pdlink->clen--;return 1;  
}

主函數

#include "doulink.h"
#include<stdio.h>int main(int argc, char const *argv[])
{Data_type stus[5] = {{1, "zhangsan", 99},{2, "lisi", 100},{3, "wangwu", 90},{4, "maliu", 56},{5, "tianqi", 66},};Dlink *pdlink = creatDoulink();if(NULL == pdlink){return -1;}insertHeadDouLink(pdlink, stus[0]);insertHeadDouLink(pdlink, stus[1]);insertHeadDouLink(pdlink, stus[2]);insertHeadDouLink(pdlink, stus[3]);//   insertHeadDouLink(pdlink, stus[4]);printDouLink(pdlink, 1);// printDouLink(pdlink, 0);//   deleteHeadDouLink(pdlink);
//   deleteTailDouLink(pdlink);printf("----------find----------\n");//    insertTailDouLink(pdlink, stus[4]);//    printDouLink(pdlink, 1);DNode * temp = findNameDouLink(pdlink, "lisi");printf("%d %s %d\n", temp->data.id, temp->data.name, temp->data.score);printf("----------modify----------\n");modifyScoreByName(pdlink, "wangwu", 999);printDouLink(pdlink, 1);printf("----------deletes design----------\n");deleteNodeByName(pdlink, "zhangsan");printDouLink(pdlink, 1);DestroyDouLink(pdlink);return 0;
}

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

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

相關文章

如何在沒有iCloud的情況下將聯系人轉移到新iPhone?

升級到新 iPhone 后&#xff0c;設置已完成&#xff0c;想在不使用 iCloud 的情況下將聯系人從 iPhone 轉移到 iPhone 嗎&#xff1f;別擔心。還有其他 5 種方法可以幫助您輕松地將聯系人轉移到新 iPhone。這樣&#xff0c;您就無需再次重置新設備了。第 1 部分&#xff1a;如何…

SpringBoot3.x入門到精通系列:4.2 整合 Kafka 詳解

SpringBoot 3.x 整合 Kafka 詳解 &#x1f3af; Kafka簡介 Apache Kafka是一個分布式流處理平臺&#xff0c;主要用于構建實時數據管道和流應用程序。它具有高吞吐量、低延遲、可擴展性和容錯性等特點。 核心概念 Producer: 生產者&#xff0c;發送消息到Kafka集群Consumer: 消…

Android audio之 AudioDeviceInventory

1. 類介紹 AudioDeviceInventory 是 Android 音頻系統中的一個核心類,位于 frameworks/base/services/core/java/com/android/server/audio/ 路徑下。它負責 管理所有音頻設備的連接狀態,包括設備的添加、移除、狀態更新以及策略應用。 設備連接狀態管理:記錄所有已連接的音…

系統設計入門:成為更優秀的工程師

系統設計入門指南 動機 現在你可以學習如何設計大規模系統&#xff0c;為系統設計面試做準備。本指南包含的是一個有組織的資源集合&#xff0c;旨在幫助你了解如何構建可擴展的系統。 學習設計大規模系統 學習如何設計可擴展系統將幫助你成為更優秀的工程師。系統設計是一個…

Pandas數據分析工具基礎

文章目錄 0. 學習目標 1. Pandas的數據結構分析 1.1 Series - 序列 1.1.1 Series概念 1.1.2 Series類的構造方法 1.1.3 創建Series對象 1.1.3.1 基于列表創建Series對象 1.1.3.2 基于字典創建Series對象 1.1.4 獲取Series對象的數據 1.1.5 Series對象的運算 1.1.6 增刪Series對…

大模型——Qwen開源會寫中文的生圖模型Qwen-Image

Qwen開源會寫中文的生圖模型Qwen-Image 會寫中文,這基本上是開源圖片生成模型的獨一份了。 這次開源的Qwen-Image 的最大賣點是“像素級文字生成”。它能直接在像素空間內完成排版:從小字注腳到整版海報均可清晰呈現,且同時支持英文字母與漢字。 以下圖片均來自官網的生成…

大模型知識庫(1)京東云 JoyAgent介紹

一、核心定位? JoyAgent 是京東云推出的 ?首個 100% 開源的企業級多智能體平臺&#xff0c;定位為“可插拔的智能發動機”&#xff0c;旨在通過開箱即用的產品級能力&#xff0c;降低企業部署智能體的門檻。其特點包括&#xff1a; ?完整開源?&#xff1a;前端&#xff0…

PowerShell 入門2: 使用幫助系統

PowerShell 入門 2&#xff1a;使用幫助系統 &#x1f3af; 一、認識 PowerShell 幫助系統 1. 使用 Get-Help 查看命令說明 Get-Help Get-Service或使用別名&#xff1a; gsv2. 更新幫助系統 Update-Help3. 搜索包含關鍵詞的命令&#xff08;模糊搜索&#xff09; Help *log*&a…

hyper-v實戰系列:顯卡虛擬化(GPU分區)--windows篇詳解

一般來說&#xff0c;windows系統中最常使用的虛擬機就3個&#xff1a;vmware workstation&#xff0c;virtualbox和微軟系統自帶的hyper-v。后面與前兩者最大的區別就是能調用物理顯卡的性能。 我在這篇博文會詳述如何設置windows虛擬機的顯卡虛擬化&#xff0c;并會隨之…

WebGL應用實時云渲染改造后如何與網頁端實現數據通信

WebGL是一種基于OpenGL ES 2.0的Web技術&#xff0c;屬于BS架構&#xff0c;它允許在瀏覽器中渲染交互式3D和2D圖形。 隨著大場景高精度的開發要求深入&#xff0c;對于較高級的 WebGL 應用程序&#xff0c;需要性能更強的系統要求&#xff0c;如仍然維持低端硬件或瀏覽器&…

初始化列表,變量存儲區域和友元變量

前言初始化列表是書寫構造函數的一種方式&#xff0c;某些成員變量之只能通過初始化列表進行初始化。另外學習c不可避免地需要知道什么樣的變量存儲在什么區域當中如棧&#xff0c;堆&#xff0c;靜態區&#xff0c;常量區初始化列表書寫格式書寫上&#xff0c;初始化列表&…

excel插入復選框 親測有效

特別說明 1.開始位置是0 2.\u0052是勾選對號 3.\u25A1是不勾選 4.\u0052長度是1 5.\u25A1長度是1 6.漢字長度是1 7.起止位置不能超過索引位置(比如整體長度是6,截止位置最大填寫5) 示例代碼 package com.zycfc.xz.Util.excel;import org.apache.poi.hssf.usermodel.HSSFRichT…

Mac上優雅簡單地使用Git:從入門到高效工作流

Mac上優雅簡單地使用Git&#xff1a;從入門到高效工作流 本文將帶你解鎖在Mac上優雅使用Git的技巧&#xff0c;結合命令行與圖形工具&#xff0c;讓版本控制變得輕松高效&#xff01; 一、為什么Mac是Git的最佳搭檔&#xff1f; 天生支持Unix命令&#xff1a;Git基于Linux開發…

一文了解SOA的紋波

什么是光譜紋波我們在SOA/RSOA/SLD的ASE&#xff08;放大的自發輻射&#xff09;光譜測試中&#xff0c;經常會觀察到光譜中有周期性的變化&#xff0c;通常我們稱之為紋波。在實際應用中&#xff0c;我們大多不希望這些紋波的存在。添加圖片注釋&#xff0c;不超過 140 字&…

ossutil 使用方法

目錄 ossutil 使用方法 1. &#x1f4e4; 上傳文件/文件夾到 OSS 上傳單個文件&#xff1a; 上傳整個文件夾&#xff08;遞歸&#xff09;&#xff1a; 2. &#x1f4e5; 從 OSS 下載文件/文件夾 下載單個文件&#xff1a; 下載整個文件夾&#xff1a; ossutil 使用方法…

從“多、老、舊”到“4i煥新”:品牌官方商城(小程序/官網/APP···)的范式躍遷與增長再想象

全新升級版本「佛羅倫薩小鎮奧萊GO」商城正式上線&#xff01;會員福利加碼 2025年&#xff0c;品牌官方商城應該如何定義&#xff1f;—— 還是一套“電商貨架”&#xff1f; 在商派看來&#xff0c;現如今“品牌官方商城”則需要重新定義&#xff0c;結合不同品牌企業的業務…

WIN QT libsndfile庫編譯及使用

一、概述 libsndfile庫是一個用 C 語言編寫的開源庫&#xff0c;用于讀取和寫入多種音頻文件格式。 環境&#xff1a;QT5.9.9、cmakegui3.23.0、QT的編譯器是minWG32 二、安裝 1、下載libsndfile源碼&#xff0c;連接&#xff1a;https://github.com/libsndfile/libsndfile…

Supergateway教程

Supergateway 是一款專為 MCP&#xff08;Model Context Protocol&#xff09;服務器設計的遠程調試與集成工具&#xff0c;通過 SSE&#xff08;Server-Sent Events&#xff09;或 WebSocket&#xff08;WS&#xff09;協議實現基于 stdio 的服務器與客戶端的高效通信。 Super…

203.移除鏈表元素 707.設計鏈表 206.反轉鏈表

203.移除鏈表元素 Python鏈表節點定義&#xff1a; class ListNode:def __init__(self, val, nextNone):self.val valself.next next 性能分析 鏈表的特性和數組的特性進行一個對比&#xff0c;如圖所示&#xff1a; 203. 移除鏈表元素 這道題就是給大家一個鏈表&#x…

人工智能之數學基礎:利用全概率公式如何將復雜事件轉為簡單事件

本文重點 全概率公式是概率論中的核心工具,用于計算復雜事件的概率。其核心思想是將復雜事件分解為若干互斥且窮盡的簡單事件,通過計算各簡單事件的概率及其條件概率,最終求得目標事件的概率。 全概率公式 全概率公式就是將復雜事件簡單化,定義如下: 如果隨機事件A1,…