两个List合并

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

#define TRUE 1  
#define FALSE 0  
#define OK 1  
#define ERROR 0  
#define INFEASIBLE -1  
#define OVERFLOW -2  

#define LIST_INST_SIZE 5  
#define LISTINCREMENT 1  

typedef int Status;  
typedef int ElemType;  

typedef struct   
{  
        ElemType *elem;  
        int length;  
        int listsize;  
} sql;  

static ElemType element;  

/*函数名:InitList() 
  参数:sql L 
  初始条件:无 
  功能:构造一个空线性表 
  返回值:存储分配失败:OVERFLOW 
          存储分配成功:OK*/  
Status InitList(sql &L)  
{  
       if((L.elem = (ElemType*)malloc(sizeof(ElemType)* LIST_INST_SIZE)) == NULL)  
       return OVERFLOW;  
       else  
       {  
           L.length = 0;  
           L.listsize = LIST_INST_SIZE;  
           return OK;   
       }   
}   
/*函数名:DestroyList() 
  参数: sql L 
  初始条件:线性表L已存在 
  功能:销毁线性表 
  返回值:L.elem == NULL:ERRor 
          L.elem != NUll:OK*/  
Status DestroyList(sql &L)  
{  
                if(L.elem == NULL)  
                return ERROR;  
                else  
                {  
                    free(L.elem);  
                    return OK;   
                }   
}   
/*函数名:ClearList() 
  参数:sql L; 
  初始条件:线性已存在表L  
  功能:清空线性表 
  返回值:L.elem == NULL :ERROR 
          L.elem != NULL :OK*/  
Status ClearList(sql &L)  
{  
       if (L.elem == NULL) return ERROR;  
       else  
       {  
           L.length = 0;  
           return OK;  
       }   
}   

/*函数名:LIstEmpty() 
  参数:sql L; 
  初始条件:线性表存在 
  功能:判断线性表是否为空 
  返回:空:TRUE 
        非空:FALSE*/  
Status ListEmpty(sql &L)  
{   
       if (L.length == 0) return true;  
       else return false;  
}     
/*函数名:ListLength() 
  参数:sql L 
  初始条件:线性表已存在 
  功能:返回线性表长度 
  返回值:线性表长度(L.length)*/  
Status ListLength(sql &L)  
{  
       return L.length;   
}   
/*函数名:GetElem() 
  参数: SqList L, int i,ElemType *e(这里面用了全局变量element)  
  初始条件:线性表已存在 
  功能:用e返回线性表第i个元素的值 
  返回值: (i < 1)||(i > ListLength(L)) : OVERFLOW 
           1<= i <=ListLength(l) :OK*/  
Status GetElem(sql &L, int i,ElemType &e )  
{  
       if ((i < 1)||(i > ListLength(L)) )   
       return OVERFLOW;  
       int j;  
       ElemType *p;  
       p = L.elem;   
       for (j = 0; j < i - 1; j++)  
           L.elem++;   
       e = *L.elem;   
       L.elem = p;  
       return OK;   
}   
/*函数名:LocateElem() 
  参数:sql L, ElemType element 
  初始条件:线性表L已存在 
  功能:返回顺序表中第一个与element相等的元素的位序 
  返回值:若L中存在与element相等的元素,则返回 第一个符合条件的元素位序 
          若不存在,则返回0*/  
Status LocateElem(sql &L, ElemType E)  
{  
       int i;  
       ElemType *p;  
       p = L.elem;   
       for (i = 1;i <= L.length; i++)  
       {  
           if (*L.elem == E)  
           {  
                       L.elem = p;  
                       return i;   
           }   
           L.elem++;   
       }   
       L.elem = p;  
       return 0;   
}   
/*函数名:PriorElem() 
  参数:sql L, Elemtype cur_e, ElemType *pre_e 
  初始条件:线性表已存在,i>1&&i<=L.length,LocationElem()存在  
  功能:用pre_e返回线性表中cur_e的前驱 
  返回值: i<=1||i>L.length:OVERFLOW 
           i>1&&i<=L.length:OK        */  
Status PriorElem(sql &L, ElemType cur_e, ElemType *pre_e)  
{  
       ElemType *p = L.elem;  
       int i;  
       i = LocateElem(L, cur_e);     //为什么 用&L不行   因为这是按引用调用   
       if (i == 0) return OVERFLOW;  
       int j;  
       for (j = 0;j < i - 2; j++)  
       {  
           L.elem++ ;  
       }   
       *pre_e = *L.elem;    //注意 pre_e = L.elem 不行    
       L.elem = p;  
       return OK;   
}                     
/*函数名:ListInsert(); 
  参数:sql L, int i, ElemType e 
  初始条件:线性表L已存在,1 <= i <=L.length + 1; 
  功能:在线性表第i个元素前插入e 
  返回值:失败:ERROR 
          成功:OK */  
Status ListInsert(sql &L, int i, ElemType e)  
{  
       int *q = &(L.elem[i - 1]);   
       ElemType *newbase, *p;  
       if (i < 1||i > (L.length)+1)  
       return ERROR;  
       if (L.length >= L.listsize)  
       {  
                    newbase = (ElemType*)realloc(L.elem,L.listsize + LISTINCREMENT*sizeof(ElemType)) ;  
                    if (newbase == NULL)  
                    exit(OVERFLOW);  
                    L.elem = newbase;  
                    L.listsize+=LISTINCREMENT;                  
       }   
       for (p = &(L.elem[L.length - 1]);p >= q; p--)  
           *(p + 1) = *p;  
       *q = e;  
       ++L.length;  
       return OK;      
}   
/*函数名:ListDelete() 
  参数:sql L, int i;ElemType *e;  
  初始条件:线性表L已存在。1<= i <= L.length 
  功能:删除线性表中第i个元素,并用e返回被删数的值  
  返回值:失败:ERROR 
          成功:OK*/  
Status ListDelete(sql &L, int i, ElemType &e)  
{  

       if ((i < 1)||(i > L.length))   
       return ERROR;   
       e = (L.elem[i - 1]);   
       ElemType  *q;        
       for (q = &(L.elem[i - 1]); q < &(L.elem[L.length - 1]); q ++ )  
       {  
           *q = *(q + 1);   
       }   
       L.length--;  
       return OK;   
}   
Status ListSee(sql &L)  
{  
       if ((L.elem == NULL)||(L.length==0))  
       return ERROR;  
       else  
       {  
           int  i;  
           for (i = 0; i < L.length; i++)  
           {  
               printf("%d ",L.elem[i]);  
           }  
           printf("\n");  
       }  
       return OK;  
}  
Status ListScan(sql &L)  
{  
       int i, a;  
       printf("enter numbers:");  
       for (i = 0;i < LIST_INST_SIZE ; i++)  
       {  
        scanf("%d",&a);  
        ListInsert(L, L.length + 1, a);  
       }      
}  

int main()  
{  
    sql La, Lb;   
    int i, e;   
    InitList(La);                 
    InitList(Lb);      
    ListScan(La);      
    ListScan(Lb);   
    for (i = 0; i < Lb.length; i++)  
    {  
        e = Lb.elem[i];   
        if (!LocateElem(La, e))    
        ListInsert(La, La.length + 1, e);   
       // Lb.elem++;   
    }   
    printf("La = ");  
    ListSee(La);   
    system ("pause");  
    return 0;  
}  

转自http://blog.csdn.net/d_fur/article/details/7826835

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值