#include<stdio.h> #include<string.h> #include<stdlib.h> struct group_st { int a; char str[80]; }; int myshow(void *p); int mycha(void *p, void *tem); int add_arr(void **p, int *n, int size, void *tem) { if(*n == 0) *p = NULL; if(*p == NULL) *n == 0; *p = realloc(*p, size * (*n+1)); if(*p == NULL) return -1; memmove(*p + (*n)*size, tem, size); (*n)++; return 0; } int del_arr(void **p, int *n, int size, void *tem, int(*mycha)(void *p1, void *tem1)) { int i; for(i = 0; i < *n && !mycha(*p + i*size, tem); i++); if(i < *n) { memmove(*p+i*size, *p+(i+1)*size, (*n-i-1)*size); (*n)--; *p = realloc(*p, (*n)*size); } return 0; } int mycha(void *p, void *tem) //用户定义函数 { if(((struct group_st *)p)->a == ((struct group_st *)tem)->a) return 1; else if(strcmp(((struct group_st *)p)->str, ((struct group_st *)tem)->str) == 0) return 1; else return 0; } int cha_arr(void **p, int *n, int size, void *tem,int mycha(void *p, void *tem), int myshow(void *)) { int i; for(i = 0; i < *n && !mycha(*p + i*size, tem); i++); if(i < *n) myshow(*p + i*size); return 0; } int show_arr(void **p, int n, int size,int myshow(void *p)) { int i; for(i = 0; i < n; i++) { myshow(*p + i*size); } return 0; } int myshow(void *p) //用户定义函数 { printf("%d %s\n", ((struct group_st *)p)->a, ((struct group_st *)p)->str); return 0; } int main (void) { void *p = NULL; int n = 0; int sel_mod; struct group_st *tem = NULL; int del_mod; tem = malloc(sizeof(struct group_st)); while(1) { printf("请选择模式,1增加元素,2删除元素,3查找元素,4显示全部,5退出\n"); scanf("%d",&sel_mod); sel_mod = sel_mod%5; switch(sel_mod) { case 1: //增加 printf("请输入编号和字符串\n"); scanf("%d %s", &(tem->a), tem->str); add_arr(&p, &n, sizeof(struct group_st), tem); break; case 2: //删除 printf("您要通过1编号、2字符串来删除元素\n"); scanf("%d", &del_mod); tem->a = 0; tem->str[0] = '\0'; printf("请输入要删除的元素\n"); switch(del_mod) { case 1: scanf("%d", &tem->a); break; case 2: scanf("%s", tem->str); break; default : break; } del_arr(&p, &n, sizeof(struct group_st), tem, mycha); break; case 3: //查找 printf("您要通过1编号、2字符串来查找元素\n"); scanf("%d", &del_mod); tem->a = 0; tem->str[0] = '\0'; printf("请输入要查找的元素\n"); switch(del_mod) { case 1: scanf("%d", &tem->a); break; case 2: scanf("%s", tem->str); break; default : break; } cha_arr(&p, &n, sizeof(struct group_st), tem, mycha, myshow); break; case 4: printf("共%d个元素\n",n); show_arr(&p, n, sizeof(struct group_st), myshow); break; case 0: return 0; default : break; } } return 0; }