线性表的动态分配顺序存储结构
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 2
struct Sqlist
{
ElemType *elem;
int length;
int listsize;
}
顺序表示的线性表的基本操作
构造一个新的空的线性表
Status InitList(Sqlist &l)
{
l.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!l.elem)exit(OVERFLOW);
l.length=0;
l.listsize=LIST_INIT_SIZE;
returnOK;
}
Status DestoryList(Sqlist &l)
{
free(L.elem);
l.elem=NULL;
l.length=0;
l.listsize=0;
returnOK;
}
将顺序表情况,但不是销毁
Status ClearList(Sqlist &l)
{
l.length=0;
return ok;
}
检查线性表是否为空
Status ListEmpty(Sqlist &l)
{
if(l.length==0)
return true;
else return false;
}
返回l中数据元素的个数
int listlength(sqlist &l)
{
return l.length;
}
用e返回l中第i个元素的值
status getelem(sqlist l, int i, elemtype&e)
{
if(i<1||i>l.length) exit(error);
e=*(l.elem+i-1);
return ok;
}
返回l中第1个与e满足关系compare()的数据元素的位序,若这样的元素不存在,返回0否则返回1
compare()是数据元素判定函数(满足就为1)
int locateelem(sqlist l,elemtype e,status(*compare)(elemtype,elemtype))
{
elemtype *p;
int i=1;
p=l.elem;
while(i<=l.length&!compare(*p++,e))
i++;
if(i<l.length) return i;
else return 0;
}
status priorelem(sqlist l,elemtype cure,)
{
inti=2;
elemtype *p=l.elem+1;
while(i<=l.length&&*p!=cure)
{
p++;
i++;
}
if(i>l.length) return INFEASIBLE;
else
{
pre_e=*--p;
return ok;
}
}
返回线性表中的后继
status nextelem(sqlist l,elemtypecure,elemtype &nexte)
{
int i=1;
elemtype*p=l.elem;
while(i<l.length&&*p!=cure)
{
i++;
p++;
}
if(i==l.length) return INFEASIBLE;
else
{
next_e=*++p;
returnok;
}
}
在i个位置之前插入元素e,l的长度加上1
status listinsert(sqlist &l,inti,elemtype e)
{
elemtype *newbase,*q,*p;
if(i<1||i>l.length)
return INFEASIBLE;
if(l.length>=l.size)当前存储的空间已经满了,增加分配
{
if(!(newbase=(elemtype *)realloc(l.elem,(l.listsize+LISTINCREMENT)*sizeof(elemtype))))
exit(overflow);
l.elem=newbase;新基址;
l.listsize+=LISTINCREMENT;
}
q=l.elem+i-1;q为插入元素的位置
for(p=l.elem+l.length-1;p>=q;--p)
*(p+1)=*p;
*q=e;
++l.length;
return ok;
}
删除l的dii个元素,用e返回该值,同时l的长度减去1
status listdelete(sqlist &l,inti,elemtype &e)
{
elemtype *p,*q;
if(i<1||i>l.length)
return error;
p=l.elem+i-1;
e=*p;
q=l.elem+l.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
l.length--;
returnok;
}
依次对l的每个数据进行调用函数vi,相当于遍历
status listtraverse(sqlistl,void(*vi)(elemtype&))
{
elemtype *p;
inti;
p=l.elem;
for(i=1;i<=l.length;i++)
{
vi(*p++);
}
cout<<endl;
return ok;
}
status listtraverse()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理