2.2 将两个线性表合并成一个线性表,允许连表中有重复

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

typedef int Status ;
typedef int ElemType;
#define OK 1
#define ERROR 0

#define LISTSIZE 10
#define ADDSIZE 2
typedef struct
{
    ElemType *elem;
    int length;
    int listsize;
}SqList;

Status InitList(SqList *L)
{
    (*L).elem=malloc(LISTSIZE*sizeof(ElemType));
    if(!(*L).elem)
        exit(OVERFLOW);
    (*L).length=0;
    (*L).listsize=LISTSIZE;
    return OK;
}
Status GetElem(SqList L,int i,ElemType *e)
{
    if(i<1||i>L.length)
        return ERROR;
    *e=*(L.elem+i-1);
    return OK;
}
Status ListInsert(SqList *L,int i,ElemType e)
{
    ElemType *newbase,*p,*q;
    if(i<1||i>(*L).length+1)
        return ERROR;
    if((*L).length>=(*L).listsize)
    {
        newbase=(ElemType*)realloc((*L).elem,((*L).length+ADDSIZE)*sizeof(ElemType));
        if(!newbase)
            exit(OVERFLOW);
        (*L).elem=newbase;
        (*L).listsize+=ADDSIZE;
    }
    p=(*L).elem+i-1;
    q=(*L).elem+(*L).length-1;
    while(p<=q)
    {
        *(q+1)=*q;
        --q;
    }
    *p=e;
    ++(*L).length;
    return OK;
}
int ListLength(SqList L)
{
    return L.length;
}
Status LocateElem(SqList L,ElemType e,Status (*compare)(ElemType ,ElemType))
{
    int i=1;
    ElemType *p,*q;
    p=L.elem;
    q=L.elem+L.length-1;
    while(p<=q&&!compare(*p,e))
    {
        ++p;
        ++i;
    }
    if(i<=L.length)
        return i;
    else
        return 0;
}
Status ListTraverse(SqList L,void(*visit)(ElemType))
{
    ElemType *p=L.elem;
    int i=1;
    while(i<=L.length)
    {
        visit(*p);
        ++p;
        ++i;
    }
    printf("\n");
    return OK;
}
Status equal(ElemType c1,ElemType c2)
{
    if(c1==c2)
        return 1;
    else
        return 0;
}
void MergeList(SqList La,SqList Lb,SqList *Lc)
{
    int i=1,j=1,k=0;
    int La_len,Lb_len;
    ElemType ai,bj;
    InitList(Lc);
    La_len=ListLength(La);
    Lb_len=ListLength(Lb);
    while(i<=La_len&&j<=Lb_len)
    {
        GetElem(La,i,&ai);
        GetElem(Lb,j,&bj);
        if(ai<=bj)
        {
            ListInsert(Lc,++k,ai);
            ++i;
        }
        else
        {
            ListInsert(Lc,++k,bj);
            ++j;
        }
    }
    while(i<=La_len)
    {
        GetElem(La,i++,&ai);
        ListInsert(Lc,++k,ai);
    }
    while(j<=Lb_len)
    {
        GetElem(Lb,j++,&bj);
        ListInsert(Lc,++k,bj);
    }
}
void print(ElemType c)
{
    printf("%d ",c);
}

void main()
{
    SqList La,Lb,Lc;
    int j,a[4]={3,5,8,11},b[7]={2,6,8,9,11,15,20};
    InitList(&La);
    for(j=1;j<=4;j++)
        ListInsert(&La,j,a[j-1]);
    printf("La=");
    ListTraverse(La,print);
    InitList(&Lb);
    for(j=1;j<=7;j++)
        ListInsert(&Lb,j,b[j-1]);
    printf("Lb=");
    ListTraverse(Lb,print);
    MergeList(La,Lb,&Lc);
    printf("Lc=");
    ListTraverse(Lc,print);
}

程序运行结果如下

时间: 2024-10-12 11:25:32

