顺序表的非递减数列合并

原创 2015年07月07日 17:58:55
#include<stdio.h>     /*包含输入输出头文件*/
#define ListSize 100
typedef int DataType;
typedef struct
{
    DataType list[ListSize];
    int length;
}SeqList;
void InitList(SeqList *L)      /*将线性表初始化为空的线性表只需要把线性表的长度length置为0*/
{
    L->length=0; /*把线性表的长度置为0*/
}
int ListEmpty(SeqList L)     /*判断线性表是否为空,线性表为空返回1,否则返回0*/
{
    if(L.length==0)
        return 1;
    else
        return 0;
}

int GetElem(SeqList L,int i,DataType *e)     /*查找线性表中第i个元素。查找成功将该值返回给e,并返回1表示成功;否则返回-1表示失败。*/
{
    if(i<1||i>L.length)   /*在查找第i个元素之前,判断该序号是否合法*/
        return -1;
    *e=L.list[i-1];   /*将第i个元素的值赋值给e*/
    return 1;
}

int LocateElem(SeqList L,DataType e)    /*查找线性表中元素值为e的元素,查找成功将对应元素的序号返回,否则返回0表示失败。*/
{
    int i;
    for(i=0;i<L.length;i++)  /*从第一个元素开始比较*/
    if(L.list[i]==e)
        return i+1;
    return 0;
}

int InsertList(SeqList * L,int i,DataType e)
/*在顺序表的第i个位置插入元素e,插入成功返回1,如果插入位置不合法返回-1,顺序表满返回0*/
{
    int j;
    if(i<1||i>L->length+1)    /*在插入元素前,判断插入位置是否合法*/
    {
        printf("插入位置i不合法!\n");
        return -1;
    }
    else if(L->length>=ListSize)
    {
        printf("顺序表已满,不能插入元素。\n");
        return 0;
    }
    else
    {
        for(j=L->length;j>=i;j--)   /*将第i个位置以后的元素依次后移*/
            L->list[j]=L->list[j-1];
            L->list[i-1]=e;
            L->length=L->length+1;
                return 1;
    }
}

int DeleteList(SeqList *L,int i,DataType *e)
{
    int j;
    if(L->length<=0)
        {
            printf("顺序表已空不能进行删除!\n");
            return 0;
        }
        else if(i<1||i>L->length)
        {
            printf("删除位置不合适!\n");
            return -1;
        }
        else
        {
            *e=L->list[i-1];
        for(j=i;j<=L->length-1;j++)
            L->list[j-1]=L->list[j];
            L->length=L->length-1;
            return 1;
        }
}


int ListLength(SeqList L)
{
    return L.length;
}
void ClearList(SeqList *L)
{
    L->length=0;
}

void MergeList(SeqList A,SeqList B,SeqList *C); /*合并顺序表A和B中元素的函数声明*/

void main()
{
    int i,flag;
    DataType a[]={6,11,11,23};
    DataType b[]={2,10,12,12,21};
    DataType e;
    SeqList A,B,C;     /*声明顺序表A,B和C*/
    InitList(&A);     /*初始化顺序表A*/
    InitList(&B);     /*初始化顺序表B*/
    InitList(&C);     /*初始化顺序表C*/
    for(i=1;i<=sizeof(a)/sizeof(a[0]);i++)    /*将数组a中的元素插入到顺序表A中*/
    {
        if(InsertList(&A,i,a[i-1])==0)
            {
                printf("位置不合法");
                return;
            }
    }
    for(i=1;i<=sizeof(b)/sizeof(b[0]);i++)    /*将数组b中元素插入到顺序表B中*/
    {
        if(InsertList(&B,i,b[i-1])==0)
            {
                printf("位置不合法");
                return;
            }
    }
    printf("顺序表A中的元素:\n");
    for(i=1;i<=A.length;i++)  /*输出顺序表A中的每个元素*/
    {
        flag=GetElem(A,i,&e);  /*返回顺序表A中的每个元素到e中*/
        if(flag==1)
            printf("%4d",e);
    }
    printf("\n");
    printf("顺序表B中的元素:\n");
    for(i=1;i<=B.length;i++)  /*输出顺序表B中的每个元素*/
    {
        flag=GetElem(B,i,&e);  /*返回顺序表B中的每个元素到e中*/
        if(flag==1)
            printf("%4d",e);
    }
    printf("\n");
    printf("将在A中出现B的元素合并后C中的元素:\n");
    MergeList(A,B,&C);     /*将在顺序表A和B中的元素合并*/
    for(i=1;i<=C.length;i++)   /*显示输出合并后C中所有元素*/
        {
            flag=GetElem(C,i,&e);
            if(flag==1)
            printf("%4d",e);
        }
    printf("\n");
    getch();
}

