DS博客作业02—线性表

1.思维导图及学习体会

1.1第一章绪论知识点思维导图

1.2.谈谈你对线性表的认识及学习体会。

  线性表最重要的就是对指针的操作,插入删除都是看指针的指向进行操作以达到改变节点,以达到目的的。对于上学期对链表的初步认识,我对它也不算陌生,虽然懂得其中的原理,但是在表达上还是有所欠缺。现在终于知道了学习指针的重要性,通过指针的不断移动进行链表的各种操作。比如:头插法可以进行链表逆置,尾插法可以合并链表等等。总体来说:想学好链表就一定要先熟练掌握指针。

2.PTA实验作业

2.1.题目1:6-4 顺序表操作集

2.1.1设计思路:

  • 按照题目要求设计算法,不过要时刻注意操作指针的位置
List MakeEmpty() 创建并返回一个空的线性表
{
	定义指针 L;
	L动态分配空间 
	初始化并返回 L 
}
Position Find(List L, ElementType X)	返回线性表中X的位置
{
	定义int类型变量 i 
	for i++ to L->Last-1
		if 找到X 
		return i; 
	end for 
	找不到则会退出循环  并返回ERROR 
}
bool Insert(List L, ElementType X, Position P)	将X插入在位置 
{
	if 栈满 
		输出 FULL 
		并返回   false   ;
	end if 
	
	if 插入X的位置在非法位置 
		输出   ILLEGAL POSITION
		return false;
	end if 
	
	for i-- to  p 
		L->Data[i + 1] = L->Data[i];
	end for
	 
	L->Data[P] = X;
	L->Last++;
	return true;
}
bool Delete(List L, Position P)
{
	if P位置合法 
	{
		printf("POSITION %d EMPTY",P);
		return false;
	}
	for i++ to L->Last-1
		L->Data[i] = L->Data[i++];
		end for
		 
	L->Last--;
	return true;
}

2.1.2代码截图



2.1.3本题PTA提交列表说明

Q1:怎么创建空链表?
A1:我们设计的链表不需要一个单独的节点,那么就直接使用head=NULL就可以表示空链表,顺序表就是L->Last = 0
Q2:怎么在链表中查找特定数据的位置?
A2:遍历链表,通过指向运算符来查找。
Reflect:上学期没把指针掌握的熟练,这学期处处是指针,真是书到用时方恨少,在不连段的碰壁之后也是慢慢找到指针的“内涵”吧,尽管做不到随心而欲,但也精进了不少,在借鉴过大佬的代码算法时,确实学来学去还是那句话:熟能生巧!

2.2.题目1:6-7 jmu-ds-单链表逆置

2.2.1设计思路:

单链表逆置讲究一个逆,目的就是要把指针的方向180°旋转,特殊位置再进行特殊照顾就可以了。

void ReverseList(LinkList &L)  单链表逆置 
{
  if  L -> next == NULL
  return ; 
  end if 
  定义指针类型 p,q,m
  p = L -> next		 p为L链表的头结点 
  q = p -> next		 q为L链表头结点的后继节点 
  p -> next = NULL;
  L = p;	 p = q;  L记录前继节点 p记录后继节点 
 
  for p ->next!=NULL(++)
   q = p -> next;
   p -> next = L;
   L = p;
   p = q;     逆置 
   end for
  m = new LNode;
  m -> next = L;     头结点
  L = m;         
}

2.2.2代码截图

2.2.3本题PTA提交列表说明

Q1:如何改变指针方向?
A1:用多个指针记录整条链以及具体操作位置的数据,然后转换指针方向,最后记得让链表指向空,并创造一个新的头结点。
Reflect:以前做过数组逆置之类的题目,对于其算法也是有所了解,但是因为链表的不熟练还是有所曲折的。虽然我想法没什么错误,但是我的代码太繁琐,记录节点太麻烦,看了大佬们的代码后,知道了原来可以直接改变指针方向,不用通过类似于重构的方法去逆置。学海无涯啊。

2.3题目3:6-10 jmu-ds-有序链表的插入删除

2.3.1设计思路

插入和删除都是对应特殊位置的操作,注意链表的特殊位置就行了

void ListInsert(LinkList &L, ElemType e)  有序链表插入元素e
{
	定义指针pre,s  
	pre记录链表L 
	while   pre->next != NULL && pre->next->data < e
		pre = pre->next;   找到插入位置的前一个结点 
	end  while 
	s = new LNode;
	s->data = e;
	
	if L->next == NULL  尾结点处特殊处理 
		L->next = s;
		s->next = NULL;
		return;         退出函数,void无返回 
	end if 
	s->next = pre->next;  普通插入 
	pre->next = s;
}
void ListDelete(LinkList &L, ElemType e)  链表删除元素e
{
	LinkList pre = L, q, p;
	q = pre->next;
	if L->next == NULL 
		return;  判断是否为空链表 
	end if 
	while  q != NULL
		if  q->data == e
			pre->next = q->next;
			p = q;
			q = q->next;
			删除节点 
			return;
		end if 
		pre = pre->next;
		q = pre->next;
	end while 
	if q == NULL
		栈满情况 "找不到!" 
		end if 
}

2.3.2代码截图


2.3.3本题PTA提交列表说明

Reflect:插入和删除时截至我们现在习得内容而言是优于数组的最突出的地方,学好这基本的链表知识也能为了以后的二叉树什么的高级算法省一些力气。

3.阅读代码

3.1 题目:递归法实现链表的反转

3.2 解题思路

node* reverse(node* head, node* pnode)
    node *nextNode = head->next;  记录头结点的后继节点
    head->next = pnode;                   实现反转
    pnode = head;                            记录前继节点  同时改变头结点
    return (nextNode == NULL) ? pnode : reverse(nextNode, pnode);
                    链表没到最后   一直反转    

3.3 代码截图

3.4 学习体会

  递归函数可以极大程度简短代码,实属高端算法。在上学期的学习中也曾使用过递归法解题,有所了解但很不熟练:在递归中函数不断引用自身,直到引用的对象已知。Skill comes from practice!
posted @ 2019-03-31 15:09  玥如  阅读(318)  评论(0编辑  收藏  举报