1.思维导图及学习体会

1.1思维导图

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

这几周学习线性表的知识,其实就是链表与数组,这方面的知识上个学期学的不是很好,这个学期要加油。然后假期的时候我主要是看慕课上的视频,里面介绍了线性表的一些常见操作:比如创建空的线性表,删除区间,插入数字,排序还有销毁等等。以及头插法尾插法建链表。用重构链表的方法进行操作。这些都要熟练掌握,多多看书上的基本代码,以及老师所给的课堂派上的方法技巧。以后做相关题的时候才不会慌乱或者没有思路。

2.PTA实验作业

2.1题目一:本题要求实现顺序表的操作集。

                    各个操作函数的定义为:
                    List MakeEmpty():创建并返回一个空的线性表;
                    Position Find( List L, ElementType X ):返回线性表中X的位置。若找不到则返回ERROR;
                    bool Insert( List L, ElementType X, Position P ):将X插入在位置P并返回true。若空间已满,则打印“FULL”并返回false;如果参数P指向非法位置,则打      印“ILLEGAL POSITION”并返回false;
                    bool Delete( List L, Position P ):将位置P的元素删除并返回true。若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值)并返回false。

2.1.1设计思路

List MakeEmpty()
定义结构体指针PtrL
动态内存分配
PtrL指向数组长度Last,定义为-1
return PtrL
Position Find(List L, ElementType X)
定义位置i,初始化为0
while(i到L末尾或者Data[i]不为x)
i++
如果i到L末尾,返回长度-1;否则找到了x所在的位置i,返回i
bool Insert(List L, ElementType X, Position P)
{
         定义i,j
		if    P的数字为长度减一    输出“链表已满”
		    return false;
	        if    P<0或者P比Last大    输出“非法位置”
                    return false;
	        for     j = L->Last   to   P	
		将Data[j]	的值向后挪一位
                将P 位置的值赋给x,则实现了插入操作
	return true;
bool Delete(List L, Position P)
        定义变量i用于循环使用
	 if L->Last == -1
		return false;
	 if    P<0或者P比Last大    输出“非法位置”
                    return false;
		for   i = P  to  i < L->Last
		    将Data[i+1]的值赋给Data[i],覆盖前一位,从而实现删除操作
	 return true;

2.1.2代码截图



2.1.3本题PTA提交列表说明


Q1:答案错误?
A1:指针的下标和第几个总是分不清,然后也不是很懂怎么办
Q2:部分正确?
A2:我总是空表的操作不得分,然后询问大佬

2.2题目二:本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表为带头结点链表。

2.2.1设计思路

void ReverseList(LinkList &L)
定义指针p,q,p用来指向头指针的下一个,q用来存放p的值
使指针为空
  while(p不为空)
{
  q存放在p的后面
  将p的后继连到L的后继
  L的后继接上p,这样使得p插入进来
  q的值赋为p
}

2.2.2代码截图

2.2.3本题PTA提交列表说明


Q1:第一开始的思路不太懂,指针指向有些晕
A1:问了问舍友,她给我画了画图,然后突然明白了些什么。

2.3题目三:已知两个递增链表序列L1与L2,2个链表都是带头结点链表。设计函数实现L1,L2的合并,合并的链表仍然递增有序,头结点为L1的头结点。 合并后需要去除重复元素。

2.3.1设计思路

void MergeList(LinkList &L1,LinkList L2)

 定义 LinkList L1Ptr,L2Ptr;
  L1Ptr=L1->next;
  L2Ptr=L2->next;
  定义LinkList ptr1=L1Ptr,ptr2=L2Ptr;
  while(L1Ptr和L2Ptr不为空)
  {
    if(L1Ptr->data小于L2Ptr->data)
    {
      ptr1=L1Ptr;       
      L1Ptr往后循环
    }
    else if(L1Ptr->data等于L2Ptr->data)
    {
      ptr1=L1Ptr; 
      L1Ptr往后循环一个;
      L2Ptr往后循环一个;
    }
    else(即L2Ptr->data比较大)
    {
      ptr2=L2Ptr;
      L2Ptr往后循环
      ptr1的后继ptr2;
      ptr2的后继L1Ptr;
      ptr1=L1Ptr;
    }
  }
  if(L2Ptr不为空)
    让ptr1的后继指向L2Ptr;
}

2.3.2代码截图

2.3.3本题PTA提交列表说明

Q1:部分正确?
A1:第一开始,我不知道删除重复数据怎么做,就改了改。
Q2:编译错误?
A2:在我写这个的时候,发生了小意外,编译就错误了。

3.阅读代码

3.1题目:已知l为没有头结点的单链表中第一个节点的指针,每个节点数据域存放一个字符,该字符可能是英文字母字符或数字字符或其他字符。编写算法构造三个以带头结点的单循环链表表示的线性表,使每个表中只含同一类字符(要求用最少的时间个最少的空间)。

3.2解题思路:

void sort_list(List_Node * head,List_Node* english,List_Node* number,List_Node* other) //遍历、分别按要求插入三个链表中,english表示英文、number表示数字、other表示其他字符

List_Node* p = head;

定义 List_Node* temp_e 存放英文字符
定义 List_Node* temp_n 存放数组字符
定义 List_Node* temp_o 存放其他字符
while(p不为空){
if
输入a到z或者A到Z,将字符存入英文字符的链表中
else if
输入0到9,将字符存入数字字符的链表中
else
将字符存入其他字符的链表中

3.3代码截图

3.4学习体会:

这道题虽然是一道考研题,但是题目不难,思路也和上个学期学的字符串分类的类似,我记得上个学期学习字符串时也有一个题是要求你计算数字啊字母啊标点符号的数量,做法就是用if else 分类,只不过这个学期是存到链表里 ,用一些链表的很简单的输入操作来完成,与上个学期的学习类似,但又有所不同。