#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;
}
1.数据结构书上可运行代码--线性表的顺序表示和实现
最新推荐文章于 2023-01-10 00:19:54 发布