C語言—再學習(結構體)

一、建立結構體

用戶自己建立由不同類型數據組成的組合型的數據結構,它稱為結構體。

struct Student 
{  int num;       //學號char name[20]; //名字為字符串char sex;       //性別int age;         //年紀float score;     //分數char addr[30];   地址為字符串
};   //注意最后有分號

可以看到先是指定一個結構體類型? struct Student (struct 是聲明, 結構體類型時候必須壓迫使用的關鍵字,不能省略!!!!),它向編譯系統聲明:這是一個“結構體類型”,它包括num,name,sex,age,score,addr等不同類型成員。

所以一般形式為:

struct 結構體名

{

?成員列表

} ;? ? ? ? ? ? //別忘了分號

花括號里的成員列表:? 類型名? 成員名;

二、定義一個結構體變量

開頭聲明的Student 結構體,可以用它來定義變量。?

1.先聲明結構體,再定義變量。

例如:? struct Student? student1 , student2;

這樣student1和student2就具有和Student類型的結構了。

2.在聲明類型的同時定義變量

struct Student 
{  int num;       //學號char name[20]; //名字為字符串char sex;       //性別int age;         //年紀float score;     //分數char addr[30];   地址為字符串
}student1,student2;

引用結構體變量:?student1.age=23;

三、結構體數組

例題:有三個候選人,每個選民只能投票一個人,要求編寫一個統計選票程序,先輸入被選人的名字,最后輸出各人得票結果。

#include <stdio.h>
#include <string.h>struct Person{       // 聲明結構體類型char name[20];   //候選人姓名int count;        //候選人得票數
}leader[3] = {"Li",0,"Zhang",0,"Sun",0};   //定義結構體數組并且初始化int main(){int i,j;char leader_name[20];      //定義字符數組for(i=1;i<=10;i++){scanf("%s",leader_name);  //輸入所選的候選人姓名for(j=0;j<3;j++){if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}   //strcmp 是比較字符串的意思,字符串不相等則輸出0}printf("\nResult:\n");for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);return 0;
}

結果:

Li
Zhang
Sun
Zhang
Li
Zhang
Sun
Zhang
Li
ZhangResult:Li:3
Zhang:5Sun:2

?首先定義了一個全局的結構體數組leader,它有三個元素,每個元素包含兩個成員name和count。

再定義數組時使之初始化,將“Li”賦給leader[0].name , 0賦給leader[0].count,"Zhang"賦給leader[1].name , 0賦給leader[1].count。......這三個候選人的票數全部先置0。

所以定義結構體數組的一般形式為:

struct 結構體名{
成員列表
}數組名[數組長度]//還可以:結構體類型  數組名[數組長度];struct Person leader[3];

四、結構體指針

1.指向結構體變量的指針

例題:通過指向結構體變量的指針變量輸出結構體變量中成員的信息。

#include <stdio.h>
#include <string.h>int main(){struct Student{long num;char name[20];char sex;float score;}; struct Student stu_1;   //定義struct Student類型變量stu_1 struct Student *p;      //定義指向struct Student類型數據的指針變量p p = &stu_1;             //p指向stu_1 stu_1.num = 10101;     //對結構體變量的成員賦值 strcpy(stu_1.name,"Li Lin");  //用字符串賦值函數給stu_1.name賦值 stu_1.sex= 'M';stu_1.score = 89.5;printf("No.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score) ;printf("\nNo.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",(*p).num,(*p).name,(*p).sex,(*p).score) ;return 0;
} 

結果:

No.:10101
name:Li Lin
sex:M
score: 89.5

No.:10101
name:Li Lin
sex:M
score: 89.5

分析:將結構體變量stu_1的起始地址賦給指針變量p,也就是使p指向stu_1,然后對stu_1的各個成員賦值。

??:為了方便,(*p).num? 可以用p->num 代替

2.指向結構體數組的指針

例題:有三個學生的信息,放在結構體數組里,要求輸出全部學生的信息。