void MergeList(SeqList A,SeqList B,SeqList *C)  /*合并顺序表A和B的元素到C中,并保持元素非递减排序*/
{
    int i,j,k;
    DataType e1,e2;
    i=1;j=1;k=1;
    while(i<=A.length&&j<=B.length)
        {
            GetElem(A,i,&e1);    /*取出顺序表A中的元素*/
            GetElem(B,j,&e2);    /*取出顺序表B中的元素*/
            if(e1<=e2)      /*比较顺序表A和顺序表B中的元素*/
                {
                InsertList(C,k,e1);   /*将较小的一个插入到C中*/
                i++;      /*往后移动一个位置,准备比较下一个元素*/
                k++;
                }
            else
                {
                InsertList(C,k,e2);   /*将较小的一个插入到C中*/
                j++;      /*往后移动一个位置,准备比较下一个元素*/
                k++;
                }
                }
    while(i<=A.length)     /*如果A中元素还有剩余,这时B中已经没有元素*/
        {
        GetElem(A,i,&e1);
        InsertList(C,k,e1);    /*将A中剩余元素插入到C中*/
        i++;
        k++;
        }
    while(j<=B.length)     /*如果B中元素还有剩余,这时A中已经没有元素*/
        {
        GetElem(B,j,&e2);
        InsertList(C,k,e2);    /*将B中剩余元素插入到C中*/
        j++;
        k++;
        }
    C->length=A.length+B.length;  /*C的表长等于A和B的表长的和*/
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

非递减顺序表的合并

//顺序表的合并 //输入元素函数 put //输出元素函数 output //合并 Merge #include #include #include using namespace ...

在线编程--输出单向链表中倒数第k个结点

题目描述输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针。 链表结点定义如下: struct ListNode { int m_nKey...
  • Mrzhoug
  • Mrzhoug
  • 2016年04月26日 19:54
  • 126

1324: 算法2-2:有序线性表的有序合并

1324: 算法2-2:有序线性表的有序合并 时间限制: 1 Sec 内存限制: 32 MB 提交: 1583 解决: 335 题目描述 已知线性表 LA 和 LB 中的数据元素按值非...

数组表示的线性表(顺序表)的基本操作,以及合并两个非递减数组线性表

1、定义线性表节点的结构,并定义节点的型和位置的型。 2、定义线性表的基本操作 3、在1,2的基础上,完成本题。 4、在main函数中进行测试:先构建两个有序的线性表,然后合并这两个线性表...

非递减顺序表的合并

//破坏原有的链表实现合并: void MergeList(List La,List Lb,List &Lc) { ListClear(Lc); ElemType ea,eb; whi...

Gym 100952H Special Palindrome 非递减的回文串、dfs打表、查数列网站OEIS

非递减的回文串、打表 比赛结束后看了下public 的代码就我们队是打表过的, 别人都是正规的过的, ⊙﹏⊙‖∣尴尬 分奇偶用 dfs 搞出非递减的左半边串, 然后求出这个的和 ans[sum + i...

按非递减顺序合并两个单调递增集合

#include #include #define OK 1 #define ERROR 0 #define OVERFLOE -2 typedef int Status; typedef int E...

基于c语言严蔚敏版的数据结构—非递减线性表的合并

【注解】正如我在线性表中基本操作中所叙述的所示,当你想定义一个自定义的新功能函数时,在头文件ADT.H中添加函数的声明,最后在自己的source代码中定义该函数即可实现函数的全局使用。我把void M...

将两个非递减的有序链表合并为一个非递增的有序链表

将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。 void MergeList(LinkList& La...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:顺序表的非递减数列合并
举报原因:
原因补充:

(最多只允许输入30个字)