一据途、結(jié)構(gòu)體定義和初始化
#include <stdlib.h>
#include "string.h"
//什么是結(jié)構(gòu)體:一系列不同類型的數(shù)據(jù)的結(jié)合姐仅。
//強(qiáng)調(diào):類型巡社!=變量山橄。 結(jié)構(gòu)體名代表的只是結(jié)構(gòu)體類型怀各,沒有內(nèi)存空間频伤。
//結(jié)構(gòu)體中的成員可以單獨(dú)使用恳谎。
//1.定義一個全局結(jié)構(gòu)體
struct Student{
char name[20];
int age;
}Lucy = {"lucy",20}; //Lucy 結(jié)構(gòu)體的全局類型變量
//2.定義一個全局匿名的結(jié)構(gòu)體
struct {
char name[20];
int age;
int classId;
}stu3; //stu3 全局匿名結(jié)構(gòu)體的變量名
//3.鎖定結(jié)構(gòu)體的變量的數(shù)量
struct {
char name[20];
int age;
int classId;
}stu4,stu5;
int main(){
//初始化方式1
struct Student stul = {"lucy",20};
//初始化方式2
struct Student stu2;
strcpy(stu2.name,"lucy");
stul.age = 20;
//初始化方式3 見第一個定義處
printf("%s,%d \n",stu1.name,stu1.age);
system("pause");
return 0;
}
二、結(jié)構(gòu)體數(shù)組
//1.定義一個全局結(jié)構(gòu)體
struct Student{
char *name;
int age;
}Lucy ; //Lucy 結(jié)構(gòu)體的全局類型變量
int main(){
int i;
//1.定義結(jié)構(gòu)體數(shù)組并初始化(使用大括號將每個結(jié)構(gòu)體括起來)
struct Student stu[3] = { { "lucy", 30 }, { "lilei", 32 }, { "Hanmeimei", 35 } };
//2.定義結(jié)構(gòu)體數(shù)組并單個初始化
struct Student s[5];
for (i = 0; i < 5; i++){
s[i].age = 20 + i;
//strcpy(s[i].name, "lucy");
s[i].name = "lucy";
}
for (i = 0; i < 5;i++){
printf("s %d:%s,%d\n", i, s[i].name, s[i].age);
}
system("pause");
return 0;
}
三、結(jié)構(gòu)體指針
- 1.使用方式一:
struct Student{
char *name;
int age;
}Lucy ;
int main(){
//定義結(jié)構(gòu)體指針
struct Student stu[3] = { { "lucy", 30 }, { "lilei", 32 }, { "Hanmeimei", 35 } };
struct Student *stu = stu;
//以上定義等價于
//struct Student *stud;
//stud = stu;
system("pause");
return 0;
}
- 2.使用方式二:
#include "stdafx.h"
#include <stdlib.h>
#include "string.h"
//1.定義一個全局結(jié)構(gòu)體
struct Student{
char *name;
int age;
}Lucy ; //Lucy 結(jié)構(gòu)體的全局類型變量
int main(){
int i;
int a;
//定義結(jié)構(gòu)體指針
struct Student *stud;
stud = (Student *)malloc(sizeof(struct Student) * 4);//4個元素的結(jié)構(gòu)體數(shù)組
printf("%#x\n", stud); //地址
//初始化
//memset: 將這一片內(nèi)存 以stud為首地址的連續(xù)大小為 sizeof(struct Student) * 4 的內(nèi)存 全部賦值為0因痛。
memset(stud, 0, sizeof(struct Student) * 4);
//賦值:
for ( i = 0; i < 4; i++){
//用法一:
//(stud+i)->age = 20 + i; //首地址向后位移
//(stud + i)->name = "lucy";
//用法二:
stud[i].age = 20 + i;
stud[i].name = "lucy";
}
//打印
for ( a = 0; a < 4; a++){
printf("stud %d:%s,%d\n", a, (stud + a)->name, (stud + a)->age);
}
system("pause");
return 0;
}
- 3.結(jié)構(gòu)體中添加函數(shù)指針成員變量
#include <stdlib.h>
#include "string.h"
#include <Windows.h>
struct Man{
int age;
char *name;
int(*Msg)(char *, int);
};
int message(char * str, int age){
//彈出一個對話框 hello
MessageBox(0, TEXT("hello"), TEXT("hubin"), 0);
return 0;
}
int main(){
struct Man man;
man.age = 40;
man.name = "胡斌";
man.Msg = message;
man.Msg(man.name, man.age);
return 0;
}
- 4.結(jié)構(gòu)體中添加結(jié)構(gòu)體指針成員變量(java中的list集合原理:單列表數(shù)據(jù)結(jié)構(gòu))
#include <stdlib.h>
#include "string.h"
//單鏈表數(shù)據(jù)結(jié)構(gòu)
struct Node{
int data;
Node *next; //指向下一個指針
};
//在單列表的末尾添加一個數(shù)據(jù)
int enqueNode(Node *head, int data){
Node *node = (Node*)malloc(sizeof(Node));
if (node == NULL){ //如果沒有分配到空間婚苹,
return 0;
}
node->data = data;
node->next = NULL;
Node *p = head;
while (p->next != NULL){
p = p->next;
}
p->next = node;
return 1;
}
int main(){
int num = 10;
int i = 0;
Node * list; //定義指針變量
list = (Node *)malloc(sizeof(struct Node));//創(chuàng)建一個節(jié)點(diǎn)
//初始化數(shù)據(jù)
list->data = 0;
list->next = NULL;
for ( i = 0; i < num; i++){
enqueNode(list, i+1);
}
while (list->next != NULL){
printf("%d \n", list->data);
list = list->next; //指向下一個元素的地址
}
system("pause");
return 0;
}
四、typedef 指令(起別名)
typedef并沒有創(chuàng)建新的數(shù)據(jù)類型鸵膏,只是給現(xiàn)有類型創(chuàng)建了別名
-
1.定義別名
#include <stdlib.h> //將int 取了一個別名叫做 _in typedef int _in; //給char* 定義個別名叫string typedef char* string; //給函數(shù)指針定義 別名 typedef int(*PFI)(char *, char *); int fun(char *, char*){ return 0; } int main(){ _in a = 20; printf("%d\n", a); string str; str = "HelloWord"; char*ch; ch = "HelloWord"; PFI fp; fp = fun; system("pause"); return 0; }
2.二叉樹數(shù)據(jù)結(jié)構(gòu)(有了面向?qū)ο蟮男再|(zhì))
#include "stdafx.h"
#include <stdlib.h>
typedef Tnode* Treeptr;
//二叉樹的數(shù)據(jù)結(jié)構(gòu) 給Tnode取別名
typedef struct Tnode{
char *word;
int count;
//Tnode * left;
//Tnode * right;
//上面的代碼 用別名代替
Treeptr left;
Treeptr right;
}BinaryTreeNode;
int main(){
BinaryTreeNode * node;
node = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
system("pause");
return 0;
}
五膊升、公用體
#include "stdafx.h"
#include <stdlib.h>
//好處:用一個內(nèi)存單元來存儲多種類型 節(jié)約內(nèi)存空間
//將不同的數(shù)據(jù)類型融合到同一段內(nèi)存里面
union MyUnion{
//這三個類型的變量會存儲到同一段內(nèi)存里面
//size占用最大的字節(jié)數(shù)的成員所占用的內(nèi)存的大小 就是float的大小
int a;
char b;
float c;
};
int main(){
MyUnion unio;
printf("a:%#x,b:%#x,c:%#x\n", &unio.a, &unio.b, &unio.c);
//打印結(jié)果:(地址是同一個)
//a:0x18fa34,
//b:0x18fa34,
//c:0x18fa34
unio.a = 10;
unio.b = 'a';
unio.c = 1.2f;
printf("a: %d, b: %c, c: %f\n", unio.a, unio.b, unio.c);
//打印結(jié)果: a: 1067030938, b: ? c: 1.200000
//只能取到第一個值,使用的時候只能使用最近賦值的那個變量谭企。
system("pause");
return 0;
}
六廓译、枚舉
#include "stdafx.h"
#include <stdlib.h>
enum{
//默認(rèn)monday = 0, saturday =1债查, sunday =2.
//如果將第一個賦值為10非区,則后面的值會自動加一賦值 saturday = 11,sunday =12.
monday = 10,
saturday,
sunday,
};
int main(){
printf("monday:%d saturday:%d sunday:%d ", monday, saturday, sunday);
//打印結(jié)果:monday:10 saturday:11 sunday:12
system("pause");
return 0;
}
拓展:
實現(xiàn)一個雙向鏈表盹廷,存儲的是隨機(jī)數(shù)據(jù)(int |char* )征绸。增刪改查,并且對雙鏈表數(shù)據(jù)進(jìn)行排序俄占。