顺序表的非递减数列合并

原创 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的表长的和*/
}

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

相关文章推荐

数据结构(1)--线性表顺序表的主要操作的实现

参考书籍:数据结构(C语言版) 严蔚敏 吴伟民编著 清华大学出版社 1.基本定义 #include //顺序表:1.使用动态分配的一维数组 // 2.使用静态分配的一维数组 //本实例使...

试设计一个算法,将元素e插入L中合适的位置,使插入后L仍为非递减有序。

/* 设L是一个带头结点的非递减有序单链表的表头指针。 * 试设计一个算法,将元素e插入L中合适的位置,使插入后L仍为非递减有序。 */ #include #include #include us...

数据结构(3)线性表之顺序表C++实现

算法21 动态演示 运行结果 算法22算法实现 运行结果 算法27算法实现 运行结果算法2.1假设利用两个线性表LALA和LBLB分别表示两个集合AA和BB(即线性表中的数据元素即为集合中的成员,现要...

数据结构C语言版(答案)

第1章  绪论 1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。 解:数据是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处...
  • hrdzkj
  • hrdzkj
  • 2012-09-15 22:27
  • 27032

设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性

设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性 先建立一个待插入的结点,然后依次与与链表中的各结点的数据域比较大小,找到插入该结点的位置,最后插入该结...

在有序的顺序表 L 中保序插入数据元素 x

设顺序表L中的数据元素递增有序。 试写一算法,将x插入到L的适当位置上,并保 持该表的有序性。 实现函数如下:

数据结构(23)--排序篇之插入排序

参考书籍:数据结构(C语言版)严蔚敏吴伟民编著清华大学出版社 1.直接插入排序 1.1基本思想     一趟直接插入排序的基本思想: 将记录L.r[i]插入到有序子序列L.r[1..i-1]中,使记录...

元素按值非递减有序排列,设计一个…

#include #define N 10 typedef struct {     int data[N];     int top; }decrease; decrease *initde...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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