作业信息
这个作业属于哪个课程 | 2024-2025-1计算机基础与程序设计 |
---|---|
这个作业要求在哪里 | 2024-2025-1计算机基础与程序设计第十三周作业 |
这个作业的目标 | 学习结构体和数据结构基础相关知识点 |
作业正文 | 本博客 |
教材学习内容总结
《C语言程序设计》第五版第十二章主要介绍了结构体和数据结构基础。以下是该章节的学习内容总结:
-
从基本数据类型到抽象数据类型:介绍了为什么需要从基本数据类型转向抽象数据类型,以及它们的重要性。
-
结构体的定义:
- 为什么要定义结构体类型。
- 结构体变量的定义方法。
- 使用
typedef
定义数据类型。 - 结构体变量的初始化。
- 嵌套结构体的使用。
- 结构体变量的引用。
- 结构体所占内存的字节数。
-
结构体数组的定义和初始化:
- 结构体数组的定义。
- 结构体数组的初始化。
-
结构体指针的定义和初始化:
- 指向结构体变量的指针。
- 指向结构体数组的指针。
-
向函数传递结构体:介绍了如何将结构体作为参数传递给函数。
-
共用体:介绍了共用体的概念和使用方法。
-
枚举数据类型:介绍了枚举类型的定义和使用。
-
动态数据结构单向链表:
- 问题的提出。
- 链表的定义。
- 单向链表的建立。
- 单向链表的删除操作。
- 单向链表的插入操作。
-
本章扩充内容:
- 栈和队列。
- 树和图。
- 数据的逻辑结构和存储结构。
-
本章知识点小结和本章常见错误小结:总结了本章的关键知识点和常见的编程错误。
-
习题12:提供了相关的练习题,以加深对本章内容的理解和应用。
这一章节的内容涵盖了C语言中结构体的基本概念、操作以及如何使用结构体来构建更复杂的数据结构,如链表等。通过学习这些内容,我们可以更好地理解和使用C语言中的结构体和相关数据结构。
教材学习中的问题和解决过程
问题一:结构体指针具体怎么使用?
解决方式:AI答:在C语言中,结构体指针的使用涉及到指向结构体变量的指针和指向结构体数组的指针。以下是结构体指针的具体使用方法:
指向结构体变量的指针
-
声明结构体指针:
typedef struct {int id;float salary; } Employee;Employee *empPtr;
-
初始化结构体指针:
- 指向一个已经定义的结构体变量:
Employee emp = {1, 5000.0}; empPtr = &emp;
- 使用
NULL
初始化:empPtr = NULL;
- 指向一个已经定义的结构体变量:
-
访问结构体成员:
- 使用箭头操作符(
->
):empPtr->id = 2; empPtr->salary = 6000.0;
- 使用箭头操作符(
-
动态分配内存:
- 使用
malloc
或calloc
分配内存:empPtr = (Employee *)malloc(sizeof(Employee)); if (empPtr != NULL) {empPtr->id = 3;empPtr->salary = 7000.0; }
- 使用
-
释放内存:
- 使用
free
释放动态分配的内存:free(empPtr);
- 使用
指向结构体数组的指针
-
声明结构体数组指针:
Employee *empArrayPtr;
-
初始化结构体数组指针:
- 指向一个已经定义的结构体数组:
Employee empArray[3] = {{1, 5000.0}, {2, 6000.0}, {3, 7000.0}}; empArrayPtr = empArray;
- 指向一个已经定义的结构体数组:
-
访问结构体数组元素:
- 使用箭头操作符(
->
)和数组下标:empArrayPtr[0].id = 10; empArrayPtr[0].salary = 8000.0;
- 使用箭头操作符(
-
动态分配结构体数组内存:
- 使用
malloc
或calloc
分配内存:empArrayPtr = (Employee *)malloc(3 * sizeof(Employee)); if (empArrayPtr != NULL) {empArrayPtr[0].id = 4;empArrayPtr[0].salary = 9000.0; }
- 使用
-
释放内存:
- 使用
free
释放动态分配的内存:free(empArrayPtr);
- 使用
注意事项
- 在使用指针之前,始终检查它们是否为
NULL
,以避免空指针解引用。 - 使用动态分配的内存时,确保在不再需要时释放它,以避免内存泄漏。
- 当通过指针修改结构体成员时,确保指针指向正确的结构体或结构体数组。
- 结构体指针可以作为函数参数,以实现对结构体数据的修改。
通过这些基本操作,你可以有效地使用结构体指针来操作复杂的数据结构。
问题二:怎么嵌套使用结构体?
解决方式:AI答:在C语言中,嵌套使用结构体意味着在一个结构体内部定义另一个结构体,从而创建复杂的数据结构。这种技术可以用来模拟现实世界中的复杂关系,例如,一个公司可能有多个部门,每个部门又包含多个员工。下面是一个如何嵌套使用结构体的例子:
定义嵌套结构体
- 定义两个结构体:首先定义两个结构体,其中一个包含另一个结构体的成员。
#include <stdio.h>// 定义部门结构体
typedef struct {char departmentName[50];int employeeCount;
} Department;// 定义员工结构体
typedef struct {int id;char name[50];float salary;Department *department; // 指向部门的指针
} Employee;
- 创建嵌套结构体变量:创建一个员工结构体变量和一个部门结构体变量,并使员工的
department
成员指向部门。
int main() {// 创建部门Department accounting = {"Accounting", 5};// 创建员工Employee emp1 = {1, "John Doe", 50000.0, &accounting};// 打印员工信息和部门信息printf("Employee Name: %s\n", emp1.name);printf("Employee Department: %s\n", emp1.department->departmentName);return 0;
}
使用动态内存分配
在实际应用中,我们经常需要动态地创建多个结构体实例。以下是如何使用动态内存分配来嵌套使用结构体:
int main() {// 动态创建部门Department *accounting = (Department *)malloc(sizeof(Department));accounting->departmentName = "Accounting";accounting->employeeCount = 5;// 动态创建员工并分配部门Employee *emp1 = (Employee *)malloc(sizeof(Employee));emp1->id = 1;emp1->name = "John Doe";emp1->salary = 50000.0;emp1->department = accounting;// 打印员工信息和部门信息printf("Employee Name: %s\n", emp1->name);printf("Employee Department: %s\n", emp1->department->departmentName);// 释放内存free(emp1);free(accounting);return 0;
}
注意事项
- 当使用动态内存分配时,确保为每个分配的内存调用
free()
以避免内存泄漏。 - 在访问嵌套结构体成员时,确保相关的指针已经被正确初始化,避免空指针访问。
- 嵌套结构体可以创建复杂的数据结构,但也要注意管理这些结构体的复杂性,以保持代码的可读性和可维护性。
通过嵌套使用结构体,你可以创建出非常强大和灵活的数据结构,以模拟现实世界中的复杂关系和层次结构。
基于AI的学习
代码调试中的问题和解决过程
问题:在编写写入文件的代码时,我刚开始用的fwrite函数,数据写入文件成功了,但是是一团乱码,编写阅读文件并显示到显示屏的代码时用的是fread,显示出来的也有问题。
解决方法:文件可以是文本文件,也可以是二进制文件,最终选择了正确的读写函数,用fprintf和fscanf函数来读写函数,虽然麻烦了点,但是能正常读写数据。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 200/200 | 2/2 | 20/20 |
第二周 | 200/400 | 1/3 | 18/38 |
第三周 | 300/700 | 1/4 | 20/58 |
第四周 | 400/1100 | 1/5 | 22/80 |
第五周 | 300/1400 | 1/6 | 22/102 |
第六周 | 400/1800 | 1/7 | 25/127 |
第七周 | 400/2200 | 1/8 | 30/157 |
第八周 | 500/2700 | 1/9 | 35/192 |
第九周 | 500/3200 | 1/10 | 28/220 |
第十周 | 400/3600 | 1/11 | 30/250 |
第十一周 | 500/4100 | 1/12 | 30/280 |
第十二周 | 400/4500 | 1/13 | 30/310 |
第十三周 | 500/5000 | 1/14 | 30/340 |