#include <stdio.h>struct Student{int num;char name[20];char sex;int age;
};
struct Student stu[3]={
{10101,"Li Lin",'M',18},{10102,"Zhang Fang",'M',19},{10104,"Wang Min",'F',20}
};
int main(){
struct Student *p;
printf(" No.  Name                 sex  age\n");
for(p=stu;p<stu+3;p++)printf("%5d %-20s %2c %4d\n",p->num,p->name,p->sex,p->age)	;return 0;
}

結果:

 No.  Name                 sex  age
10101 Li Lin                M   18
10102 Zhang Fang            M   19
10104 Wang Min              F   20

分析:在for循環里面,首先條件是先讓p=stu,也就是stu中序號為0的元素的起始地址,第一次循環輸出stu[0]的各個成員的置。然后執行p++,使p自加1。此時p的值就等于stu+1。指向了stu[1]了。

五、用指針處理鏈表

1.什么是鏈表?

一種線性數據結構,它由一系列節點(Node)組成,這些節點通過指針(或引用)連接成一個鏈條。與數組不同,鏈表的節點在內存中不需要連續存儲,數據的邏輯順序通過節點之間的指針來維持。

鏈表有一個”頭指針“變量,圖中是head表示,它存放著一個地址,該地址指向一個元素。鏈表中每個元素稱為”節點“。可以看到head指向第一個元素,第一個元素有指向第二個元素......直到最后一個元素,該元素不在指向其它元素,它稱為”表尾“,它的地址部分放一個“NULL”,表示空地址,鏈表到此結束。

節點至少包含兩部分:

數據域:存儲具體的數據值(如整數、字符串等)。

指針域:存儲下一個節點的內存地址(或引用),用于連接節點。

??:鏈表中各個元素的地址可以不連續,要找到某個元素,必須找到上一個元素,根據它提供的下一個元素地址才能找到下一個元素。如果不提供“頭指針”則整個鏈表都無法訪問。鏈表如同一條鐵鏈一樣。一環扣一環,中間無法斷開。

打個比方:幼兒園老師帶領孩子出來散步,老師牽著第一個孩子的手,第一個孩子牽著第二個孩子的手,......,最后一個孩子有一只手是空的,他是鏈尾。

2.建立簡單的靜態鏈表

例題:建立一個簡單的靜態鏈表,它由3個學生數據的節點組成,要求輸出個節點中的數據

#include <stdio.h>// 定義學生結構體
struct Student {int num;         // 學號float score;     // 分數struct Student *next;  // 指向下一個節點的指針
};int main() {// 定義三個學生節點并初始化數據struct Student s1 = {101, 85.5, NULL};struct Student s2 = {102, 90.0, NULL};struct Student s3 = {103, 78.2, NULL};// 建立鏈表連接關系s1.next = &s2;s2.next = &s3;s3.next = NULL;  // 尾節點指針置為NULL// 定義指針指向頭節點struct Student *ptr = &s1;// 使用do-while循環遍歷鏈表并輸出數據do {printf("學號: %d, 分數: %.1f\n", ptr->num, ptr->score);ptr = ptr->next;  // 移動到下一個節點} while (ptr != NULL);  // 當指針不為NULL時繼續循環return 0;
}

輸出結果:

學號: 101, 分數: 85.5
學號: 102, 分數: 90.0
學號: 103, 分數: 78.2

所有節點都是在程序中定義的,不是臨時開辟的,也不能用完之后釋放,這種鏈表稱為“靜態鏈表”

??:還有很多關于鏈表的東西,待等到RTOS部分再學習

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

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

相關文章

【前端基礎】10、CSS的偽元素(::first-line、::first-letter、::before、::after)【注:極簡描述】

一、偽元素的作用 選取某個特定的元素。 二、::first-line、::first-letter ::first-line&#xff1a;針對首行文本設置屬性 ::first-letter&#xff1a;針對首字母設置屬性 三、::before、::after 在一個元素之前&#xff08;::before&#xff09;或者之后&#xff08;…

