C语言中的结构

结构c如果你有一个数据集合,比如一堆数字,你可以把它们存储为c中的数组类型,如果它们是一堆字符串,你可以把它们存储为字符串数组。假设你有一系列字符串,表示一个杂货店货架上的商品,另外两个数字数组包含该商品的库存和销售价格,那么问题是你如何跟踪该商品?如果考虑到被称为结构的复杂用户定义的数据类型,那么解决方案就不足为奇了,在C语言中

在这篇博文中,我们将看到如何创建复合数据类型,就像上面例子中的item,它包含剩余库存、item名称和成本价格。我们还将讨论结构的扩展,以构建数据结构,如单链表。这样的语言c++和Java有模板结构来实现高级数据结构

声明一个结构

如果你是一个C初学者,你可能从这个代码示例开始受益,它声明了一个名为UserInfo的结构,也命名了一个新类型' UserInfoDef '。

typedef struct UserInfo UserInfoDef;struct用户信息{char * user_name;int年龄;};struct GroceryItem {char * item_name;int remaining_inventory;浮动cost_price;};

现在这个声明不是很有用,除非您创建这种类型的变量并在其中存储一些信息。这是由代码完成的,

struct用户信息{char * user_name;int年龄;} user_a user_b;user_a。user_name = "苹果酱";user_a。年龄= 21;user_b。user_name = "甜菜根";user_b。年龄= 69;

示例-基本结构

现在,让我们将这些数据放到一个简单的程序中,并将用户数据打印到终端。您应该看到以下输出

# include < stdio . h >struct用户信息{char * user_name;int年龄;};void print_user(struct UserInfo* ptr) {Printf ("%s -> %d \n",ptr->user_name,ptr->age);}int main () {struct UserInfo user_a, user_b, q;user_a。user_name = "苹果酱";user_a。年龄= 21;user_b。user_name = "甜菜根";user_b。年龄= 69;q = user_b;q.age + +;print_user (user_a);print_user (user_b);print_user (q);返回0;}

编译并运行该程序应该会得到一个输出,

苹果酱->甜菜根->甜菜根->

结构上的操作

C语言中的结构允许以下操作,

  1. 创建结构元素

  2. 创建一个结构数组

  3. 删除一个结构

  4. 复制一个结构元素

在前一节中,您已经看到了堆栈和元素拷贝上的1和4个结构元素声明。您将在下面的部分中看到2和3。

创建动态结构-内存分配

要在运行时创建结构,比如通过Internet接收的数据、用户输入或从磁盘读取的文件,我们需要知道要存储在内存中的结构/记录的数量。因为这些信息在运行时不可用,所以我们必须分配内存并创建新的空间。这通常是在网络编程,或互联网中间件或后端代码

