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

作业社区

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

0 提交作业
0 布置作业
0 满分作业
得分 100
学习任务

慕九州9493288 的学生作业:

练习1: 【图片】 代码如下 bitree.h #ifndef __BITREE_H__ #define __BITREE_H__ #include #include typedef int datatype_t; typedef struct tree_node { datatype_t data; struct tree_node *lchild; struct tree_node *rchild; }bitree_t; extern bitree_t *create_binary_tree(int n); extern void preorder(bitree_t *root,void(*callback)(datatype_t)); extern int max_depth(bitree_t *root); extern void free_tree(bitree_t *root); #endif bitree.c #include "bitree.h" #include static bitree_t *create_node(int i,int max_val) { if(i > max_val) return NULL; bitree_t *node = (bitree_t *)malloc(sizeof(bitree_t)); if(NULL == node) { perror("malloc failed"); return NULL;} node->data = i; node->lchild = NULL; node->rchild = NULL; // 处理左孩子:检查2*i是否溢出,避免非法值导致递归异常 int left_child = 2 * i; if(i > INT_MAX / 2) { node->lchild = NULL; } else { node->lchild = create_node(left_child,max_val); // 若左孩子本应存在(left_child (INT_MAX - 1) / 2) { node->rchild = NULL; } else { node->rchild = create_node(right_child,max_val); // 若右孩子本应存在(right_child lchild); free(node); return NULL; } } return node; } bitree_t *create_binary_tree(int n) { if(n data); preorder(root->lchild,callback); preorder(root->rchild,callback); } int max_depth(bitree_t *root) { if(NULL == root) return 0; int left_depth = max_depth(root->lchild); int right_depth = max_depth(root->rchild); return (left_depth > right_depth ? left_depth : right_depth) + 1; } void free_tree(bitree_t *root) { if(NULL == root) return; free_tree(root->lchild); free_tree(root->rchild); free(root); //释放当前节点 } main.c #include "bitree.h" void print_node(datatype_t data) { printf("%d ",data); } int main() { int n = 10; bitree_t *root = create_binary_tree(n); if(NULL == root) { printf("二叉树创建失败(可能原因:n=%d非法或内存不足)!\n",n); return 1; } printf("前序遍历结果:"); preorder(root,print_node); putchar('\n'); printf("二叉树深度: %d\n",max_depth(root)); free_tree(root); root = NULL; return 0; } 结果如下: 【图片】 练习2: 代码如下: bubble.h #ifndef __BUBBLE_H__ #define __BUBBLE_H__ #include #include #include typedef int datatype_t; typedef struct node { datatype_t data; struct node *next; }linknode_t; extern linknode_t *create_empty_linklist(); extern int is_empty_linklist(linknode_t *head); extern void insert_linklist(linknode_t *head,datatype_t data); extern void print_linklist(linknode_t *head); extern void sort_linklist(linknode_t *head); extern void destroy_linklist(linknode_t *head); #endif bubble.c #include "bubble.h" linknode_t *create_empty_linklist() { linknode_t *head = (linknode_t *)malloc(sizeof(linknode_t)); if(NULL == head) { perror("malloc failed"); return NULL; } head->next = NULL; return head; } int is_empty_linklist(linknode_t *head) { return head->next == NULL ? 1 : 0; } void insert_linklist(linknode_t *head,datatype_t data) { if(NULL == head) return; linknode_t *temp = (linknode_t *)malloc(sizeof(linknode_t)); if(NULL == temp) { perror("malloc failed"); return; } temp->data = data; temp->next = head->next; head->next = temp; } void print_linklist(linknode_t *head) { if(NULL == head) return; linknode_t *p = head; while(!is_empty_linklist(p)) { printf("%d ",p->next->data); p = p->next; } putchar('\n'); } void sort_linklist(linknode_t *head) { if(NULL == head || NULL == head->next) return; int swapped = 0; linknode_t *end = NULL; do { linknode_t *prev = head; linknode_t *p = head->next; linknode_t *temp = NULL; swapped = 0; while(p->next != end) { temp = p->next; if(p->data > temp->data) { p->next = temp->next; temp->next = p; prev->next = temp; swapped = 1; } else { p = p->next; } prev = prev->next; } p = end;//本轮最大值已经到end位置 }while(swapped); } void destroy_linklist(linknode_t *head) { if(NULL == head) return; datatype_t data = 0; linknode_t *temp = NULL; linknode_t *current = head->next; while(NULL != current) { temp = current; data = temp->data; current = temp->next; free(temp); temp = NULL; } free(head); } main.c #include "bubble.h" int main() { linknode_t *head = create_empty_linklist(); for(int i = 1;i < 6;i++) { insert_linklist(head,i); } printf("排序前列表:"); print_linklist(head); printf("排序后列表:"); sort_linklist(head); print_linklist(head); return 0; } 结果如下: 【图片】 练习3: 代码如下: andlinklist.h #ifndef __ANDLINKLIST_H__ #define __ANDLINKLIST_H__ #include #include #include typedef int datatype_t; typedef struct node { datatype_t data; struct node *next; }linknode_t; extern linknode_t *create_empty_linklist(); extern void insert_data_linklist(linknode_t *head,datatype_t data); extern linknode_t *andlinklist(linknode_t *head1,linknode_t *head2); extern void destroy_linklist(linknode_t *head); extern void print_linklist(linknode_t *head); #endif andlinklist.c #include "andlinklist.h" linknode_t *create_empty_linklist() { linknode_t *head = (linknode_t *)malloc(sizeof(linknode_t)); if(NULL == head) { perror("head malloc failed");return NULL; } head->next = NULL; return head; } void insert_data_linklist(linknode_t *head,datatype_t data) { if(NULL == head) return; linknode_t *temp = (linknode_t *)malloc(sizeof(linknode_t)); if(NULL == temp) { perror("temp malloc failed"); return;} temp->data = data; temp->next = head->next; head->next = temp; } linknode_t *andlinklist(linknode_t *head1,linknode_t *head2) { if(NULL == head1) return head2; if(NULL == head2) return head1; linknode_t *p1 = head1->next; linknode_t *p2 = head2->next; linknode_t *newlinklist = NULL; linknode_t *tail = NULL; //获取头节点 if(p1->data < p2->data) { newlinklist = head1; }else{ newlinklist = head2; } //获取尾节点 tail = newlinklist; while(NULL != p1 && NULL != p2) { if(p1->data < p2->data) { tail->next = p1; p1 = p1->next; }else{ tail->next = p2; p2 = p2->next; } tail = tail->next; } tail->next = (NULL != p1) ? p1 : p2; return newlinklist; } void destroy_linklist(linknode_t *head) { if(NULL == head) return; linknode_t *temp = NULL; linknode_t *current = NULL; datatype_t data = 0; current = head->next; while(current != NULL) { temp = current; data = temp->data; current = temp->next; free(temp); temp = NULL; } free(head); } void print_linklist(linknode_t *head) { if(NULL == head) return; linknode_t *p = head->next; while(p != NULL) { printf("%d ",p->data); p = p->next; } putchar('\n'); } main.c #include "andlinklist.h" linknode_t *str2list(int str[],int len) { linknode_t *h = create_empty_linklist(); for(int i = len - 1;i >= 0;i--) { insert_data_linklist(h,str[i]); } return h; } int main() { int head1[] = {1,3,5,7,9}; int head2[] = {2,4,6,8,10}; linknode_t *h1 = str2list(head1,sizeof(head1) / sizeof(head1[0])); linknode_t *h2 = str2list(head2,sizeof(head2) / sizeof(head2[0])); print_linklist(h1); print_linklist(h2); linknode_t *h3 = andlinklist(h1,h2); print_linklist(h3); // destroy_linklist(h1); // h1 = NULL; // destroy_linklist(h2); // h2 = NULL; destroy_linklist(h3); // 是h1和h2合并后的,复用了h1和h2的内存,只需要释放h3即可 h3 = NULL; return 0; } 结果如下: 【图片】 练习4: 已经知道一棵二叉树。 先序遍历:ABDGHCEIF 中序遍历:GDHBAEICF 要求大家画出这颗二叉树。【图片】

微信客服

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

帮助反馈 APP下载

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

公众号

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