【文件属性】:
文件名称:线性表的基本操作
文件大小:3KB
文件格式:CPP
更新时间:2021-01-07 16:31:23
线性表
#define list_size 10
#define increment 5
#define ok 1
#include
#include
#include
typedef struct{ int *elem;
int length;
int listsize;}sqlist;
int initlist(sqlist &L)//构造一个空的线性表
{ L.elem=(int *)malloc(list_size*sizeof(int));
if(!L.elem)
printf("申请空间失败\n");
L.length=0;
L.listsize=list_size;
return ok; }
int listinsert( sqlist &L, int i, int e )//插入
{
int *p,*q,*newbase;
if(i<1||i>L.length+1)
printf("位置不合法\n");
if(L.length>=L.listsize)
{newbase=(int *)realloc(L.elem,(L.listsize+increment)*sizeof(int));//扩容
if(!newbase)
printf("扩容失败\n");
L.listsize+=increment;}
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 ok;
}
int ListDelete(sqlist &L, int i, int &e) //删除数据
{
if ((i < 1) || (i > L.length))
printf("位置不合法\n");
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 ok;
}
int Listlength(sqlist L) //长度
{ int *p=L.elem; //判断线形表是否存在
while(p)
{ return (L.length); }
}
int GetElem(sqlist L, int i,int &e) //取元素
{ if(i<1 || i>L.length)
printf("不存在此元素\n");
else
{ e=L.elem[i-1];
return e;
}
}
void MergeList(sqlist La, sqlist Lb, sqlist &Lc;)//将非递减的有序表 La 和 Lb 归并为 Lc
{
initlist(Lc); // 构造空的线性表 Lc
int i ,j ;i=j= 1; int k = 0;
int La_len = Listlength(La);
int Lb_len = Listlength(Lb);
int ai,bj;
i= j = 1, k = 0;
GetElem(La, i, ai);
GetElem(Lb, j, bj);
if (ai <= bj) // 将 ai 插入到 Lc 中
{
listinsert(Lc, ++k, ai); ++i;
}
else { // 将 bj 插入到 Lc 中
listinsert(Lc, ++k, bj); ++j;
}
while (i <= La_len) // 当La不空时
{
GetElem(La, i++, ai);
listinsert(Lc, ++k, ai);
} // 插入 La 表中剩余元素
while (j <= Lb_len)// 当Lb不空时
{
GetElem(Lb, j++, bj);
listinsert(Lc, ++k, bj);
} // 插入 Lb 表中剩余元素
}
void printlist(sqlist &L)//打印
{
int i;
printf("\n$$$$$$$$$$$$$$$$$");
printf("\n顺序表的元素为:\n");
for(i=0;i