2.2 将两个线性表合并成一个线性表,允许连表中有重复的相关文章

将两个有序顺序表合并成一个新的有序顺序表

#include <stdio.h> #include <malloc.h> #include <stdlib.h> #define MaxSize 50 typedef struct { int data[MaxSize]; int length; }SqList; void ListInsert(SqList *L,int i,int e) { int j; if(i<1||i>L->length+1) exit(-1); if(L->len

两个有序数组合并成一个有序数组

两个有序数组合并成一个有序数组 1. 题目描述 数组a是有序的,数组b也是有序的,如何高效地合并它们成一个数组,并且新数组也是有序的? 2. 从后往前合并 这道题目是师兄电面阿里的时候,问到的一道题目.现在我们来说一下解法~ 假设数组a足够长,可以在数组a上合并二者.我们的解法基本思想就是从后往前合并数组. 每次合并的时候,都要比较a和b当前数组的大小,取较大的值后移,注意一定要是后移! 为什么从后往前呢?其实就是为了方便后移,因为较大的一定是在后面的. 程序如下: #include<iostr

使用SQL语句将数据库中的两个表合并成一张表

select * into 新表名 from (select * from T1 union all select * from T2)  这个语句可以实现将合并的数据追加到一个新表中. 不合并重复数据 select * from T1 union all select * from T2  合并重复数据 select * from T1 union select * from T2      两个表,表1 表2 如果要将 表1的数据并入表2用以下语句即可 insert into 表2(字段1,

sqlserver 把两个sql查询语句查询出来的两张表合并成一张表

第一个sql语句 select companyname gsmc,zb zhibiao from t_gsndzb left join t_companycode on t_gsndzb.gsbh=t_companycode.companyid 查询结果: 第二个sql语句 SELECT min(companyname) gsmc,cast(round(sum(t_xstj.hsje)/10000,2) as numeric(20,2)) ndje FROM t_xstj left join t

2.1将线性表La和Lb合并成一个线性表

#include<stdio.h> #include<stdlib.h> #include<math.h> typedef int Status ; typedef int ElemType; #define OK 1 #define ERROR 0 #define LISTSIZE 10 #define ADDSIZE 2 typedef struct { ElemType *elem; int length; int listsize; }SqList; Statu

将两个有序链表合并成一个有序链表

问题定义: 写一个函数SortedMerge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,SortedMerge的返回值是新的链表.新链表由前两个链表按元素递增顺序合并而成,也就是说它不会创建新的元素. 比如:这里有两个链表,分别是 list1: 5->10->15 list2: 2->3->20 SortedMerge函数返回一个指向新链表的指针,新链表应该是如下这样的:2->3->5->10->15->

sql server中如何将两个字段数据合并成一个字段显示(字段与字段添加特殊符号)

之前,我在做统计数据时,需要一个字段显示某月的订单数量和订单金额,要求组合成一个字段,用括号组合. 统计出来的结果大概是这样的,首先我们来创建一些模拟数据 ---创建订单表--- create table OmsOrder( Uid int identity(1,1) primary key, OrganizeName varchar(20) not null, OrderCount int not null, OrderMoney float not null ) --添加模拟数据--- in

算法 - 两个有序数组合并成一个有序数组

//两个有序数组的合并函数 public static int[] MergeList(int a[],int b[]) { int result[]; if(checkSort(a) && checkSort(b)) //检查传入的数组是否是有序的 { result = new int[a.length+b.length]; int i=0,j=0,k=0; //i:用于标示a数组 j:用来标示b数组 k:用来标示传入的数组 while(i<a.length &&

JavaScript把两个数组对象合并成一个一一对应的数组对象

合并数组或者对象在数组或对象前面加...,是es6的新写法,然后数组的map方法会返回数组. var obj1 = [{ "id": 980550455852, "model": "XQG70-S1208FW", "color": "白", "invStatusName": "正品", "bactualQty": 10947, "brea