user-0 提问: 抽象数据类型(ADT)的问题

回复:
user: user-0
content: 引用 4 楼 fetag 的回复:如果想适应一致的不同类型，那你应该看C++的 template 部分  如果是想混用各种不同类型，那你可以看 Boost 库的 boost::any  搜索了一下 boost::any 现在完全看不懂…… C++的语法与C差别挺大……

user: user-0
content: 剩余代码：  /*  ***************************************************************  * File Name:    pet.c  * Declaration:  用户自定类型 宠物名及种类名  * Author:       jiaga  * Created Time: 2014年08月03日 星期日 10时19分50秒  ***************************************************************  */  #include <stdio.h> #include <stdlib.h> #include <string.h> #include "pet.h"   static char *get_string(char *str);  void * new_pet(void) {         Pet *pet;          pet = (Pet *)malloc(sizeof(Pet));         if (pet != NULL) {                 printf("Please input pet's name: ");                 get_string(pet->petname);                 printf("Please input pet's kind: ");                 get_string(pet->petkind);                 return (void *)pet;         } else                 return NULL; }  void show_pet(void * pet_item) {         Pet *pet;          pet = (Pet *)pet_item;         printf("name: %-20s  kind: %-20s\n", pet->petname, pet->petkind); }  static char *get_string(char *str) {         char *find;          if (fgets(str, LEN, stdin) != NULL) {                 find = strchr(str, '\n');                 if (find)                         *find = '\0';                 return str;         } else {                 return NULL;         } } /*  ***************************************************************  * File Name:    coordinate.h  * Declaration:    * Author:       jiaga  * Created Time: 2014年08月03日 星期日 10时30分01秒  ***************************************************************  */  #ifndef __COORDINATE_H #define __COORDINATE_H  typedef struct coordinate{         int x;         int y; }Coordinate;  void * new_coordinate(void); void show_coordinate(void * coordinate_item);  #endif /*  ***************************************************************  * File Name:    coordinate.c  * Declaration:  用户自定类型 坐标 X Y 值  * Author:       jiaga  * Created Time: 2014年08月03日 星期日 10时37分32秒  ***************************************************************  */  #include <stdio.h> #include <stdlib.h> #include "coordinate.h"  static int get_number(void);  void * new_coordinate(void) {         Coordinate * coordinate;          coordinate = (Coordinate *)malloc(sizeof(Coordinate));         if (coordinate != NULL) {                 printf("Please input point x: ");                 coordinate->x = get_number();                 printf("Please input point y: ");                 coordinate->y = get_number();                 return (void *)coordinate;         } else                 return NULL; }  void show_coordinate(void * coordinate_item) {         Coordinate * coordinate;          coordinate = (Coordinate *)coordinate_item;         printf("X=%d Y=%d\n", coordinate->x, coordinate->y); }  static int get_number(void) {         int number;          while (scanf(" %d", &number) != 1) {                 printf("Please input number: ");                 while (getchar() != '\n')                         continue;         }          return number; }    Makefile: objs=main.o pet.o coordinate.o list.o  test_void_list: $(objs) 	gcc -o test_void_list $(objs)  main.o: main.c list.h pet.h coordinate.h 	gcc -c main.c list.h pet.h coordinate.h  pet.o: pet.c pet.h 	gcc -c pet.c pet.h  coordinate.o: coordinate.c coordinate.h 	gcc -c coordinate.c coordinate.h  list.o: list.c list.h 	gcc -c list.c list.h  clean: 	rm test_void_list $(objs)

user: user-0
content: c++还没开始学o(╯□╰)o   现在学着c语言 还没打算这么快跨到c++。只是想问下c语言下这样的做法合适么 ，或者有没有其他的办法？

user: user-1
content: 如果想适应一致的不同类型，那你应该看C++的 template 部分  如果是想混用各种不同类型，那你可以看 Boost 库的 boost::any

user: user-0
content: /*  ***************************************************************  * File Name:    pet.h  * Declaration:  用户自定的数据结构类型及其输入输出操作。  * Author:       jiaga  * Created Time: 2014年08月03日 星期日 10时20分11秒  ***************************************************************  */  #ifndef __PET_H #define __PET_H  #define LEN 20  typedef struct pet {         char petname[LEN];         char petkind[LEN]; }Pet;  /*   * 获取类该型数据输入，  * 强制转换数据的指针为(void *)作为返回值   * 若申请存储空间失败则返回NULL  */ void * new_pet(void);  /*   * 输出该类型数据   * 从参数获取(void *)指针并做强制转换后使用  */ void show_pet(void * pet_item);  #endif

user: user-0
content: /*  ***************************************************************  * File Name:    list.c  * Declaration:  链表ADT函数  * Author:       jiaga  * Created Time: 2014年07月27日 星期日 11时05分16秒  ***************************************************************  */  #include <stdlib.h> #include "list.h"  void init_list(List *list_head) {         *list_head = NULL; }  List_node * add_to_list(List *list_head, void *(*new_item_fun)()) {         void *new_item = NULL;         List_node *new_node;         List_node *current_node = *list_head;          new_item = new_item_fun();         if (new_item == NULL)                  return NULL;         new_node = (List_node *)malloc(sizeof(List_node));         if (new_node == NULL) {                 free(new_item);   /* 如果申请节点失败，则释放用户新项目 */                 return NULL;         }          new_node->vp_item = new_item;         new_node->next = NULL;          if (*list_head == NULL) {                 *list_head = new_node;         } else {                 while (current_node->next != NULL)                         current_node = current_node->next;                 current_node->next = new_node;         }          return new_node; }  void show_list(List *list_head, void (*show_user_item)(void *vp_item)) {         List_node * current_node = *list_head;          while (current_node != NULL) {                 show_user_item(current_node->vp_item);                 current_node = current_node->next;         } }  void del_list(List *list_head) {         List_node * current_node = *list_head;         List_node * tmp;          while (current_node != NULL) {                 tmp = current_node->next;                 free(current_node->vp_item);    /* 释放用户的数据 */                 free(current_node);             /* 释放当前节点   */                 current_node = tmp;         } }

user: user-0
content: /*  ***************************************************************  * File Name:    list.h  * Declaration:    * Author:       jiaga  * Created Time: 2014年07月27日 星期日 11时02分11秒  ***************************************************************  */  #ifndef __LIST_H #define __LIST_H  typedef struct list_node{         void * vp_item;         struct list_node * next; }List_node;  typedef List_node * List;  /* 初始化链表 */ void init_list(List *list_head);  /*   * 添加用户数据结构的指针(void *)到链表，该指针由用户的函数给出   * 成功添加则返回节点指针  * 不成功则返回NULL  */ List_node * add_to_list(List *list_head, void *(*new_item)());  /* 遍历链表，将链表中每个项目的(void *)指针给用户函数做参数 */ void show_list(List *list_head, void (*traverse)(void *vp_item));  /* 释放链表所用存储空间 */ void del_list(List *list_head);  #endif