#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;
}

 

posted on 2019-02-20 20:31  seraph墨  阅读(169)  评论(0编辑  收藏  举报