为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 100
讨论题

浪潮君 的学生作业:

#include // 引入标准输入输出库,提供 printf 函数 #include // 引入标准库,提供 malloc、free、exit 等内存函数 // 定义链表节点结构体 typedef struct Node { int data; // 数据域:存储节点的整数值 struct Node *next; // 指针域:指向下一个节点的指针 } Node; // 创建一个新节点,封装内存分配和初始化过程 Node *create_node(int value) { Node *new_node = (Node *)malloc(sizeof(Node)); // 分配一个节点大小的内存 if (!new_node) { perror("内存分配失败"); // 如果分配失败,输出错误信息 exit(EXIT_FAILURE); // 终止程序 } new_node->data = value; // 设置节点的数据 new_node->next = NULL; // 初始时不指向其他节点 return new_node; // 返回新节点地址 } // 从大到小顺序插入一个节点(插入排序式建表) void insert_descending(Node **head, int value) { Node *new_node = create_node(value); // 创建新节点 // 情况 1:链表为空,或者新值比头节点大 → 插入头部 if (*head == NULL || value > (*head)->data) { new_node->next = *head; // 新节点指向原头节点 *head = new_node; // 更新头指针为新节点 return; } // 情况 2:在链表中找到合适位置插入(保持从大到小) Node *current = *head; while (current->next != NULL && current->next->data >= value) { current = current->next; // 向后遍历直到找到插入点 } // 插入新节点:new_node 插入在 current 后面 new_node->next = current->next; current->next = new_node; } // 打印整个链表内容 void print_list(Node *head) { printf("链表内容:"); Node *current = head; while (current != NULL) { printf("%d ", current->data); // 打印当前节点的值 current = current->next; // 移动到下一个节点 } printf("\n"); } // 删除链表中所有值等于 target 的节点 void delete_value(Node **head, int target) { Node *current = *head; // 当前节点,从头开始 Node *prev = NULL; // 前一个节点,初始为 NULL while (current != NULL) { if (current->data == target) { // 找到目标节点 Node *to_delete = current; // 保存待删除节点 if (prev == NULL) { // 如果删除的是头节点,更新 head 指针 *head = current->next; current = *head; // 当前节点后移到新头节点 } else { // 删除的是中间或尾部节点 prev->next = current->next; current = current->next; // 当前节点后移 } free(to_delete); // 释放删除的节点内存 } else { // 当前不是目标节点,向后遍历 prev = current; current = current->next; } } } // 释放整个链表占用的内存 void free_list(Node *head) { Node *tmp; while (head != NULL) { tmp = head; // 暂存当前节点 head = head->next; // 移动到下一个节点 free(tmp); // 释放当前节点内存 } } // 主函数:程序入口 int main(void) { // 初始化无序数组 int values[] = {1, 5, 3, 7, 9, 5, 8, 5, 3}; int n = sizeof(values) / sizeof(values[0]); // 计算数组元素个数 Node *head = NULL; // 初始化链表头指针为空 // 将数组中所有元素按从大到小顺序插入链表 for (int i = 0; i < n; i++) { insert_descending(&head, values[i]); } printf("初始有序链表(从大到小):\n"); print_list(head); // 输出插入后的链表内容 // 删除链表中所有值为 3 的节点 delete_value(&head, 3); printf("删除所有值为 3 后的链表:\n"); print_list(head); // 释放链表占用的所有内存 free_list(head); return 0; // 程序正常结束 }

得分 100
学习任务

浪潮君 的学生作业:

#include // 标准输入输出库,提供 printf 等函数 #include // 标准库,提供 malloc、free、exit 等函数 // 定义链表节点结构体 typedef struct Node { int data; // 节点存储的整数数据 struct Node *next; // 指向下一个节点的指针 } Node; // 创建一个新节点,传入数据值,返回节点指针 Node *create_node(int value) { Node *new_node = (Node *)malloc(sizeof(Node)); // 为新节点分配内存空间 if (!new_node) { // 判断内存分配是否成功 perror("内存分配失败"); // 输出错误信息 exit(EXIT_FAILURE); // 退出程序,返回错误码 } new_node->data = value; // 设置节点数据域 new_node->next = NULL; // 初始化节点的下一个指针为 NULL(尾节点) return new_node; // 返回新节点指针 } // 尾插法:将节点插入链表尾部,保持元素插入顺序 void append_node(Node **head, int value) { Node *new_node = create_node(value); // 创建新节点 if (*head == NULL) { // 如果链表为空,新节点即为头节点 *head = new_node; return; } Node *current = *head; // 从头节点开始遍历 while (current->next != NULL) { // 遍历找到最后一个节点 current = current->next; } current->next = new_node; // 将新节点挂到尾节点后面 } // 反转链表,改变链表节点指向,实现逆序 void reverse_list(Node **head) { Node *prev = NULL; // 记录当前节点的前一个节点,初始化为 NULL Node *curr = *head; // 当前遍历的节点,初始化为头节点 Node *next = NULL; // 临时指针,保存当前节点的下一个节点地址 while (curr != NULL) { // 遍历整个链表 next = curr->next; // 先保存当前节点的下一个节点 curr->next = prev; // 当前节点的 next 指向前一个节点,实现反转 prev = curr; // prev 向后移动,变成当前节点 curr = next; // curr 向后移动,变成原来下一个节点 } *head = prev; // 最后 prev 指向新的头节点,更新链表头指针 } // 遍历链表并打印所有节点数据 void print_list(Node *head) { printf("链表内容:"); Node *current = head; // 临时指针,从头节点开始遍历 while (current != NULL) { printf("%d ", current->data); // 打印当前节点的数据 current = current->next; // 移动到下一个节点 } printf("\n"); // 输出换行 } // 释放链表占用的动态内存,防止内存泄漏 void free_list(Node *head) { Node *tmp; while (head != NULL) { tmp = head; // 保存当前节点指针 head = head->next; // 移动到下一个节点 free(tmp); // 释放当前节点内存 } } // 主函数,程序入口 int main(void) { int values[] = {1, 5, 3, 7, 9}; // 初始化数据数组 int n = sizeof(values) / sizeof(values[0]); // 计算数组元素数量 Node *head = NULL; // 初始化链表头指针为空 // 依次将数组中的元素插入链表尾部 for (int i = 0; i < n; i++) { append_node(&head, values[i]); } printf("原始链表:\n"); print_list(head); // 打印链表内容(顺序) reverse_list(&head); // 反转链表,实现逆序 printf("逆序后链表:\n"); print_list(head); // 打印逆序后的链表内容 free_list(head); // 释放链表内存,避免泄漏 return 0; // 程序正常结束 }

得分 100
讨论题

浪潮君 的学生作业:

#include // 标准输入输出函数库(如 printf) #include // 动态内存分配和释放函数库(如 malloc、free) // 定义单向链表的节点结构体 typedef struct Node { int data; // 数据域:保存整数数据 struct Node *next; // 指针域:指向下一个节点 } Node; // 创建一个新节点,并返回指向该节点的指针 Node *create_node(int value) { Node *new_node = (Node *) malloc(sizeof(Node)); // 分配一个新节点的内存 new_node->data = value; // 设置数据域 new_node->next = NULL; // 初始时不指向其他节点 return new_node; // 返回新节点地址 } // 向链表中按从大到小顺序插入一个新节点 void insert_descending(Node **head, int value) { Node *new_node = create_node(value); // 创建新节点 // 情况一:链表为空,或新值大于头节点,插入到链表头部 if (*head == NULL || value > (*head)->data) { new_node->next = *head; // 新节点指向原头节点 *head = new_node; // 更新头指针为新节点 return; } // 情况二:寻找插入位置,插入到合适的节点之后 Node *current = *head; while (current->next != NULL && current->next->data >= value) { current = current->next; // 向后遍历,直到找到插入点 } // 在 current 节点之后插入新节点 new_node->next = current->next; current->next = new_node; } // 打印链表中的所有节点值 void print_list(Node *head) { printf("链表内容(从大到小):"); Node *current = head; while (current != NULL) { printf("%d ", current->data); // 打印当前节点的值 current = current->next; // 移动到下一个节点 } printf("\n"); } // 释放链表占用的动态内存 void free_list(Node *head) { Node *tmp; while (head != NULL) { tmp = head; // 保存当前节点 head = head->next; // 移动到下一个节点 free(tmp); // 释放当前节点 } } // 主函数:程序入口 int main() { int values[] = {1, 5, 3, 7, 9}; // 待插入的无序整数数组 int n = sizeof(values) / sizeof(values[0]); // 计算数组长度 Node *head = NULL; // 初始化链表头指针为空 // 将数组中的每个元素按顺序插入链表(保持从大到小) for (int i = 0; i < n; ++i) { insert_descending(&head, values[i]); } // 打印链表内容 print_list(head); // 释放链表内存 free_list(head); return 0; // 程序正常结束 }

得分 100
学习任务
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号