C 语言高级数据结构

发布于 2024-03-26 02:43:31 字数 4668 浏览 24 评论 0

主要涵盖 C 高级数据结构,在用 python 的时候,这门语言的灵活性令人咂舌,如:

# python
lis = ["string", 1, 3.98, False, {"name":"beginman", "age":24}, None]

在 python 列表里面可以自由设置任何类型的值,如果换到 C/C++ 中则要写一大堆东西,正所谓 人生苦短,我用 python 啊, 为了更深入的理解 C,这份苦吃着也罢。

我们需要把一批数据打包,如鱼的名称,种类,牙齿,年龄,如果要打印它,在之前的章节中可以这样:

void showFish(const char *name, const char *species, int teeth, int age) {
    // const char *:表示将传递字符串字面值
    printf("%s is a %s with %i teeth.He is %i\n", name, species, teeth, age);
}

int main(int argc, char *argv[]) {
    showFish("Snappy", "Piranha", 69, 4);
    return 0;
}

如果使用结构可以把不同的类型写在一起,封装成一个新的大数据类型:

struct fish {
    const char *name;
    const char *species;
    int teeth;
    int age;
};  // 不要忘了分号结尾

定义 struch fish 新结构后,开始创建数据:

struct fish snappy = {"Snappy", "Piranha", 69, 4};

那么上面的例子可以用结构体改写成:

struct fish {
    const char *name;
    const char *species;
    int teeth;
    int age;
};  // 不要忘了分号结尾

void showPrettyFish(struct fish f) {
    printf("%s is a %s with %i teeth.He is %i\n", f.name, f.species, f.teeth, f.age);
}

int main(int argc, char *argv[]) {
    struct fish snappy = {"Snappy", "Piranha", 69, 4};
    showPrettyFish(snappy);
    return 0;
}

1.定义与声明

结构体的定义如下所示,struct 为结构体关键字,tag 为结构体的标志,member-list 为结构体成员列表,其必须列出其所有成员;variable-list 为此结构体声明的变量。

 struct tag { member-list } variable-list ; 

在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。以下为示例:

//此声明声明了拥有 3 个成员的结构体,分别为整型的 a,字符型的 b 和双精度的 c
//同时又声明了结构体变量 s1
//这个结构体并没有标明其标签
struct 
{
    int a;
    char b;
    double c;
} s1;

//此声明声明了拥有 3 个成员的结构体,分别为整型的 a,字符型的 b 和双精度的 c
//结构体的标签被命名为 SIMPLE,没有声明变量
struct SIMPLE
{
    int a;
    char b;
    double c;
};
//用 SIMPLE 标签的结构体,另外声明了变量 t1、t2、t3
struct SIMPLE t1, t2[20], *t3;

//也可以用 typedef 创建新类型
typedef struct
{
    int a;
    char b;
    double c; 
} Simple2;
//现在可以用 Simple2 作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;

可以使用指定初始化器来设置结构字段的初值:

typedef struct { 
	const char *color; 
	int gears;
	int height;
} bike;

bike b = {.height=17, .gears=21};

2.结构体成员访问

结构体成员依据结构体变量类型的不同,一般有 2 种访问方式,一种为直接访问,一种为间接访问

struct SIMPLE
{
    int a;
    char b;
};

//声明结构体变量 s1 和指向结构体变量的指针 s2
struct SIMPLE s1, *s2;

//给变量 s1 和 s2 的成员赋值,注意 s1.a 和 s2->a 并不是同一成员
//直接访问
s1.a = 5;
s1.b = 6;

//间接访问
s2->a = 3;
s2->b = 4;

3.结构与存储器

定义结构时,存储器并没有创建任何东西,只是给了计算机一个模板,当定义新变量时,存储器为结构创建一块足够大的空间。那么当把一个结构变量赋给另一个结构变量时会发生什么?计算 机会创建一个新的结构副本,也就是说,计算机需要再分配一 块存储器空间,大小和原来相同,然后把每个字段都复制过去。

4.嵌套定义结构

定义嵌套结构是为了应付更加复杂的情况,如下:(注意嵌套结构的顺序)

//定义一个爱好规则结构
typedef struct {
    const char *species;        // 种类
    const char *rules;          // 规则
} Rules;

//定义一个爱好结构
typedef struct {
    const char *what;   //爱好什么
    Rules rl;    //规则
} Like;


//定义一个人的结构
typedef struct {
    const char *name;   // 名字
    int age;            // 年龄
    Like lk;     // 爱好
} Person;


int main(int argc, char *argv[]) {
    Person beginman  = {"beginman", 24, {"游泳", {"有氧运动", "规则如下:蛙泳一个来回,水下憋气 10 分钟.."}}};
    printf("%s is %i years old, he like %s(%s: %s)", beginman.name, beginman.age, beginman.lk.what, beginman.lk.rl.species, beginman.lk.rl.rules);
    return 0;
}

5.更新结构

如下实例:

typedef struct {
    const char *name;
    int age;
}turtle;


void happy_birthday(turtle t) {
    t.age=100;
    printf("%i\n", t.age);
}


int main(int argc, char *argv[]) {
    turtle xx = {"龟龟", 99};
    //更改年龄
    happy_birthday(xx);
    printf("%i\n", xx.age);
    return 0;
}

试图更改乌龟的年龄:输出结果:

100
99

why?在 C 中,参数按值传递给函数,当调用函数时,传入函数的值会赋值给形参

void happy_birthday(turtle t) {
	... 
}
//myrtle 结构会复制给形参
happy_birthday(myrtle);

//等效于:
turtle t = myrtle;

在 C 语言中,当为结构赋值时,计算机会复制结构的值。如果想把结构传给函数并在函数中更新值,则需要结构指针。

因为只有把变量在存储器中的位置告诉函数,函数才能更新保存在那里的数据,才能更新变量。

所以上面的代码可以这样写:

void happy_birthday(turtle *t) {
    (*t).age=100;		//要把*放在变量
              

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

尛丟丟

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

ni139999

文章 0 评论 0

Smile

文章 0 评论 0

木子李

文章 0 评论 0

仅此而已

文章 0 评论 0

qq_2gSKZM

文章 0 评论 0

内心激荡

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文