在这个get_new_user_info例程中,使用函数malloc(它使用指令#include),它从操作系统堆内存中检索可用的内存空间。在下面的示例中,您为数据结构UserInfoDef请求内存,以获取由内置c操作符sizeof()给出的字节数。

UserInfoDef* get_new_user_info(const char * user_name) {UserInfoDef* user_curr = (UserInfoDef*) malloc(sizeof(UserInfoDef));user_curr - > =零;user_name = (char *) malloc(sizeof(char)*strlen(user_name));拷贝字符串(user_curr - > user_name user_name);返回user_curr;}

Examples -链表示例

在本例中,您在UNIX上读取名为“/etc/passwd”的文件,这是一个历史文件,其中列出了用户数量及其加密密码和组id。一旦我们打开带有read属性“r”的文件,我们就创建了一个用于用户信息的结构体,并在所谓的链表中连接这些结构体。使用这个数据结构,我们在函数中构建一个元素列表,并将其传递给调用者。一旦所有

将所有这些放在一起,我们可以看到清单' struct_demo.c '

# include < stdio . h ># include < string.h ># include < stdlib.h ># include < assert.h >typedef struct UserInfo UserInfoDef;struct用户信息{char * user_name;UserInfoDef *下;};UserInfoDef* get_new_user_info(const char * user_name) {UserInfoDef* user_curr = (UserInfoDef*) malloc(sizeof(UserInfoDef));user_curr - > =零;user_name = (char *) malloc(sizeof(char)*strlen(user_name));拷贝字符串(user_curr - > user_name user_name);返回user_curr;}/*从/etc/passwd & . conf中提取用户名找到最长的用户名* /UserInfoDef* get_user_names(int* total_users) {UserInfoDef* user_begin = NULL;UserInfoDef* user_curr = NULL, *user_prev = NULL;Const char* fname = "/etc/passwd";FILE* fp = fopen(fname,"r");assert(fp != NULL);char line_data[512] = {0,}, *ptr=NULL;Int line_no = 0;而(!Feof (fp)) {Fgets (line_data, 512, fp);/*删除':'后面的行ptr = line_data;While (*ptr !=':') {ptr + +;}* ptr =”;/*输出用户名*/printf (" % d) % s \ n ", line_no, line_data);/*创建一个新的用户ID &复制当前用户名*/User_curr = get_new_user_info(line_data);/*更新链表*/If (user_prev) {user_prev - > = user_curr;}user_prev = user_curr;/*保持跟踪的开始*/if (user_begin == NULL) {user_begin = user_curr;}line_no + +;}* total_users = line_no;/ /更新rval返回user_begin;}int main () {int total_users;UserInfoDef* user_begin = get_user_names(&total_users);UserInfoDef* prev = NULL;Int count = 0;printf (" ######## 总用户% 04 d  #############\ n”,total_users);While (user_begin) {printf (" % 03 d | name = % s \ n ", + +, user_begin - > user_name);prev = user_begin;/ /前进user_begin = user_begin - > next;/ /清理内存免费(上一页- > user_name);免费(上一页);}}/** GCC struct_demo.c -o/ struct_demo * /

运行程序

您可以从源网站http://gcc.gnu.org下载平台的C包,并运行测试和程序,如下所示:$gcc struct_demo.c -o struct_demo && ./struct_demo,是解释代码,然后运行程序的命令

001 | name = apache . 001002 | name = GDM. .<剪> . .034 | name = mu2035 | name = lightdm036 | name = colord037 | name = whoopsie038 | name = mysql039 | name = halla040 | name = guest-r7Ir02#041 | name = guest-r7Ir02

总结

软件开发人员使用结构作为凝聚的数据结构来保存异构的数据片段。结构是C语言中的第一类元素,您可以使用它来存储多个数据,并从malloc/free系统构建数组和使用malloc/free系统。高级算法和数据结构(如树、图、链表和地图)都是使用c中的结构构建的。Linux等操作系统的关键元素是在这些基本数据结构上编写的。你可以了解更多高级数据结构可以让你的大部分编程,并把它带到下一个层次

c#顶级课程

面向初学者的c#。net
里克•菲利普斯
4.4 (1263)
完成c# Unity Game Developer 3D
Ben Tristem, Rick Davidson(游戏开发者)电视团队
4.7 (26828)
畅销书
c#中级:类,接口和面向对象
狂舞Hamedani
4.6 (23135)
畅销书
RPG核心战斗创造者:学习中级Unity c#编码
Ben Tristem, Rick Davidson, Sam Pattuzzi(游戏开发)电视团队
4.7 (8490)
c#高级主题:为技术面试做准备
狂舞Hamedani
4.5 (15119)
完整的c#大师级
丹尼斯•Panjuta教程。Denis Panjuta的eu
4.5 (12024)
c#和。net中的设计模式
Dmitri Nesteruk
4.4 (7102)
畅销书
学习使用c#和。net进行并行编程
Dmitri Nesteruk
4.5 (2035)
畅销书
Unity c#脚本:完成Unity游戏开发的c#betwayapp下载安装
Charger Games的Raja Biswas
4.5 (1388)
畅销书

更c#的课程

c#的学生也会学习

让你的团队。领导行业。

使用Udemy for Business订阅在线课程库和数字学习工具。

请求一个演示