第二章学习小结
第二章讲的是线性结构中的线性表,可以按照顺序存储结构和链式存储结构对它进行分类。以下是整理出来的重点:
此外,如何打代码也是一个重点。从目前打过的代码来看,我主要存在的问题是:
1.结点类型和链表类型未分清楚。
-
1 typedef struct Lnode{ 2 Elemtype data; 3 struct Lnode *next; 4 }Lnode;//定义结点类型。若用其来定义指针类型,如Lnode *Linklist,申请新的空间后,这个(头)指针就指向Lnode类型的新结点。由于结点间通过指针连接,可称Linklist是一个链表。
-
1 typedef struct { 2 Lnode *head; 3 Lnode *tail;//分别指向链表的头结点和尾结点 4 }List;//定义链表类型。如果该链表需要用到尾指针或者其他的元素(即只包含一个头指针不能满足所有的操作时),需要根据实际情况把所需的元素打包起来,定义一个链表。
-
1 typedef struct{ 2 float coef; 3 int expn; 4 }Polynomial;//定义数据元素的类型。顺序表的数据元素可以只包含一个数据,也可以包含多个数据(用结构体打包即可)。
-
1 typedef struct{ 2 Polynomial *elem; 3 int length; 4 }SqList; //定义顺序表的类型。其中的数据元素的数据类型可以是另外定义的结构体类型。
2.运行结束后没有回收申请的空间。
1 void destorylist(Linklist &L) 2 { 3 LNode *p=l1,*q; 4 while(p) 5 { 6 q=p->next; 7 delete(p); 8 p=q; 9 }//逐个删除结点 10 }
3.有时循环体中的判断语句写不好,经常会漏“指针p不为空”的条件。同时应该要考虑清楚p->next==NULL的情况该如何处理,判断是否继续进行循环时是用“p”去判断还是用"p->next"去判断。
4.容易忽略引用符号的使用。
5.考虑的情况不够全面,会漏空表、头结点这样的特殊情况。
(另外,再附上一篇博客链接:顺序表、数组的关系,大概讲清楚了它们的关系,其实区别不大...)
第二章的内容很多都跟代码相关,实践性会强一些。这次的预习是先看课本再看视频。概念是自以为理得大概清楚了,真正打起码来便开始模糊......比如发现自己没有理解循环链表相关操作的含义和目的、分不清结点和链表的定义等。我觉得我应该改改预习的方法,多动手去敲敲课本的代码熟悉它的写法这样。
另外这周的学习中有小组合作打码的环节。我发现我的同学们都太棒了!晓娜会首先考虑代码的效率,从这个角度再去确定循环条件写什么。然后大家一起讨论的时候会慢慢想到各种情况再做修改。也许这可能是我们打代码打的慢的原因吧,一开始没有先想好有什么情况再写。
总的来说,第2章的学习还是有不少收获的!下一个章节是栈和队列,目标是理解透彻。之前做pwn题也有接触过栈空间的知识,就是一直感觉自己掌握得还不是很牢固,希望学习完之后能彻底把栈空间的结构背下来而不是每次都上网去查......