系統漏洞掃描服務:維護網絡安全的關鍵與服務原理?

系統漏洞掃描服務是維護網絡安全的關鍵措施&#xff0c;能夠迅速發現系統中的潛在風險&#xff0c;有效預防可能的風險和損失。面對網絡攻擊手段的日益復雜化&#xff0c;這一服務的重要性日益顯著。 服務原理 系統漏洞掃描服務猶如一名恪盡職守的安全守護者。它運用各類掃描…

從 Excel 到 Data.olllo:數據分析師的提效之路

背景&#xff1a;Excel 的能力邊界 對許多數據分析師而言&#xff0c;Excel 是入門數據處理的第一工具。然而&#xff0c;隨著業務數據量的增長&#xff0c;Excel 的一些固有限制逐漸顯現&#xff1a; 操作容易出錯&#xff0c;難以審計&#xff1b; 打開或操作百萬行數據時&…

框架的源碼理解——V3中的ref和reactive

最近在研究各個框架的源碼&#xff0c;從源碼角度去理解 vue3 的 reactive 和 ref API&#xff0c;記錄下研究的成果 reactive 首先&#xff0c;reactive() 的參數必須是一個對象&#xff0c;返回值是一個 Proxy 對象&#xff0c;具有響應性。如果參數不是對象類型&#xff0…

能源數字化轉型關鍵引擎:Profinet轉Modbus TCP網關驅動設備協同升級

在工業自動化的世界中&#xff0c;ModbusTCP和Profinet是兩個非常重要的通訊協議。ModbusTCP以其開放性和易用性&#xff0c;被廣泛應用于各種工業設備中&#xff1b;而Profinet則以其高效性和實時性&#xff0c;成為了眾多高端設備的首選。然而&#xff0c;由于這兩種協議的差…

【ant design】ant-design-vue 4.0實現主題色切換

官網&#xff1a;Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 我圖方便&#xff0c;直接在 app.vue 中加入的 <div class"app-content" v-bind:class"appOption.appContentClass"><a-config-provider…

一個指令,讓任意 AI 快速生成思維導圖

大家好&#xff0c;我是安仔&#xff0c;一個每天都在壓榨 AI 的躺平打工人。 今天分享一個 AI 辦公小技巧&#xff0c;讓你用一個指令讓 AI 生成思維導圖。 DeepSeek、Kimi、豆包都可以哈 &#xff5e; KimiXMind 安仔經常用 XMind 來繪制思維導圖&#xff0c;但是 AI 是沒…

便捷的批量打印工具推薦

軟件介紹 本文介紹的軟件是一款批量打印軟件&#xff0c;名為PrintConductor。 軟件功能強大 這款批量打印軟件功能極為強大&#xff0c;它不僅能夠批量打印各種不同格式的文件&#xff0c;還可以直接打印整個文件夾。 初次使用設置 第一次打開這款軟件時&#xff0c;要記…

USRP 射頻信號 采集 回放 系統

USRP 射頻信號采集回放系統 也可以叫做&#xff1a; 利用寬帶RF錄制和回放系統實現6G技術研究超寬帶射頻信號采集回放系統使用NI USRP平臺實現射頻信號錄制和回放操作演示USRP也能實現多通道寬帶信號流盤回放了&#xff01; 對于最簡單的實現方法就是使用LabVIEW進行實現 采…

MFC 調用海康相機進行軟觸發

初始化相機類文件 #pragma once #include "MvCameraControl.h" class CMvCamera { public:CMvCamera();~CMvCamera();//初始化相機int InitCamera();int SaveCurrentImage(CString filePath);//關閉相機void CloseCamera();//設置int SetEnumValue(IN const char* s…

虛擬主播肖像權保護,數字時代的法律博弈

