A=AUB

#include<stdio.h>
#include<stdlib.h>

#define LIST_MAX 10
#define LIST_ADD 2

typedef struct
{
    int *elem;
    int length;
    int listsize;
}SqList;

int InitList(SqList *L)
{
    L->elem=(int *)malloc(LIST_MAX*sizeof(int));
    if(!L->elem)
        exit(-1);
    L->length=0;
    L->listsize=LIST_MAX;
    return 0;
}
int DestoryList(SqList *L)
{
    free(L->elem);
    L->elem=NULL;
    L->length=0;
    L->listsize=0;
    return 0;
}
int InsertElem(SqList *L,int i,int e)
{
    int *newbase,*p,*q;
    if(i<1||i>L->length+1)
        exit(-1);
    if(L->length>=L->listsize)
    {
        newbase=(int*)realloc(L->elem,(L->length+LIST_ADD)*sizeof(int));
        if(!newbase)
        {
            printf("分配空间失败!\n");
            exit(-1);
        }
        L->elem=newbase;
        L->listsize+=LIST_ADD;
    }
    p=L->elem+i-1;
    q=L->elem+L->length-1;
    for(;q>=p;q--)
        *(q+1)=*q;
    *p=e;
    ++L->length;
    return 0;
}    
int LocateElem(SqList L,int e,int (*visit)(int v1,int v2))
{
    int *p,i=1;
    p=L.elem;
    while(p<L.elem+L.length&&!visit(*p,e))
    {
        ++i;
        ++p;//需要考虑的是当在链表L中找不到满足条件的元素时,p会指向链表结尾的下一个元素的地址
    }
    if(i<=L.length)
        return i;
    else
        return 0;
}    

int Equal(int v1,int v2)
{
    if(v1==v2)
        return 1;
    else
        return 0;
}                
int GetElem(SqList L,int i,int *e)
{
    if(i<1||i>L.length)
        exit(-1);
    *e=*(L.elem+i-1);
    return 1;
}
int Union(SqList *La,SqList Lb,int (*visit)(int v1,int v2))      //主要用到的合并函数
{
    int i=1;
    int e;
    for(;i<=Lb.length;i++)
    {
        GetElem(Lb,i,&e);
        if(!LocateElem(*La,e,visit))
        {
            InsertElem(La,La->length+1,e);
        }
    }
    return 0;
}
int main()
{
    int i,e0;
    SqList La,Lb;
    
    InitList(&La);

    for(i=1;i<=6;i++)
        InsertElem(&La,i,i);    

    for(i=1;i<=6;i++)    
    {
        GetElem(La,i,&e0);
        printf("%d ",e0);
    }
    printf("\n");    

    InitList(&Lb);
    
    for(i=1;i<=6;i++)
        InsertElem(&Lb,i,2*i);

    for(i=1;i<=6;i++)    
    {
        GetElem(Lb,i,&e0);
        printf("%d ",e0);
    }
    printf("\n");
    
    Union(&La,Lb,Equal);
    
    for(i=1;i<=La.length;i++)    
    {
        GetElem(La,i,&e0);
        printf("%d ",e0);
    }
    printf("\n");
    
    DestoryList(&La);
    DestoryList(&Lb);
    
    return 0;
}

posted @ 2016-05-09 19:30  小宏~  阅读(371)  评论(0编辑  收藏  举报