1.数据结构书上可运行代码--线性表的顺序表示和实现

#include <iostream>

using namespace std;
#define INIT_SIZE 100 //空间初始分配量
#define INCREMENT 10 //增量
typedef struct node1//静态分配
{
    int elem[INIT_SIZE];
    int length;
};
typedef struct node2//动态分配
{
    int *elem;	//存储空间基址
    int length;		//当前长度(元素个数)
    int listsize;		//存储容量
} SqList;
int InitList_sq(SqList &L)
{
    L.elem = (int *)malloc(INIT_SIZE*sizeof(int));
    if (L.elem==NULL)
        return 0;
    L.length = 0;
    L.listsize = INIT_SIZE;
    return  1;
}// InitList_sq
int  ListInsert_sq(SqList &L, int i, int x)//*1.1将元素x插入在线性表L的第i个元素位置上
{
    if (i < 1 || i > L.length+1)
        return  0;
    if (L.length >= L.listsize)
    {
        int *newbase = (int *)realloc(L.elem,(L.listsize+INCREMENT)*sizeof(int));
        if (!newbase)
            return 0;
        L.elem = newbase;
        L.listsize += INCREMENT;
    }
    int *q = &(L.elem[i-1]), *p;
    //q为插入位置,C语言数组下标从0开始
    for(p = &(L.elem[L.length-1]); p >= q; --p)
        *(p+1)=*p;
    *q = x;
    L.length++;
    return 1;
}//ListInsert_sq
int ListDelete_sq(SqList &L, int i, int &e) //*1.2在顺序线性表L 中删除第i 个元素,并用e 返回其值
{
    if((i<1)||(i>L.length)) //i 值不合法
        return 0;
    int *p=&(L.elem[i-1]); //p 为被删除元素的位置
    e=*p; //被删除元素赋值给e
    int *q=L.elem+L.length-1; //表尾元素的位置
    for(++p; p<=q; ++p) //被删除元素之后的元素左移
        *(p-1)=*p;
    --L.length; //表长减1
    return 1;
}
int MergeList_Sq(SqList La,SqList Lb,SqList &Lc)//*1.3已知顺序线性表La 和Lb 的元素按值非递减排列
//归并La 和Lb 得到新的顺序线性表Lc,Lc 的元素也按值非递减排列
{
    int *pa=La.elem;
    int *pb=Lb.elem;
    Lc.listsize=Lc.length=La.length+Lb.length;
    int *pc=Lc.elem=(int *)malloc(Lc.listsize*sizeof(int));
    if(!Lc.elem)
        return 0; //存储分配失败
    int *pa_last=La.elem+La.length-1;
    int *pb_last=Lb.elem+Lb.length-1;
    while(pa<=pa_last&&pb<=pb_last)  //归并
    {
        if(*pa<=*pb)
            *pc++=*pa++;
        else
            *pc++=*pb++;
    }
    while(pa<=pa_last)
        *pc++=*pa++; //插入La 的剩余元素
    while(pb<=pb_last)
        *pc++=*pb++; //插入Lb 的剩余元素
}
int main()
{
    SqList L, L1, L2;
    InitList_sq(L);
    InitList_sq(L1);
    for(int i=1; i<=5; i++)
    {
        ListInsert_sq(L, i, i);
    }
    int x;
    ListDelete_sq(L, 2, x);
    for(int i=1; i<=5; i++)
    {
        ListInsert_sq(L1, i, i*2);
    }
    for(int i=0; i<L.length; i++)
    {
        printf("%d ", L.elem[i]);
    }
    printf("\n");
    for(int i=0; i<L1.length; i++)
    {
        printf("%d ", L1.elem[i]);
    }
    printf("\n");
    MergeList_Sq(L, L1, L2);
    for(int i=0; i<L2.length; i++)
    {
        printf("%d ", L2.elem[i]);
    }
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42137874/article/details/107688921