学期(2024-2025-1) 学号(20241420) 《计算机基础与程序设计》第十三周学习总结
作业信息
这个作业属于哪个课程 | <班级的链接>(如2024-2025-1-计算机基础与程序设计) |
---|---|
这个作业要求在哪里 | <作业要求的链接>(2024-2025-1计算机基础与程序设计第十三周作业) |
这个作业的目标 | <《C语言程序设计》第12章并完成云班课测试> |
作业正文 | ... 本博客链接https://home.cnblogs.com/u/vincent2077 |
教材学习内容总结
C语言中的链表是一种动态数据结构,它由节点组成,每个节点包含数据部分和指向下一个节点的指针。
-
链表节点的定义:
- 定义一个结构体来表示链表的节点,通常包含数据和指向下一个节点的指针。
typedef struct Node {int data;struct Node* next; } Node;
-
创建节点:
- 使用
malloc
或者在栈上声明来创建新的节点。
Node* createNode(int data) {Node* newNode = (Node*)malloc(sizeof(Node));if (newNode != NULL) {newNode->data = data;newNode->next = NULL;}return newNode; }
- 使用
-
插入节点:
- 在链表的头部、尾部或中间插入节点。
- 头部插入:
void insertAtHead(Node** head, int data) {Node* newNode = createNode(data);newNode->next = *head;*head = newNode; }
- 尾部插入:
void insertAtTail(Node** head, int data) {Node* newNode = createNode(data);if (*head == NULL) {*head = newNode;} else {Node* temp = *head;while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;} }
-
删除节点:
- 删除指定位置的节点或删除值为特定数据的节点。
void deleteNode(Node** head, int key) {Node* temp = *head, *prev = NULL;if (temp != NULL && temp->data == key) {*head = temp->next;free(temp);return;}while (temp != NULL && temp->data != key) {prev = temp;temp = temp->next;}if (temp == NULL) return;prev->next = temp->next;free(temp); }
-
搜索节点:
- 在链表中搜索特定值的节点。
Node* search(Node* head, int key) {Node* temp = head;while (temp != NULL) {if (temp->data == key) return temp;temp = temp->next;}return NULL; }
-
打印链表:
- 遍历链表并打印每个节点的数据。
void printList(Node* node) {while (node != NULL) {printf("%d -> ", node->data);node = node->next;}printf("NULL\n"); }
-
链表反转:
- 反转链表的方向。
Node* reverseList(Node* head) {Node* prev = NULL, * current = head, * next = NULL;while (current != NULL) {next = current->next;current->next = prev;prev = current;current = next;}head = prev;return head; }
-
内存管理:
- 使用
malloc
和free
管理动态分配的内存。
- 使用
-
循环链表:
- 链表的最后一个节点的
next
指针指向头节点,形成一个闭环。
- 链表的最后一个节点的
-
双向链表:
- 每个节点有两个指针,一个指向前一个节点,一个指向后一个节点。
-
排序链表:
- 使用排序算法(如归并排序、快速排序)对链表进行排序。
-
链表与数组的转换:
- 将链表转换为数组以利用数组的索引特性,或者将数组转换为链表以利用链表的动态特性。
基于AI的学习
代码调试中的问题和解决过程
OJ
- 问题1:输出字符串的最后一个字母时部分正确
- 问题1解决方案:字符长度限定过小,对于部分动态测试已经超过了数组容量,宏定义N值增大即可
- 问题2:输出时未注意换行
- 问题2解决方案:以后注意换行,避免出现数据错误
实验
1.问题:查找函数中的“No Found”一开始输出语句放至循环内部,导致其多次出现
解决方法:将语句放至循环外部;
2.问题:计算总分时出现问题,总分显示为随机数
解决方法:记得在循环开始处将sum初始化为0!
3.问题:成绩表排版混乱
解决方法:学习输出时位移指令,或者灵活运用\t;
4.问题:排序出现问题
解决方法:在冒泡排序中需要先遍历一次找出最值再实行交换,否则不仅会多次交换增加运算并且还会出现顺序问题;
5.问题:对于strcmp运用不够熟练,记住结果有三种:>0,<0,==0
解决方法:记住字符串函数的调用方式和输出格式;
6.问题:n的输入应该在何处没有处理好
解决方法:在此代码中n的输入应该放在前面,以便于在文件读取的时候加入限制,从而读入超过数组容量的数据;
7.问题:fread()函数中sizeof括号里的涉及的应该是指针,填入stu一般指向stu[0],读取时会超过容量出现问题
解决方法:可以使用stu[0]*n以确保容量足够。
-
计划学习时间:4小时
-
实际学习时间:6小时