线性表之顺序表示

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

#define ElemType int
//数据元素的数据类型
#define LIST_INIT_SIZE 100
//线性表储存空间的初始分配量
#define LISTINCREMENT 10
//线性表储存空间的分配增量


typedef int Status;



/*--建立list线性表结构体--*/
typedef struct Sq
{
    ElemType *elem;         //存储空间基址
    int length;             //当前长度
    int listsize;           //当前分配的储存容量
} SqList;


Status InitList_Sq(SqList &L);
void out(SqList &L);

void unionL(SqList &La,SqList Lb);

void GetElem(SqList L,int i,ElemType &e);

int LocateElem(SqList &L,ElemType e);

int ListLingth(SqList &L);

Status ListDelete_Sq(SqList &L, int i, ElemType &e);

Status ListInsert_Sq(SqList &L, int i, ElemType e);

void MergeList(SqList La,SqList Lb,SqList &Lc);

int main()
{
    int i,j,e,lo,temp;
    int k;

    SqList *L=(SqList*)malloc(sizeof(SqList));
    SqList *Lb = (SqList*)malloc(sizeof(SqList));
    SqList *Lc = (SqList*)malloc(sizeof(SqList));

    //将这个表传递过去
    InitList_Sq(*L);
    InitList_Sq(*Lb);
    InitList_Sq(*Lc);

    //*p. == p->
    printf("请输La顺序表的长度:\n");
    scanf("%d",&L->length);
    printf("请输入La顺序表的各个元素:\n");
    for(i=0; i<L->length; ++i)
    {
        scanf("%d",&L->elem[i]);
    }
    printf("输入的顺序表是:\n");
    out(*L);


    //输入Lb
    printf("请输Lb顺序表的长度:\n");
    scanf("%d",&Lb->length);
    printf("请输入Lb顺序表的各个元素:\n");
    for(i=0; i<Lb->length; ++i)
    {
        scanf("%d",&Lb->elem[i]);
    }
    printf("输入的顺序表是:\n");
    out(*Lb);

    printf("判断是否存在:\n");
    scanf("%d",&k);




    printf("%dasda   sd\n",LocateElem(*L,k));



    printf("请输入插入的第几个位置后面,以及节点:\n");
    scanf("%d%d",&j,&e);
    ListInsert_Sq(*L,j,e);
    printf("插入后的顺序表为:\n");
    out(*L);
    printf("请输入要删除数据元素的的位置:");
    scanf("%d",&lo);
    ListDelete_Sq(*L,lo,temp);

    printf("被删除的元素为%d\n",temp);

     printf("删除之后为\n");
    out(*L);


    //unionL(*L,*Lb);

    // printf("合并之后的L为\n");
    // out(*L);

    MergeList(*L,*Lb,*Lc);
    printf("LA,LB合并之后为\n");
    out(*Lc);
    printf("长度为 %d",Lc->length);


    free(L);
    free(Lb);
    return 0;
}

/*--构造一个空的线性表L--*/
Status InitList_Sq(SqList &L)
{

    //申请长度
    L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L.elem)
    {
        return 0;
    }
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return 1;
}

/*--在顺序线性表L中第i个位置之前插入一个新的元素e--*/
Status ListInsert_Sq(SqList &L, int i, ElemType e)
{
    ElemType *p;
    if(i < 1 || i > L.length+1)
    {
        return 0;
    }

    if(L.length >= L.listsize)
    {
        // 当前存储空间已满,增加容量
        ElemType *newbase = (ElemType *)realloc(L.elem,
                                                (L.listsize+LISTINCREMENT)*sizeof (ElemType));
        if(!newbase)
        {
            return 0;                 // 存储分配失败
        }
        L.elem = newbase;             // 新基址
        L.listsize += LISTINCREMENT;  // 增加存储容量
    }
    ElemType *q = &(L.elem[i-1]); // q为插入位置



    for (p = &(L.elem[L.length-1]); p>=q; --p)
        *(p+1) = *p;
    // 插入位置及之后的元素右移
    *q = e;                       // 插入e
    ++L.length;                   // 表长增1
    return 1;
}

/*--在顺序线性表L中删除第i个元素,并用e返回其值--*/
Status ListDelete_Sq(SqList &L, int i, ElemType &e)
{
    ElemType *p, *q;
    if (i<1 || i>L.length)
    {
        return 0;
    }

    //删除位置
    p = &(L.elem[i-1]);
    e = *p;
    //&(L.elem[L.length-1]
    //q指向尾部
    q = &L.elem[L.length-1];
    // L.elem为数组的首部地址
    // q = L.elem+L.length-1;
    for(++p; p<=q; ++p)
    {
        *(p-1) = *p;     // 被删除元素之后的元素左移
    }
    --L.length;          // 表长减1
    return 1;
}

int ListLingth(SqList &L)
{
    return L.length;
}

//判断是否存在改元素
int LocateElem(SqList &L,ElemType e)
{
    for(int i=0; i<L.length; i++)
    {
        if(e == L.elem[i])
            return 1;
    }
    return 0;
}

void GetElem(SqList L,int i,ElemType &e)
{
    e = L.elem[i-1];
}

//将所有在Lb中,但是不在La中的元素插入到La中
void unionL(SqList &La,SqList Lb)
{
    int la_len,lb_len;
    int i;
    ElemType e;
    la_len = ListLingth(La);
    lb_len = ListLingth(Lb);
    printf("la_len = %d\n",la_len);
    printf("lb_len = %d\n",lb_len);

    for( i=1; i <= lb_len; i++ )
    {
        GetElem(Lb, i, e);

        if( !LocateElem(La, e) )
        {
            ListInsert_Sq(La, ++la_len, e);
        }

    }


}


/*
    La,Lb为有序的,也为递增
    将LA和LB合并,并按递增增加
*/
void MergeList(SqList La,SqList Lb,SqList &Lc)
{

    //k代表的个元素

    int la_len,lb_len;

    //用于临时存放La,Lb的的元素
    int ai,bj;

    int i,j,k;
    i=j=1;
    k=0;

    la_len = ListLingth(La);
    lb_len = ListLingth(Lb);
    printf("ok\n");

    while((i <= la_len)&&(j <= lb_len))
    {
        GetElem(La,i,ai);
        GetElem(Lb,j,bj);
        printf("ai = %d \n",ai);
        printf("bj = %d \n",bj);
        printf("i = %d\n",i);
        printf("j = %d\n",j);
        printf("\n");
        if(ai <= bj)
        {
            ListInsert_Sq(Lc,++k,ai);
            i++;
        }
        else
        {
            ListInsert_Sq(Lc,++k,bj);
            j++;
        }

    }
    printf("---");
     printf("i = %d\n",i);
        printf("j = %d\n",j);

    while(i <= la_len)
    {
        GetElem(La,i++,ai);
        ListInsert_Sq(Lc,++k,ai);
    }

    while(j <= lb_len)
    {
        GetElem(Lb,j++,bj);
        ListInsert_Sq(Lc,++k,bj);
    }

}//end MereList



/*--遍历输出顺序线性表--*/
void out(SqList &L)
{
    int k;
    for(k=0; k<L.length; k++)
    {
        printf("%d ",L.elem[k]);
        if(k == L.length-1)
        {
            printf("\n");
        }
    }
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值