课程名称:Linux C语言结构体
章节名称:第3章、第5章
讲师姓名:雷过就跑
课程内容:结构体、结构体数组、结构体指针、单链表
学习心得:
创建自定义的结构体类型(不占内存)
struct weapon {
char name[20];
int damage;
int price;
};
声明一个结构体变量(占用内存)
struct weapon m3;
初始化
struct weapon m3 = {"m3", 120, 1500};
或者
m3.name = "m3";
m3.damage = 120;
m3.price = 1500;
声明一个结构体数组
struct weapon shotguns[2];
结构体数组初始化
struct weapon shotguns[2] = {"m3", 120, 1500, "xm1014", 110, 2100};
或者
shotguns[0].name = "m3";
shotguns[0].damage = 120;
shotguns[0].price = 1500;
shotguns[1].name = "xm1014";
shotguns[1].damage = 110;
shotguns[1].price = 2100;
声明一个结构体指针
struct weapon *w;
w = &m3;
通过指针访问结构体成员
(*w).name = "m3-EX";
w->name = "m3-EX";
// 以上两种方式都等效于 m3="m3-EX";
数组名就是数组的首地址,或称首元素地址
struct weapon *p;
p = shotguns;
// p++; 等于p增加了一份数组内元素所占字节数的值
静态数据结构:由系统分配固定大小的内存,不再改变
如:整型、浮点型、数组等
动态数据结构:根据使用情况,动态进行空间存储分配
如:链表 head->A->B->C->...->Z
每个节点包含两个部分:本节点数据(头节点无数据)、下一节点地址(尾节点指向NULL)
静态链表实例(事先确定了链表规模)
#include <stdio.h>
struct weapon { // 定义一个结构体类型的节点
int damage;
int price;
struct weapon *next; //结构体指针,指向下一个节点地址
};
int main() {
struct weapon a, b, c, *head;
a.damage = 45;
a.price = 1200;
b.damage = 55;
b.price = 2500;
c.damage = 65;
c.price = 3100;
head = &a;
a.next = &b;
b.next = &c;
c.next = NULL;
struct weapon *p;
p = head;
while(p!=NULL){
printf("damage:%d price:%d\n", p->damage, p->price);
p = p->next;
}
return 0;
}
动态链表实例(链表规模未知,使用时动态增长)
#include <stdio.h>
#include <malloc.h>
struct weapon { // 定义一个结构体类型的节点
int damage;
int price;
struct weapon *next; //结构体指针,指向下一个节点地址
};
struct weapon *create_list() {
struct weapon *head; // 头指针
struct weapon *p1, *p2; // p1指向新创建的节点,p2指向目前的尾节点
int n=0; // 记录当前节点个数
p1 = p2 = (struct weapon *)malloc(sizeof(struct weapon));
scanf("%d %d", &(p1->damage), &(p1->price));
head = NULL;
while (p1->price!=0) { // 假定当输入的price为0时停止输入
n++;
if(n==1) head=p1; // 第一次创建节点,则让head指向该节点
else p2->next = p1; // 非第一次创建节点,则让目前的尾节点指向该节点
p2 = p1;
p1 = (struct weapon *)malloc(sizeof(struct weapon));
scanf("%d %d", &(p1->damage), &(p1->price));
}
p2->next = NULL;
return head;;
}
int main() {
struct weapon *p;
p = create_list();
printf("%d %d", p->damage, p->price);
return 0;
}