第二章学习小结
Posted liulei1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二章学习小结相关的知识,希望对你有一定的参考价值。
一. 本章内容小结
- 线性表定义:由n(n>=0)个数据特性相同的元素构成的有限序列。
- 线性表中元素的个数n定义为线性表长度,n=0时为空表。
- 顺序表特点:逻辑上相邻的数据元素,其物理次序也是相邻的。
- 顺序表基本操作的实现:
(a).初始化:Status InitList(SqList &L)
{//构造一个空的顺序表L
L.elem=new ElemType[MAXSIAZE];//为顺序表分配一个大小为MAXSIZE的数组空间
if(!L.elem) exit (OVERFLOW);//存储分配失败退出;
L.length=0;//空表长度为0
return Ok;
}
(b).取值:Status GetElem(SqList L, int i, ElemType &e)
{
if(i<1||i>L.length) return ERROR; //判断i值是否合理,若不合理,返回ERROR
e=L.elem[i-1];//elem[i-1]单元存储第i个数据元素
return Ok;
}
(c).查找:Status LocateElem(SqList L, ElemType e)
{//在顺序表L中查找值为e的数据元素,返回其序号
for(i=0;i<L.length;i++)
if(L.elem[i]==e) return i+1; //查找成功,返回序号i+1
return 0; //查找失败,返回0
}
(d).插入:Status ListInsert(SqList &L,int i, ElemType e)
{//在顺序表L中第i个位置插入新的元素e,i值得合法范围是1<=i<=L.length+1
if((i<1)||(i>L.length+1)) return ERROR; //i值不合法
if(L.length==MAXSIZE) return ERROR; //当前存储空间已满
for(j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j]; //插入位置及之后得元素后移
L.elem[i-1]=e; //将新元素e放入第i个位置
++L.length; //表长加1
return OK;
}
(e).删除:Status ListDelete(SqList &L,int i)
{//在顺序表L中删除第i个位元素,i值的合法范围是1<=i<=L.length+
if((i<1)||(i>L.length+1)) return ERROR; //i值不合法
for(j=i;j<L.length-1;j++)
L.elem[j-1]=L.elem[j]; //被删除元素之后的元素前移
--L.length; //表长减1
return OK;
}
- 链式存储结构特点:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。
- 首元结点是指链表中存储第一个数据元素a1的特点。
头指针是指向链表中第一个结点的指针。
- 单链表基本操作的实现:
(a).初始化:Status InitList(LinkList &L)
{//构造一个空的单链表L
L= new LNode; //生成新结点作为头结点,用头指针指向头结点
L->next=NULL; //头结点的指针域置空
return Ok;
}
(b).取值:Status GetElem(LinkList L, int i, ElemType &e)
{//在带头结点的单链表L中根据序号i获取元素的值,用e返回L中第i个数据元素的值
p=L->next,j=1; //初始化,p指向首元结点,计数器j初值赋为1
while(p&&j<1) //顺链域向后扫描,直到p为空或p指向第i个元素
{
p=p->next; //p指向下一个结点
++j; //计数器j相应加1
}
if(!p||j>1) rerurn ERROR //i值不合法i>n或i<=0
e=p->data; //取第i个结点的数据域
return OK;
}
(c).查找:LNode *LocateElem(LinkList L,ElemType e)
{//在带头结点的单链表L中查找值为e的元素
p=L->next; //初始化,p指向首元结点
while(p&&p->data!=0) //顺链域向后扫描,直到p为空或p所指结点的数据域等于e
p=p->next; //p指向下一个结点
return p; //查找成功返回值为e的结点地址,查找失败p为NULL
}
(d).插入:Status ListInsert(LinkList &L, int i, Elemtype e)
{
p=L;j=0;
while(p&&(j<i-1))
{
p=p->next;++j;
}
if(!p||j>i-1) return ERROR;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
(e).删除:Status ListDlete(LinkList &L, int i)
{//在带头结点的单链表L中,删除第i个元素
p=L;j=0;
while((p->next)&&(j<i-1)) //查找第i-1个结点,p指向该结点
{
p=p->next; ++j;
}
if(!(p->next)||(j>i-1)) return ERROR; //当i>n或i<1时,删除位置不合理
q=p->next; //临时保存被删结点的地址以备释放
P->next=q->next; //改变删除结点前驱结点的指针域
delete q; //释放删除结点的空间
return OK;
}
- 在单链表中,查找直接后继结点的执行时间为O(1),而查找直接前驱的执行时间为O(n)。
而双向链表是为了克服单链表这种单向性的缺点而存在的。
二. 完成作业或实践时解决困难的经验分享
主要还是PTA的格式问题,当然在填写时也遇到了一些困难,不过在百度上看了一些相关的代码,变解决了,那就说一下格式正确的过程吧,是同学帮助解决的
void DisplayList( SqList L )
{
for ( int i = 0; i < L.length; i++ )
cout <<L.elem[i]<< " ";
}
这儿是一开始的,问题就是在最后一个数字后面有空格
void DisplayList( SqList L )
{
for ( int i = 0; i < L.length; i++ )
cout <<L.elem[i]; if(i<L.length-1) cout<< " ";
}
然后改了这个就变成编译问题了,其实是因为没把if放入for语句里
void DisplayList( SqList L )
{
for ( int i = 0; i < L.length; i++ )
{cout <<L.elem[i]; if(i<L.length-1) cout<< " ";}
}
最后改成这样,就全部正确了
三. 分享的资料
百度搜索CSDN博客,有很多专业的人会讲解相关知识,也可以看看代码,提升自己的逻辑能力。
四. 学习过程中的困难,待解决或待改进的地方
其实困难还是挺多的,因为上学期学C++时没有认真学习,就算期末考试突击学习,也只能学点皮毛,结构体和指针都不是特别能理解。
五. 目标
利用碎片时间把C++的结构体和指针给看一遍,并且多看代码,多打代码。
以上是关于第二章学习小结的主要内容,如果未能解决你的问题,请参考以下文章