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

作业社区

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

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

Latesumme 的学生作业:

练习1: #include #include #include #define N 6 typedef struct tree_node { int n; struct tree_node *left; struct tree_node *right; }tree_node; tree_node *create_tree_node(int n) { if(n > N) return NULL; tree_node *root = NULL; root = (tree_node *)malloc(sizeof(tree_node)); memset(root,0,sizeof(tree_node)); root->left = root->right = NULL; root->n = n; if(2 * n left = create_tree_node(2 * n); if(2 * n + 1 right = create_tree_node(2 * n + 1); return root; } int tree_deep(tree_node *root) { if(root == NULL) return 0; int left_deep = tree_deep(root->left); int right_deep = tree_deep(root->right); return (left_deep > right_deep ? left_deep : right_deep) + 1; } void tree_free(tree_node *root) { if(root == NULL) return; tree_free(root->left); tree_free(root->right); free(root); } int main() { tree_node *root = NULL; root = create_tree_node(1); printf("%d\n",tree_deep(root)); tree_free(root); return 0; } 练习2: #include #include #include typedef struct linknode { int data; struct linknode *next; }linknode_t; linknode_t *create_linknode_t() { linknode_t *head = NULL; head = (linknode_t *)malloc(sizeof(linknode_t)); memset(head,0,sizeof(linknode_t)); head->next = NULL; return head; } void input_linknode(linknode_t *head,int data) { linknode_t *new = NULL; new = (linknode_t *)malloc(sizeof(linknode_t)); new->data = data; new->next = NULL; linknode_t *p = head; while(p->next != NULL){ p = p->next; } p->next = new; } void sort_linklist(linknode_t *head) { if(head == NULL || head->next == NULL) return ; for(linknode_t *p = head->next; p != NULL; p = p->next){ for(linknode_t *q = p->next; q != NULL; q = q->next){ if(p->data >q->data){ p->data ^= q->data; q->data ^= p->data; p->data ^= q->data; } } } } void output(linknode_t *head) { linknode_t *p = head->next; while(p){ printf("%d ",p->data); p = p->next; } printf("\n"); } int main() { linknode_t *head = NULL; head = create_linknode_t(); printf("请输入5个数字:\n"); int a; for(int i = 0; i < 5; i++){ scanf("%d",&a); input_linknode(head,a); } printf("排序前:"); output(head); sort_linklist(head); printf("排序后:"); output(head); free(head); head = NULL; return 0; } 练习3 #include #include // 单向链表节点结构体(和你之前的代码完全一致) typedef struct linknode { int data; struct linknode *next; } linknode_t; // head1: 1 3 5 7 9 // head2: 2 4 6 8 10 // 合并后: 1 2 3 4 5 6 7 8 9 10 linknode_t *and_linklist(linknode_t *head1, linknode_t *head2) { // 1. 边界处理:如果其中一个链表为空,直接返回另一个 if (head1 == NULL) return head2; if (head2 == NULL) return head1; // 2. 创建虚拟头节点(dummy head),简化头节点处理 linknode_t dummy; linknode_t *p = &dummy; // p 用来遍历,构建新链表 // 3. 双指针遍历两个链表,按大小拼接 while (head1 != NULL && head2 != NULL) { if (head1->data data) { p->next = head1; // 把小的节点挂到新链表 head1 = head1->next; // head1 后移 } else { p->next = head2; // 把小的节点挂到新链表 head2 = head2->next; // head2 后移 } p = p->next; // 新链表指针后移 } // 4. 把剩余未遍历完的链表直接挂到末尾 if (head1 != NULL) p->next = head1; if (head2 != NULL) p->next = head2; // 5. 返回虚拟头节点的下一个节点,就是合并后的链表头 return dummy.next; } // 创建链表(尾插法) linknode_t *create_linklist(int arr[], int len) { if (len == 0) return NULL; linknode_t *head = NULL, *tail = NULL, *new = NULL; for (int i = 0; i < len; i++) { new = (linknode_t *)malloc(sizeof(linknode_t)); new->data = arr[i]; new->next = NULL; if (head == NULL) head = tail = new; else { tail->next = new; tail = new; } } return head; } // 打印链表 void print_linklist(linknode_t *head) { linknode_t *p = head; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } // 释放链表 void free_linklist(linknode_t *head) { linknode_t *tmp = NULL; while (head != NULL) { tmp = head; head = head->next; free(tmp); } } // 主函数测试 int main() { int arr1[] = {1, 3, 5, 7, 9}; int arr2[] = {2, 4, 6, 8, 10}; int len1 = sizeof(arr1) / sizeof(arr1[0]); int len2 = sizeof(arr2) / sizeof(arr2[0]); linknode_t *head1 = create_linklist(arr1, len1); linknode_t *head2 = create_linklist(arr2, len2); printf("链表1:"); print_linklist(head1); printf("链表2:"); print_linklist(head2); linknode_t *new_head = and_linklist(head1, head2); printf("合并后:"); print_linklist(new_head); free_linklist(new_head); return 0; } 练习4:【图片】

