编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

5个例子告诉你:C语言结构体的高级难度玩法

gowuye 2024-04-25 04:40 5 浏览 0 评论

当涉及到C语言结构体的高级玩法时,有一些更具挑战性的例子可以探索。以下是另外五个高级难度的例子代码,涵盖了更多复杂的结构体用法和概念。

1.函数指针数组结构体(Structure with Function Pointer Array)

#include <stdio.h>

typedef int (*MathOperation)(int, int);

struct MathOperations {
    MathOperation operations[3];
};

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int multiply(int a, int b) {
    return a * b;
}

int main() {
    struct MathOperations math;

    math.operations[0] = add;
    math.operations[1] = subtract;
    math.operations[2] = multiply;

    int a = 5;
    int b = 3;

    for (int i = 0; i < 3; i++) {
        int result = math.operations[i](a, b);
        printf("Operation %d result: %d\n", i+1, result);
    }

    return 0;
}

在这个例子中,我们定义了一个包含函数指针数组的结构体MathOperations。数组中的每个元素都是一个函数指针,指向不同的数学操作函数。我们将加法、减法和乘法函数分别分配给数组中的元素,并通过遍历数组来调用不同的数学操作。

2.结构体嵌套自身(Structure Nesting Itself)

#include <stdio.h>

struct TreeNode {
    int data;
    struct TreeNode* left;
    struct TreeNode* right;
};

void traverseTree(struct TreeNode* node) {
    if (node == NULL)
        return;

    printf("%d ", node->data);
    traverseTree(node->left);
    traverseTree(node->right);
}

int main() {
    struct TreeNode node1, node2, node3, node4, node5;
    node1.data = 1;
    node2.data = 2;
    node3.data = 3;
    node4.data = 4;
    node5.data = 5;

    node1.left = &node2;
    node1.right = &node3;
    node2.left = &node4;
    node2.right = NULL;
    node3.left = &node5;
    node3.right = NULL;
    node4.left = NULL;
    node4.right = NULL;
    node5.left = NULL;
    node5.right = NULL;

    traverseTree(&node1);
    return 0;
}

在这个例子中,我们定义了一个结构体TreeNode,表示二叉树的节点。结构体中包含一个整数数据成员以及两个指向相同结构体类型的指针成员,分别指向左子节点和右子节点。通过嵌套结构体自身,我们可以创建复杂的树状数据结构。在main()函数中,我们手动创建了一个二叉树,并使用递归函数traverseTree()遍历并打印树的节点。

3. 灵活数组成员

在C语言中,结构体中的数组成员必须具有固定大小,不能实现灵活的数组成员。以下是一个重新调整的例子,展示了如何使用指针实现动态大小的数组。

#include <stdio.h>
#include <stdlib.h>

struct DynamicArray {
    int* array;
    int size;
};

struct DynamicArray* createDynamicArray(int size) {
    struct DynamicArray* dynamicArray = malloc(sizeof(struct DynamicArray));
    dynamicArray->array = malloc(sizeof(int) * size);
    dynamicArray->size = size;
    return dynamicArray;
}

void freeDynamicArray(struct DynamicArray* dynamicArray) {
    free(dynamicArray->array);
    free(dynamicArray);
}

int main() {
    int size = 5;
    struct DynamicArray* myArray = createDynamicArray(size);

    for (int i = 0; i < myArray->size; i++) {
        myArray->array[i] = i + 1;
    }

    printf("Array elements: ");
    for (int i = 0; i < myArray->size; i++) {
        printf("%d ", myArray->array[i]);
    }
    printf("\n");

    freeDynamicArray(myArray);

    return 0;
}

在这个例子中,我们定义了一个DynamicArray结构体,其中包含一个array指针和一个size成员。array指针指向动态分配的整数数组,而size表示数组的大小。

通过createDynamicArray()函数,我们可以动态地创建一个具有指定大小的动态数组,并返回一个指向该结构体的指针。在main()函数中,我们使用createDynamicArray()函数创建一个大小为5的动态数组,并使用循环将一些值存储在数组中。最后,我们使用freeDynamicArray()函数释放动态分配的内存。

请注意,这个例子展示了使用指针来模拟动态大小的数组,而不是直接在结构体中定义灵活的数组成员。

4.结构体的递归嵌套(Recursive Nesting of Structures)

#include <stdio.h>

struct Node {
    int data;
    struct Node* next;
};

void printLinkedList(struct Node* node) {
    if (node == NULL)
        return;

    printf("%d ", node->data);
    printLinkedList(node->next);
}

int main() {
    struct Node node1, node2, node3;

    node1.data = 1;
    node2.data = 2;
    node3.data = 3;

    node1.next = &node2;
    node2.next = &node3;
    node3.next = NULL;

    printLinkedList(&node1);

    return 0;
}

在这个例子中,我们定义了一个简单的链表结构体Node,其中包含一个整数数据成员和一个指向相同结构体类型的指针成员next。通过递归嵌套结构体自身,我们可以创建链表结构。在main()函数中,我们手动创建了一个简单的链表,并使用递归函数printLinkedList()打印链表中的数据。

5.结构体指针数组(Array of Structure Pointers)

#include <stdio.h>

struct Person {
    char name[20];
    int age;
};

