顺序表合并c语言

该博客介绍了如何使用C语言实现两个非递减有序的顺序表LA和LB的归并,生成新的非递减有序顺序表LC。通过示例展示了具体的操作过程,并提供了完整的C代码实现顺序表的合并功能。

例2-2;已知线性表LA和B中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC且LC中的数据元素仍按值非递减有序排列例如

LA=(3,5,8,11)

LB=(2,6,8,9,11,15,20)

则Lc(2,3,5,6,8,8,9,11,11,15,20)

//代码如下

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50
typedef struct l
{
    int data[MAXSIZE];
    int length;//顺序表中当前的有效元素
    
}sqlist;

//初始化
void initlist(sqlist*l)
{
    
    int i;
    for (i=0;i<MAXSIZE;i++)
    {
        l->data[i]=0;
        
    }
    l->length=0;
        
}

sqlist* creatlist(sqlist*l)
{
    
    int i,val;
    printf("请输入数据\n");
    printf("请输入数字,若输入下一个数字则输入空格,输入-1时停止\n");
    scanf("%d",&val);
        for (i=0;i<MAXSIZE;i++)
        {
            if(val!=-1)
            {
            
            l->data[i]=val;
            l->length++;
            scanf("%d",&val);
            
            }
        }        
    return l;
}

void output(sqlist*l)
{
    
    int i;
    for (i=0;i<l->length;i++)
    {
        printf("%d\t",l->data[i]);
        
    }
    printf("\n");    
}
void mergelist(sqlist *l1,sqlist*l2,sqlist*l3)
{
    
int i,j;
int m;
i=0;
j=0;
int k=0;
m=0;
for(k=0;k<l2->length;k++)
{

while (l1->data[i]==l2->data[j]&&j<l2->length )  
{
    
    l3->data[m]=l1->data[i];
    l3->data[m+1]=l2->data[j];
    l3->length = l3->length+2;
    
    m=m+2;
    i++;
    j++;
    
    
}

   
while (l1->data[i]<l2->data[j]&&i<l1->length)

    {
    

       l3->data[m]=l1->data[i];
       i++;
       m++;
       l3->length++;
           
    }
    
    while (l1->data[i]>l2->data[j]&&j<l2->length)
    {
        
        l3->data[m]=l2->data[j];
        j++;
        m++;
        l3->length++;
    
    }
    
    while(i>=l1->length&&j<l2->length)
    {
        
        l3->data[m]=l2->data[j];
        m++;
        l3->length++;
        j++;
    }

}
        
}

int main()
{
    
    sqlist l1;
    sqlist l2;
    sqlist l3;
    initlist(&l1);
    initlist(&l2);
    initlist(&l3);
    creatlist(&l1);
    creatlist(&l2);
    output (&l1);
    output(&l2);
    mergelist(&l1,&l2,&l3);
    output(&l3); 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值