得分 100
学习任务

学无止境呀呀呀 的学生作业:

debug.h #ifndef _DEBUG_H_ #define _DEBUG_H_ //输出debug调试信息 #define DEBUG_INFO(args...) do{\ char b__[1024];\ sprintf(b__,args);\ fprintf(stderr,"[%s,%s,%d] :%s,__FILE__,__FUNCTION__,__LINE__,b__"); \ }while(0) #endif file_transfer.h #ifndef __TCP_FILE_H_ #define __TCP_FILE_H_ #define FILENNAME_SZ 1024 #define CMD_PUT 1 // 上传 #define CMD_GET 2 // 下载 #define CMD_LS 3 // 列目录 typedef struct file_protocol{ size_t filesize;//文件大小 char filename[FILENNAME_SZ];//文件名 }file_protocol_t; typedef struct { int cmd; // 命令 size_t filesize; char filename[1024]; } protocol_t; //接收协议头信息 extern int recv_protocol_head(int cfd,file_protocol_t *p_head); //接收文件数据并写入到本地文件中 extern int recv_filedata(int cfd,const char *filename,size_t targetsize); //服务端接收客户端上传文件的协议 extern int client_upload_file(int cfd); //客户端发送协议头给服务端 extern int send_protocol_head(const char *filename,int sockfd); //客户端调用的文件下载 extern int client_download_file(const char *filename,int sockfd); //服务端发送文件 extern int server_send_file(int sockfd); //上传文件 extern int upload_file(const char *filename,int sockfd); #endif tcpsocket.h #ifndef __TCP_SOCKET_H_ #define __TCP_SOCKET_H_ #include #include #include #include #include #include #include #include //创建并初始化tcp服务器socket extern int create_tcp_server_socket(const char *ip,unsigned short port); //创建客户端socket初始化 extern int create_tcp_client_socket(const char *svr_ip,const unsigned short svr_port); //服务器等待链接 extern int wait_for_connect(int sfd,struct sockaddr_in *cli_addr); //显示客户端链接地址信息 extern void show_tcp_network_address(struct sockaddr_in *sockaddr); //发送 extern ssize_t tcp_send_pack(int sockfd,const void *buf,size_t len); //接收 extern ssize_t tcp_recv_pack(int sockfd,const void *buf,size_t len); #endif file_transfer.c #include "file_transfer.h" #include "debug.h" int recv_protocol_head(int cfd,file_protocol_t *p_head) { ssize_t rbytes = 0,total_received = 0; char *buffer = (char *)p_head; //按照字节流接收 //进行循环接收防止tcp粘包 for(;;) { rbytes = tcp_recv_pack(cfd,buffer+total_received,sizeof(file_protocol_t) - total_received); if(rbytes == -1) { DEBUG_INFO("[ERROR]: %s",strerror(errno)); return -1; }else if(rbytes == 0) { DEBUG_INFO("[INFO]: The client has been shuwdown.\n"); break; }else { total_received += rbytes; if(total_received == sizeof(file_protocol_t)) //接收固定长度的数据 { break; } } } if(total_received != sizeof(file_protocol_t)) { DEBUG_INFO("[ERROR]: Failed to receive data.\n"); return -1; } return 0; } //接收文件数据 int recv_filedata(int cfd,const char *filename,size_t targetsize) { int fd; ssize_t rbytes = 0,wbytes = 0,file_size = 0; char buffer[1024] = {0}; DEBUG_INFO("[INFO] : filename %s\n",filename); fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0666); if(fd == -1) { DEBUG_INFO("[ERROR] Failed to open filename.\n"); return -1; } for(;;) { //int sockfd,const void *buf,size_t len rbytes = tcp_recv_pack(cfd,buffer,targetsize); if(rbytes == -1) { DEBUG_INFO("[ERROR]: %s",strerror(errno)); return -1; }else if(rbytes == 0) { DEBUG_INFO("[INFO]: The client has been shutdown.\n"); break; }else if(rbytes >0) { wbytes = write(fd,buffer,rbytes); if(wbytes != rbytes) { DEBUG_INFO("[ERROR]: write.\n"); return -1; } file_size += rbytes; } if(file_size == targetsize){ break; } } close(fd); return file_size; } //客户端调用文件上传,服务端使用 int client_upload_file(int cfd) { int ret; char *filename; size_t filesize = 0,recvsize = 0; file_protocol_t head; //接收协议头 ret = recv_protocol_head(cfd,&head); if(ret == -1) return -1; filename = head.filename; filesize = head.filesize; recvsize = recv_filedata(cfd,filename,targetsize); printf("Recv %%%d\n",(int)(recvsize * 1.0/filesize) * 100); return recvsize; } //发送协议头 int send_protocol_head(const char *filename,int sockfd) { int fd,filesize,ret; file_protocol_t head; fd = open(filename,O_RDONLY); if(fd == -1) { DEBUG_INFO("[ERROR] Failed to open filename.\n"); return -1; } filesize = lseek(fd,0,SEEK_END); close(fd); head.filesize = filesize; strcpy(head.filename,filename); ret = tcp_send_pack(sockfd,&head,sizeof(head)); if(ret != sizeof(file_protocol_t)) { DEBUG_INFO("[ERROR] Failed to send protocol head.\n"); return -1; } return filesize; } //客户端调用的文件上传 int upload_file(const char *filename,int sockfd) { int file_size,upload_size,fd; ssize_t rbytes = 0,sbytes = 0; char buffer[1024] = {0}; //发送协议头信息 file_size = send_protocol_head(filename,sockfd); if(file_sizesin_addr)); printf("port :%s\n",ntohs(sockaddr->sin_port)); } //发送数据 ssize_t tcp_send_pack(int sockfd,const void *buf,size_t len) { return send(sockfd,buf,len,0); } //读取数据 ssize_t tcp_recv_pack(int sockfd,const void *buf,size_t len) { return recv(sockfd,buf,len,0); } server.c #include "tcpsocket.h" #include "debug.h" #include #include #include "file_transfer.h" //线程执行函数 void *do_task(void *arg) { int cfd = *(int *)arg; free(arg);//释放arg protocol_t p; // 接收命令 int ret = tcp_recv_pack(cfd, &p, sizeof(p)); if(ret d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; snprintf(temp, sizeof(temp), "%s\n", entry->d_name); strncat(buffer, temp, sizeof(buffer) - strlen(buffer) - 1); } closedir(dir); // 直接发送给客户端 tcp_send_pack(sockfd, buffer, strlen(buffer)); return 0; } int main(int argc,char *argv[]) { int sfd,cfd,ret; struct sockaddr_in cli_addr; pthread_t tid; if(argc!=3) { fprintf(stderr,"Usage : %s < ip > < port >.\n",atgv[0]); exit(EXIT_FAILURE); } sfd = create_tcp_server(argv[1],atoi(argv[2])); if(sfd == -1) exit(EXIT_FAILURE); for(;;) { bzero(&cli_addr,sizeof(struct sockaddr_in)); cfd = wait_for_connect(sfd,&cli_addr); if(cfd == -1) exit(EXIT_FAILURE); show_tcp_network_address(&cli_addr); //创建子线程,用于接收上传文件 ret = pthread_create(&tid,NULL,do_task,(void *)&cfd); if(ret != 0) { DEBUG_INFO("[ERROR] pthread_create(): %s\n",strerror(errno)); exit(EXIT_FAILURE); } //进行线程分离 pthread_detach(tid); } close(cfd); close(sfd); return 0; } client.c #include "tcpsocket.h" #include "file_transfer.h" #include //下载 int client_get(const char *filename, int sockfd) { protocol_t p = {0}; p.cmd = CMD_GET; strcpy(p.filename, filename); // 发送请求 tcp_send_pack(sockfd, &p, sizeof(p)); // 接收服务器返回(文件信息) recv_protocol_head(sockfd, &p); printf("Downloading %s (%ld bytes)\n", p.filename, p.filesize); // 接收文件 return recv_filedata(sockfd, p.filename, p.filesize); } //上传 int client_put(const char *filename, int sockfd) { protocol_t p = {0}; p.cmd = CMD_PUT; strcpy(p.filename, filename); tcp_send_pack(sockfd, &p, sizeof(p)); // 发送文件 return upload_file(filename, sockfd); } //列出 int client_ls(int sockfd) { protocol_t p = {0}; p.cmd = CMD_LS; tcp_send_pack(sockfd, &p, sizeof(p)); char buffer[4096] = {0}; int n = tcp_recv_pack(sockfd, buffer, sizeof(buffer)); if(n > 0) { write(1, buffer, n); // 输出到屏幕 } return 0; } int main(int argc,char *argv[]) { int cfd; if(argc

微信客服

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

帮助反馈 APP下载

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

公众号

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