首席數據官高鵬律師團隊 在虛擬主播行業蓬勃發展的表象之下&#xff0c;潛藏著一場關乎法律邊界的隱形戰爭。當一位虛擬偶像的3D模型被非法拆解、面部數據被批量復制&#xff0c;運營方驚訝地發現——傳統的肖像權保護體系&#xff0c;竟難以完全覆蓋這具由代碼與數據構成的“…

ArrayList-集合使用

自動擴容&#xff0c;集合的長度可以變化&#xff0c;而數組長度不變&#xff0c;集合更加靈活。 集合只能存引用數據類型&#xff0c;不能直接存基本數據類型&#xff0c;除非包裝 ArrayList會拿[]展示數據

鴻蒙ArkUI體驗:Hexo博客客戶端開發心得

最近部門也在跟進鴻蒙平臺的業務開發&#xff0c;自己主要是做 Android 開發&#xff0c;主要使用 Kotlin/Java 語言。&#xff0c;需要對新的開發平臺和開發模式進行學習&#xff0c;在業余時間開了個項目練手&#xff0c;做了個基于 Hexo 博客內容開發的App。鴻蒙主要使用Ark…

【和春筍一起學C++】(十四)指針與const

將const用于指針&#xff0c;有兩種情況&#xff1a; const int *pt; int * const pt; 目錄 1. const int *pt 2. int * const pt 3. 擴展 1. const int *pt 首先看第一種情況&#xff0c;const在int的前面&#xff0c;有如下語句&#xff1a; int peoples12&#xff1…

本地緩存更新方案探索

文章目錄 本地緩存更新方案探索1 背景2 方案探索2.1 初始化2.2 實時更新2.2.1 長輪詢2.2.1.1 client2.2.2.2 server 本地緩存更新方案探索 1 背景 大家在工作中是否遇到過某些業務數據需要頻繁使用&#xff0c;但是數據量不大的情況&#xff0c;一般就是幾十條甚至幾百條這種…

深入理解 requestIdleCallback:瀏覽器空閑時段的性能優化利器

requestIdleCallback 核心作用 requestIdleCallback 是瀏覽器提供的 API&#xff0c;用于將非關鍵任務延遲到瀏覽器空閑時段執行&#xff0c;避免阻塞用戶交互、動畫等關鍵任務&#xff0c;從而提升頁面性能體驗。 基本語法 const handle window.requestIdleCallback(callb…

51單片機——交通指示燈控制器設計

設計目標 1、設計一交通燈控制&#xff0c;控制東西方向的紅、黃、綠燈和南北方向的紅、黃、綠燈。 2、可手動控制和自動控制&#xff0c;設置兩個輸入控制開關。 手動/自動開關&#xff0c;通過P11的按鍵輸入控制 3、手動&#xff1a;設置開關P11&#xff0c;兩種情況&#x…

神經網絡語言模型(前饋神經網絡語言模型)

神經網絡語言模型 什么是神經網絡&#xff1f;神經網絡的基本結構是什么&#xff1f;輸入層隱藏層輸出層 神經網絡為什么能解決問題&#xff1f;通用近似定理為什么需要權重和偏置&#xff1f;為什么需要激活函數&#xff1f;權重是如何確定的&#xff1f;1. 窮舉2. 反向傳播主…

信息系統項目管理師高級-軟考高項案例分析備考指南(2023年案例分析)

個人筆記整理---僅供參考 計算題 案例分析里的計算題就是進度、掙值分析、預測技術。主要考査的知識點有:找關鍵路徑、求總工期、自由時差、總時差、進度壓縮資源平滑、掙值計算、預測計算。計算題是一定要拿下的&#xff0c;做計算題要保持頭腦清晰&#xff0c;認真讀題把PV、…

unordered_map和unordered的介紹和使用

目錄 unordered系列關聯式容器 unordered_map unordered_map的接口說明 unordered_map的定義方式 unordered_map接口的使用 unordered_map的容量 unordered_map的迭代器 unordered_map的元素訪問 unordered_map的查詢 unordered_map的修改操作 unordered_multimap u…