int main() {
    struct Person person1 = { "Alice", 25 };
    struct Person person2 = { "Bob", 30 };
    struct Person person3 = { "Charlie", 35 };

    struct Person* people[] = { &person1, &person2, &person3 };

    for (int i = 0; i < 3; i++) {
        printf("Person %d: Name: %s, Age: %d\n", i+1, people[i]->name, people[i]->age);
    }

    return 0;
}

在这个例子中,我们定义了一个Person结构体,表示一个人的信息,包含一个名字(字符串)和一个年龄(整数)。然后,我们创建了几个Person类型的变量,并使用指针数组people存储了这些结构体的指针。

在main()函数中,我们使用循环遍历指针数组,并通过指针访问结构体成员,打印每个人的名字和年龄。

相关推荐

Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优
Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优

Nginx缓存优化是帮助大家提升网站性能的重要操作之一,proxy_cache主要用于反向代理时,对后端内容源服务器进行缓存;fastcgi_cache主要用于...

2024-05-20 14:44 gowuye

王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动
王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动

王者荣耀官方终于确定了天魔缭乱和逐梦之音的返场活动,这让不少小伙伴乐开了花,返场活动将会在3月22日开启,下面就带来王者荣耀天魔缭乱和逐梦之音返场活动地址!王者...

2024-05-20 14:44 gowuye

常见的嵌入式web服务器有哪些?

嵌入式WEB服务器常见的有:Lighttpd,Shttpd,Thttpd,Boa,Mini_httpd,Appweb,Goahead。Lighttpd地址:http://www.light...

简述几款常见的嵌入式web服务器
简述几款常见的嵌入式web服务器

嵌入式web服务器,是web服务器当中的一种,是基于嵌入式系统而实现的web服务器。指的是在嵌入式系统(通俗点就是单片机系统)上实现的一个web服务器,可以通过...

2024-05-20 14:44 gowuye

教你如何利用fastcgi_cache缓存加速WordPress

在使用nginx缓存之前,必须在nginx里面加载专门的模块,这个模块叫做ngx_cache_purge。添加ngx_cache_purge模块下载ngx_cache_purge模块ngx_cache...

扫描WordPress漏洞

检测已知漏洞WPScan是一款广泛使用的WordPress安全扫描工具,它的一项重要功能是检测已知漏洞。在这篇文章中,我们将深入探讨WPScan如何检测已知漏洞,并结合实际示例,帮助读者更好地理解和应...

消灭 Bug!推荐几个给力的开源 Bug 跟踪工具
消灭 Bug!推荐几个给力的开源 Bug 跟踪工具

在这个充满bug的世界里,最遥远的距离不是生与死,而是你亲手制造的bug就在你眼前,你却怎么都找不到它。因此本文准备了7款优秀的开源bug跟踪系...

2024-05-20 14:43 gowuye

生物信息分析入门全攻略

生物信息学是生命科学研究的重大前沿领域,未来将占据生命科学研究的半壁江山。已经有越来越多的小伙伴投入到生物信息的学习中,但是入门难、深入慢、摸不到方向等都成为持续学习的拦路虎。本文根据生物信息技术大牛...

elkb实践经验,再赠送一套复杂的配置文件
elkb实践经验,再赠送一套复杂的配置文件

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。宝剑锋从磨砺出,梅花香自苦寒来。诗人白居易,三月下江南,看到沿路开放的桃花,心潮澎湃...

2024-05-20 14:43 gowuye

超详细从0到1 搭建ELK监控
超详细从0到1 搭建ELK监控

监控分类?Metrics用于记录可聚合的数据。例如,1、队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP请求个数可被定义为一个计数器,...

2024-05-20 14:42 gowuye

嵌入式开发 之Web配置页面开发
嵌入式开发 之Web配置页面开发

1.PHP是最好的语言??开发动态页面首选的语言是PHP,村村不能在这里忽悠人,如果你的硬件性能允许切略懂PHP,看到这里就可以退出了。本文面向的受众是Linu...

2024-05-20 14:42 gowuye

Python开发一个网站目录扫描工具用来检测网站是否有漏洞?
Python开发一个网站目录扫描工具用来检测网站是否有漏洞?

开发一个网站目录扫描工具是用来检测网站是否有非法目录请求的一个常见需求之一,我们要通过这个扫描工具来找到通过某个域名可以访问到的网站路径,可能对于有些系统来讲,...

2024-05-20 14:42 gowuye

创建一个类似Youtube的Id——使用PHP/Python/JS/Java/SQL

id通常都是用数字,不巧的是只有10个数字来使用,所以如果你有很多的记录,id往往变得非常冗长。当然对于计算机来说无所谓,但我们更希望id尽可能短。所以我们如何能使id变短?我们可以利用字母让它们附加...

快速云:有助于移动应用安全开发的五条妙计
快速云:有助于移动应用安全开发的五条妙计

许多企业不断地向其开发团队提供培训。但是某些漏洞,如早在十多年前就发现的SQL注入,如今仍广泛存在于各种应用中。因而,安全培训永不过时。在开发移动应用时,开发者...

2024-05-20 14:41 gowuye

洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映
洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映

7月2日,由M&CSaatchi创作,由深受好评的澳大利亚导演迈克尔·格雷西执导的动画短片《G’day》,正式在全网上映。该影片因其出色的创意赢得了洛...

2024-05-20 14:41 gowuye

取消回复欢迎 发表评论: