码迷,mamicode.com
首页 > 其他好文 > 详细

顺序表的非递减数列合并

时间:2015-07-07 23:01:08      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:

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

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

顺序表的非递减数列合并

标签:

原文地址:http://blog.csdn.net/u012701023/article/details/46792545

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!