合并两个线性表的实现

     题目:编写一个算法实现两个有序(从小到大)顺序表合并成为一个顺序表,合并后的结果放在第一个顺序表中,不另设新的顺序表存储(假设这两个有序顺序表中没有相同的元素)。

#define TRUE    1

#define FALSE    0 
#define OK        1 
#define ERROR    0 
#define INFEASIBLE    -1 
#define OVERFLOW    -2 
typedef int Status; 
typedef int ElemType; 
 
#define LIST_INIT_SIZE 100 
#define LISTINCREMENT  10 
typedef struct{ 
    ElemType    *elem; 
    int         length; 
    int         listsize; 
}SqList; 
 
Status InitList_Sq(SqList *L); 
Status DestroyList_Sq(SqList *L); 
Status GetElem_Sq(SqList L,int i,ElemType *e); 
Status ListInsert_Sq(SqList *L,int i,ElemType e); 
 
Status ListTraverse_Sq(SqList L,int (*visit)(ElemType L,ElemType i)); 
 
Status smaller(ElemType a,ElemType b); 
 
Status visit(ElemType L,ElemType i); 
 
#include <stdio.h> 
#include <stdlib.h>  
 
int main() 
{ 
    SqList    L1,L2; 
    int n1,n2; 
    int data,i,j,k=1; 
    ElemType *e0,*e1,*e2,*e3; 
    printf("创建线性表L1和L2 : \n"); 
    InitList_Sq(&L1);//创建L1     
    InitList_Sq(&L2);//创建L2 
 
    //为L1输入数据 
    printf("请输入一个整数确定线性表 1 中添加的元素个数 :   "); 
    scanf("%d",&n1);getchar(); 
    //输入L1的数据 
    for(i=1;i <= n1;i++) 
    {  
        printf("请输入第 %d 个元素的值 :   ",i); 
        scanf("%d",&data);getchar(); 
        ListInsert_Sq(&L1,i,data); //插入数据 
        printf("表中第%d个元素值是 %d.\n",i,data); 
    } 
    ListTraverse_Sq(L1,&visit); 
    //为L2输入数据 
    printf("请输入一个整数确定线性表 2 中添加的元素个数 :   "); 
    scanf("%d",&n2);getchar(); 
    //输入L2的数据 
    for(i=1;i <= n2;i++) 
    {   
        printf("请输入第 %d 个元素的值 :   ",i); 
        scanf("%d",&data);getchar(); 
        ListInsert_Sq(&L2,i,data); //插入数据 
        printf("插入的位置在 %d 元素值是 %d.\n",i,data); 
    } 
    ListTraverse_Sq(L2,&visit); 
     
    printf("运行结果是 :   \n"); 
/*实现思想 
    从L2尾取第一个元素e2,如果该元素的值比L1尾元素的值大,则直接把e2插入到L1尾 
    否则进入下一判断:获取L1头元素 e0,如果e2小于e0,则直接把e2插入到L1头 
    否则再进行下一判断:当L1中未比较的值只有一个时,进行判断,决定是否插入  
    否则再进行下一判断:获取L1中相邻两元素的值e1,e3 
    如果e2的值在e1和e3之间,则插入; 
    OK!收工。*/  
    for(i=L2.length;i>0;i--)   
    { 
        GetElem_Sq(L2,i,&e2); 
        for(j=L1.length;j>0;j--) 
        { 
        GetElem_Sq(L1,L1.length,&e0); 
        if(smaller(e0,e2)) 
            ListInsert_Sq(&L1,++j,e2); 
        else if(0 == j) 
            ListInsert_Sq(&L1,++j,e2); 
        else if(1 == j) 
        { 
            GetElem_Sq(L1,j,&e1); 
            if(smaller(e2,e1)) 
            { 
            ListInsert_Sq(&L1,j,e2);  
            } 
        } 
        else  
        { 
        GetElem_Sq(L1,j,&e1); 
        GetElem_Sq(L1,j-1,&e3); 
        if(smaller(e2,e1) && smaller(e3,e2)) 
        { 
            ListInsert_Sq(&L1,j,e2);  
        } 
        } 
        } 
    } 
    ListTraverse_Sq(L1,&visit); 
    printf("销毁线性表L1和L2 : \n"); 
    DestroyList_Sq(&L1); 
    DestroyList_Sq(&L2); 
    return 0; 
} 
 
Status InitList_Sq(SqList *L) 
{    //构建一个空的顺序线性表L  
    L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); 
    if(!L->elem){printf("线性表新建失败!!\n");exit(OVERFLOW);} 
    L->length = 0; 
    L->listsize = LIST_INIT_SIZE;printf("线性表新建成功!!\n"); 
    return OK; 
}//InitList_Sq  
 
Status DestroyList_Sq(SqList *L) 
{    //销毁顺序线性表L  
    if(!L->elem)exit(ERROR); 
    free(L->elem); 
    printf("线性表销毁成功!!\n"); 
    return OK; 
}//DestroyList_Sq  
 
Status GetElem_Sq(SqList L,int i,ElemType *e) 
{    //返回顺序线性表L中第i个元素的值  
    if(!L.elem){printf("线性表不存在!!\n"); return ERROR;} 
    if(i < 1 || i > L.length+1){printf("输入的位置不在线性表中!!\n");return ERROR;} 
    *e = L.elem[i-1]; 
    return OK;     
}//GetElem_Sq 
 
Status ListInsert_Sq(SqList *L,int i,ElemType e) 
{    //在顺序线性表L中第i个位置插入新元素e,L的长度加1  
    if(!L->elem){printf("线性表不存在!!\n"); return ERROR;} 
    if(i < 1 || i > L->length+1){printf("位置不在线性表中!!\n");return ERROR;} 
    if(L->length >= L->listsize) 
    { 
        ElemType newbase = (ElemType *)realloc(L->elem, 
                                (L->listsize+LISTINCREMENT)*sizeof(ElemType)); 
        if(!newbase)exit(ERROR); 
        L->elem = newbase; 
        L->listsize += LISTINCREMENT; 
    } 
    ElemType *p,*q; 
    q = &(L->elem[i-1]); 
    for(p = &L->elem[L->length-1];p >= q;--p)    *(p+1) = *p; 
    *q = e; 
    ++L->length;   
    return OK; 
     
}//ListInsert_Sq 
 
Status ListTraverse_Sq(SqList L,int (*visit)(ElemType,ElemType)) 
{    //依次对L中的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。 
    //假设visit()的功能是判断数据元素的值是否大于100,大于100返回FALSE,否则返回TRUE  
    if(!L.elem){printf("线性表不存在!!\n"); return ERROR;} 
    ElemType *p = L.elem; 
    int i=1; 
    while (i <= L.length && (*visit)(*p++,i)) 
    {     
        printf("表中第 %d 个元素是: %d \n",i,L.elem[i-1]); 
        ++i; 
        //j = (*visit)(*p++,i); 
    } 
    return OK; 
}//ListTraverse_Sq 
 
Status smaller(ElemType a,ElemType b) 
{ 
    if(a < b)return 1; 
    else return 0; 
}//smaller 
 
Status visit(ElemType L,ElemType i) 
{ 
    if(1000 >= L) 
    { 
        return TRUE; 
    } 
    else 
    { 
        return FALSE; 
    } 
}//visit


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值