1.本周学习总结
1.1思维导图
总结线性表内容
谈谈你对线性表的认识及学习体会。
对于本章线性表的学习,对链表的灵活性又有了新的认识,线性表这章学到了顺序表的存储结构顺序表(一般联系数组结构),线性表的存储结构是链表(用到链的知识点),链表中又分支了单链表、双链表、循环链表....单链表我认为是最常用和最基础的一种线性表储存方式,另外双链表对于特点问题解决起来更方便,循环链表不用担心指针指向空。
2.PTA实验作业
2.1.题目1:题目名称
6-1 jmu-ds-区间删除数据
2.1.1设计思路(伪代码)
begin:
函数1{
定义变量i,n;//(i用于对该数组元素进行遍历,n用来存储数组长度)
输入数组元素。
}
and then:
函数2{
定义变量j //(用于存储当前数组的新长度)max,min设置为删除区间
for i=1;i<L->length
{
then:if判断是否在该删除区间;
j++ ------》》》记长度;
}
end
L->length=j;
}
函数3{
if 判断删除操作后长度是否为0 是 ----> cout<<"***** "
else
{
对链表进行遍历
i!=L->length /////防止越界;
}
2.1.2代码截图
2.1.3本题PTA提交列表说明。
简要概括遇到的问题:
Q1:开始不理解void DelNode(SqList &L,int min,int max)中j变量为什么要设置,后来知道j其实是为了对新的链表长度的储存 qwq
A1.解决方案:开始只是用i进行遍历,没有用j进行保存长度,编译答案不对,后来增加j进行储存删除后的链表长度======答案正确
2.2 题目2
题目名称
6-7 jmu-ds-单链表逆置
2.2.1设计思路(伪代码)
begin:
{ 定义头结点,申请动态空间
head=newL;//初始化头结点
and then:重构数据
newL->next=NULL;
L=L->next;
}
while(L)//进行遍历
{
申请新的动态空间
node->data=L->data;
node->next=newL->next;
newL->next=node;
L=L->next;
}//让node指的内容等于newl指向的内容,newl指针再指node,从而得到逆序的链表
2.2.2代码截图
2.2.3本题PTA提交列表说明。
先说明一下,这道题我自己觉得很有意思,所以放上来qwq
说一下觉得难懂和有用的部分:
A1.### 图中是自己对这段代码的理解,比较抽象,所以很难用语言解释。。。。
A2. 进行重构的做法
2.3 题目3
3.1 题目
6-10 jmu-ds-有序链表的插入删除//这道题是借鉴同学的,实在做不出来
3.2 解题思路
//插入元素e函数{
申请动态空间
尾插法插入元素e
}
then:
//链表删除插入元素e{
设置flag
定义和初始化新结点p,q,头结点为p
while{
遍历查找元素e
若找到flag为0
}
//有序表删除元素e{
同样定义新结点p为头结点,r指date域
while{
找出结点为e的上一节点
}
倒叙链表
}
3.3 代码截图
3.2.3本题PTA提交列表说明。
A1.在处理有序表的删除操作时 以p->next为判断的好处是可以找到等于e的上个节点
3.4 学习体会
3、阅读代码(-2--2分)
//该代码摘录于IPMsg342r2
#ifndef __TLIST_H
#define __TLIST_H
struct TListObj {
TListObj *prior, *next;
};
class TList {
protected:
TListObj top;
int num;
public:
TList(void);
void Init(void);
void AddObj(TListObj *obj);
void DelObj(TListObj *obj);
TListObj *TopObj(void);
TListObj *EndObj(void);
TListObj *NextObj(TListObj *obj);
TListObj *PriorObj(TListObj *obj);
BOOL IsEmpty() { return top.next == ⊤ }
int Num() { return num; }
};
#endif //__TLIST_H
#include "TList.h"
TList::TList(void)
{
Init();
}
void TList::Init(void)
{
top.prior = top.next = ⊤
num = 0;
}
void TList::AddObj(TListObj * obj)
{
obj->prior = top.prior;
obj->next = ⊤
top.prior->next = obj;
top.prior = obj;
num++;
}
void TList::DelObj(TListObj * obj)
{
if (obj->next) {
obj->next->prior = obj->prior;
}
if (obj->prior) {
obj->prior->next = obj->next;
}
obj->next = obj->prior = NULL;
num--;
}
TListObj* TList::TopObj(void)
{
return top.next == &top ? NULL : top.next;
}
TListObj* TList::EndObj(void)
{
return top.next == &top ? NULL : top.prior;
}
TListObj* TList::NextObj(TListObj *obj)
{
return obj->next == &top ? NULL : obj->next;
}
TListObj* TList::PriorObj(TListObj *obj)
{
return obj->prior == &top ? NULL : obj->prior;
}
分析:
代码作者仅仅只有呢一百多行得代码就完成了双向链表
功能如下
- 添加节点
- 删除节点
- 取得头节点
- 取得尾节点
- 取得下一个节点
- 取得上一个节点
- 链表是否为空的判断
- 取得链表节点个数
代码优秀的地方:1.TListObj* TList::TopObj(void)函数中多次用到异或语法,使代码的长度减小但是代码的可读性更强和“高级”
2.void TList::AddObj(TListObj * obj)函数中对于链表的指向进行双向定义,代码量小,但是思维量较大,很难想得出来这种处理方法,可借鉴
3.代码的简洁度、命名等等都是非常的好,函数封装的很好
找一份优秀代码,理解代码功能,并讲出你所选代码优点及可以学习地方。主要找以下3种类型代码:
读源码,如从python或C++中找用线性表封装的库源码,分析代码功能及可以学习地方。
考研题种关于线性表内容。可以找参加过考研的学长学姐拿。尤其是想要考研同学,可以结合本章内容,用考研题训练学习。
ACM、PTA天梯赛、leecode面试刷题网站,找线性表相关题目阅读分析。
请按照下面内容填写代码阅读内容。请未必认真完成,如果发现应付,没有介绍代码思路、体会等扣分