结构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和4个结构元素声明。您将在下面的部分中看到2和3。
创建动态结构-内存分配
要在运行时创建结构,比如通过Internet接收的数据、用户输入或从磁盘读取的文件,我们需要知道要存储在内存中的结构/记录的数量。因为这些信息在运行时不可用,所以我们必须分配内存并创建新的空间。这通常是在网络编程,或互联网中间件或后端代码。
在这个get_new_user_info例程中,使用函数malloc(它使用指令#include
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等操作系统的关键元素是在这些基本数据结构上编写的。你可以了解更多高级数据结构可以让你的大部分编程,并把它带到下一个层次。