復(fù)雜數(shù)據(jù)類型
1.結(jié)構(gòu)體
基本定義:
struct 結(jié)構(gòu)名
{
//成員列表
};
成員列表:
由基本數(shù)據(jù)類型定義的變量或者是構(gòu)造類型的變量
example:
struct student
{
int grade;
int age;
char name[32];
};
student:結(jié)構(gòu)體名稱
struct student:結(jié)構(gòu)數(shù)據(jù)類型,類似于:int等
struct student stu;
stu:結(jié)構(gòu)體變量
訪問結(jié)構(gòu)成員:"."
訪問結(jié)構(gòu)體成員:
stu.name;
stu.grade;
stu.age;
2.結(jié)構(gòu)體變量的初始化
struct student
{
char name[32];
char sex;
int age;
};
(1)初始化1
struct student boy;
strcpy(boy.name,"jack");
boy.age = 24;
boy.sex = 'm';
(2)初始化2
struct student girl = ("locy",'f',20);
(3)初始化3(不建議)
聲明結(jié)構(gòu)體時(shí),定義結(jié)構(gòu)體變量
聲明結(jié)構(gòu)體時(shí),定義結(jié)構(gòu)體變量
struct student
{
char name[32];
char sex;
int age;
}stu,stu1;
struct student
{
char name[32];
char sex;
int age;
}stu{"xiaoming",'m',22};
3.無名結(jié)構(gòu)體
struct
{
int age;
char name[16];
}stu;
無名結(jié)構(gòu)體一般不使用
4.宏定義結(jié)構(gòu)體
宏是原地替換
struct student
{
char name[32];
char sex;
int age;
};
#define STU struct student
STU stu,stu1; <------> struct student stu,stu1;
5.結(jié)構(gòu)體的嵌套
struct date
{
int year;
int month;
int day;
};
struct student
{
char name[32];
int age;
struct date birthday;
};
嵌套定義結(jié)構(gòu)體
//不可以
struct student
{
char name[32];
int age;
struct student stu; //stu大小不確定
};
//可以
struct student
{
char name[32];
int age;
struct student *p; //因?yàn)橹羔樀拇笮」潭? };
6.結(jié)構(gòu)體數(shù)組
struct student arr[3];
7.結(jié)構(gòu)體指針
struct date *pa;
struct student *pb;
#include<stdlib.h>
//空間的申請(qǐng)和釋放
malloc(); //申請(qǐng)堆空間
free(); //釋放空間
//申請(qǐng)一塊堆空間,大小為:sizeof(struct student)
pa = (struct date *)malloc(sizeof(struct date));
free(pa); //釋放申請(qǐng)的堆空間
8.typedef
重新取名
typedef int I;
給int取名為I
結(jié)構(gòu)體
typedef struct student
{
//成員列表
}STU;
兩者等價(jià):
struct student
{
//成員列表
};
typedef struct student STU;
和宏定義的區(qū)別
typedef struct student STU;
#define STU struct student;
9.結(jié)構(gòu)體大小
內(nèi)存對(duì)齊:
Linux: 4字節(jié)
Windows:8字節(jié)
默認(rèn)從偏移量為0的位置開始存儲(chǔ)
每個(gè)成員所占字節(jié)數(shù)是其自身大小的整數(shù)倍
是最大成員所在字節(jié)的整數(shù)倍
10.聯(lián)合體
union untype
{
int a;
long b;
};
特點(diǎn):
不管是賦值還是訪問每次只能操作一個(gè)變量
分配空間按最大數(shù)據(jù)類型分配
11.枚舉類型
enum entype
{
A, //默認(rèn)從0開始,一般是大寫
B
};
枚舉類型的值可以拿過來直接用
12.鏈表
鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),線性存儲(chǔ)結(jié)構(gòu)
其大小可動(dòng)態(tài)改變,鏈表是由一個(gè)個(gè)結(jié)點(diǎn)串起來的數(shù)據(jù)鏈
結(jié)點(diǎn):
由數(shù)據(jù)域和指針域組成,
數(shù)據(jù)域:存放數(shù)據(jù)
指針域:存放下一個(gè)結(jié)點(diǎn)的地址
(1)創(chuàng)建鏈表
struct student
{
int id;
struct student *next;
};
struct student *head;
malloc()
free()
創(chuàng)建一個(gè)頭結(jié)點(diǎn):
struct student *head;
head = (struct student *)mallocsizeof((struct student));
頭結(jié)點(diǎn)標(biāo)識(shí)一個(gè)鏈表,即鏈表名稱
頭結(jié)點(diǎn)的數(shù)據(jù)域不存放數(shù)據(jù),指針域存放第一個(gè)結(jié)點(diǎn)的地址,
頭結(jié)點(diǎn)只是為了標(biāo)識(shí)這個(gè)鏈表
鏈表例子
#include<stdio.h>
#include<stdlib.h> //malloc,free
struct student
{
int ID;
char name[32];
struct student *next;
};
#define LEN sizeof(struct student)
//=============頭插=============================================
struct student *add_link(struct student *head)
{
struct student *temp = (struct student*)malloc(LEN);
printf("input ID:");
scanf("%d",&temp->ID);
printf("input name:");
scanf("%s",temp->name);
//temp->next = NULL;
temp->next = head->next;
head->next = temp;
temp = NULL;
return head;
}
//==============頭刪============================================
struct student *sub_link(struct student *head)
{
struct student *temp = head->next;
head->next = temp->next;
free(temp);
temp = NULL;
return head;
}
//=============尾刪============================================
struct student *subwei(struct student *head)
{
struct student *temp = head->next;
struct student *temp1 = head;
while(temp->next != NULL)
{
temp1 = temp;
temp = temp->next;
}
temp1->next=NULL;
free(temp);
temp = NULL;
return head;
}
//===============尾插========================================
struct student *addwei(struct student *head)
{
struct student *p = head;
struct student *temp= (struct student*)malloc(sizeof(LEN));
printf("input ID:");
scanf("%d",&temp->ID);
printf("input name:");
scanf("%s",temp->name);
while(p->next != NULL)
{
p = p->next;
}
temp->next = p->next;
p->next = temp;
temp = NULL;
return head;
}
//==============打印============================================
void show_link(struct student *head)
{
struct student *p = head->next;
printf("\tID\tname\n");
while(p != NULL)
{
printf("\t%d\t%s\n",p->ID,p->name);
p = p->next;
}
return;
}
//=============主函數(shù)=========================================
int main()
{
//創(chuàng)建頭結(jié)點(diǎn)
struct student *head;
struct student *p;
head = (struct student*)malloc(sizeof(struct student));
head->next = NULL;
//添加
int i;
for(i=0;i<4;i++)
add_link(head);
show_link(head);
sub_link(head);
show_link(head);
subwei(head);
show_link(head);
addwei(head);
show_link(head);
return 0;
}
總結(jié)
學(xué)到現(xiàn)在綜合性開始很強(qiáng)了,要注意把以前的知識(shí)點(diǎn)串起來
鏈表和結(jié)構(gòu)體的運(yùn)用要熟練,注意理解。