组合两链表,并拷贝至新链表中(C版)
来源:互联网 发布:预编译sql 编辑:程序博客网 时间:2024/05/29 02:40
时间渐渐紧张,只能在闲暇时间里写写这类的小程序,不断锻炼编程的思路:
compera_list.h:
#ifndef __COMPERA_LIST_H__#define __COMPERA_LIST_H__/* * list链表边界值设定 */#define MAXSIZE_A2#define MAXSIZE_B3#define MAXSIZE_C6#include <stdio.h>#include <stdlib.h>/* * list可支持方法合集结构体 */struct list_operations;/* * list结构体 */struct list_str {unsigned char *name;unsigned int values;unsigned int private_cnt;struct list_str *next;struct list_operations *l_ops; };/* * list可支持方法 */struct list_operations {void (*init_list)(struct list_str *pList, int num_nodes);void (*sort_by_inc)(struct list_str *pList, int num_nodes);void (*print_list)(struct list_str *pList);};/* * 可提供的外部接口API */struct list_str *register_list(struct list_str *pList, int num_nodes, unsigned char *name);struct list_str *compera_list(struct list_str *pList1, struct list_str *pList2, struct list_str *pList3);#endif
compera_list.c:
#include "compera_list.h"/* * 初始化链表节点函数; *pList---> 传入链表 *num_nodes---> 链表节点数 */void init_list(struct list_str *pList, int num_nodes){int i;struct list_str *temp = pList;printf("输入%s链表节点值:\n", pList->name);for (i = 0; i < num_nodes; i++) {printf("第%d个节点值: ", i+1);scanf("%d", &pList->values);pList->next = ++temp;pList->private_cnt= num_nodes;if (i != num_nodes - 1) {pList++;}}pList->next = NULL;printf("\n");}/* * 节点数据交换函数; *i---> 前级数据 *j---> 后继数据 */void values_switch(int *i, int *j){int temp;temp = *i;*i = *j;*j = temp;}/* * 递增排序函数; *pList---> 传入链表 *num_nodes---> 链表节点数 */void sort_by_inc(struct list_str *pList, int num_nodes){struct list_str *pTemp = pList;while (pList->next) {while (pTemp->next) {pTemp = pTemp->next;if (pList->values > pTemp->values) {values_switch(&pList->values, &pTemp->values);} else {continue;}}pList = pList->next;pTemp = pList;// 重置pTemp指针指向单元}}/* * 打印节点数据函数; *pList---> 传入链表 */void print_list(struct list_str *pList){unsigned int i;printf("%s节点值打印:\n", pList->name);for (i = 0; (pList != NULL) && (i < pList->private_cnt); i++) {printf("第%d节点值为: %d\n", i+1, pList->values);pList = pList->next;}printf("\n");}struct list_operations list_ops = {.init_list = init_list,.sort_by_inc = sort_by_inc,.print_list = print_list,};/* * 注册结构体函数; *pList---> 传入链表 *num_nodes---> 链表节点数 *name---> 链表名字 */struct list_str *register_list(struct list_str *pList, int num_nodes, unsigned char *name){pList = (struct list_str *)malloc(sizeof(struct list_str) * num_nodes);pList->private_cnt= num_nodes;pList->name= name;pList->l_ops= &list_ops;return pList;}/* * 合并链表函数; *pList1---> 传入链表1 *pList2---> 传入链表2 *pList3---> 传入链表3 */struct list_str *compera_list(struct list_str *pList1, struct list_str *pList2, struct list_str *pList3){unsigned int i;struct list_str *temp = pList3;struct list_str *pRet = pList3;/* * 组合链表 */for (i = 0; i < pList1->private_cnt; i++){pList3->values = pList1->values;pList3++;if (NULL != pList1->next) {pList1++;}temp->next = pList3;temp = temp->next;}for (i = 0; i < pList2->private_cnt; i++){pList3->values = pList2->values;pList3++;if (NULL != pList2->next) {pList2++;} else {break;}temp->next = pList3;temp = temp->next;}temp->next = NULL;/* * 指针归位操作 */pList3 = pRet;return pList3;}
main.c:
#include "compera_list.h"/* * 声明要使用的全局变量: **list_A; **list_B; **list_C; */static struct list_str *list_A;static struct list_str *list_B;static struct list_str *list_C;int main(int argc, char *argv[]){unsigned int size_A;unsigned int size_B;/* * size_A:指定list_A长度 * size_B:指定list_B长度 */printf("输入A链表与B链表的长度(如2,3):");scanf("%d,%d", &size_A, &size_B);printf("\n");/* * 分配指针空间与构建list操作函数成员 */list_A = register_list(list_A, size_A, "list_A");list_B = register_list(list_B, size_B, "list_B");list_C = register_list(list_C, (size_A + size_B), "list_C");/* * 初始化节点值 */list_A->l_ops->init_list(list_A, size_A);list_B->l_ops->init_list(list_B, size_B);/* * 按递增形式排序 */list_A->l_ops->sort_by_inc(list_A, size_A);list_B->l_ops->sort_by_inc(list_B, size_B);/* * 组合list_A与list_B */list_C = compera_list(list_A, list_B, list_C);/* * 按递增形式排序 */list_C->l_ops->sort_by_inc(list_C, (size_A + size_B));/* * 打印节点内容 */list_A->l_ops->print_list(list_A);list_B->l_ops->print_list(list_B);list_C->l_ops->print_list(list_C);/* * 释放指针空间 */free(list_A);free(list_B);free(list_C);return 0;}
在娴熟的技术,都源于不断的训练。
- 组合两链表,并拷贝至新链表中(C版)
- 拷贝文件(c)
- 组合求和(C++)
- C语言实现字符串拷贝并逆序的问题
- 拷贝构造函数(C++)
- 拷贝构造函数(C++)
- c++(拷贝构造函数)
- object c的浅拷贝(地址拷贝)和深拷贝(对象拷贝)
- C拷贝
- (转载)C++:浅拷贝与深拷贝
- 【C++】浅拷贝和深拷贝(String类)
- 实现匹配文件(并自定义命名)的批量拷贝,后续上传改良版
- 文件拷贝并监听
- 【C++】浅析浅拷贝,深拷贝及写时拷贝(copy_on_write),模拟实现String类。
- 【C++】String拷贝(包含深拷贝浅拷贝)以及拷贝构造函数中几种调用的情况
- 文件夹拷贝(linux c 递归)
- C++primer(十三) 拷贝函数(续)
- 【C++】String_COW(写时拷贝)
- (三)Ibatis之与Hibernate的异同
- JS刷新当前页面
- 实例解析linux内核I2C体系结构
- (四)Ibatis之与Spring整合
- 安装程序 Repack 攻略 之 CAB 篇
- 组合两链表,并拷贝至新链表中(C版)
- canvas初级复习,简单绘图
- 如何增强 Linux 系统的安全性,第一部分: Linux 安全模块(LSM)简介
- HDU2309:ICPC Score Totalizer Software
- iOS应用崩溃日志揭秘
- 使用Aspose.Pdf修改PDF文件中的表格字段
- Nginx配置SSI
- MFC实现打开、保存文件对话框和浏览文件夹对话框(转)
- JBPM4中常用概念总结