眉梢眼角藏欢

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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 == &top; }
	int			Num() { return num; }
};
 
#endif //__TLIST_H
 

#include "TList.h"
 
TList::TList(void)
{
	Init();
}
 
void TList::Init(void)
{
	top.prior = top.next = &top;
	num = 0;
}
 
void TList::AddObj(TListObj * obj)
{
	obj->prior = top.prior;
	obj->next = &top;
	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. 添加节点
  2. 删除节点
  3. 取得头节点
  4. 取得尾节点
  5. 取得下一个节点
  6. 取得上一个节点
  7. 链表是否为空的判断
  8. 取得链表节点个数
    代码优秀的地方:1.TListObj* TList::TopObj(void)函数中多次用到异或语法,使代码的长度减小但是代码的可读性更强和“高级”
    2.void TList::AddObj(TListObj * obj)函数中对于链表的指向进行双向定义,代码量小,但是思维量较大,很难想得出来这种处理方法,可借鉴
    3.代码的简洁度、命名等等都是非常的好,函数封装的很好

找一份优秀代码,理解代码功能,并讲出你所选代码优点及可以学习地方。主要找以下3种类型代码:

读源码,如从python或C++中找用线性表封装的库源码,分析代码功能及可以学习地方。
考研题种关于线性表内容。可以找参加过考研的学长学姐拿。尤其是想要考研同学,可以结合本章内容,用考研题训练学习。
ACM、PTA天梯赛、leecode面试刷题网站,找线性表相关题目阅读分析。
请按照下面内容填写代码阅读内容。请未必认真完成,如果发现应付,没有介绍代码思路、体会等扣分

posted on 2019-03-30 22:25  书写诗般代码  阅读(336)  评论(0编辑  收藏  举报