• DS博客作业02-线性表


    1.本周学习总结

    1.1思维导图

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

    1.线性表的内容上了几星期的课,我觉得线性表的内容还是很丰富的,有插入啊,删除啊,合并啊等等算法,这些都是比较基础的操作,要尽量把它学好,这样对于以后更高阶的算法会比较轻松。
    2.印象中比较重要的就是链表了,链表中比较基础的操作就是头插法尾插法了,我觉得链表要注意的就是指针所指的位置了,在进行操作的时候可不能乱了,这样会导致链表断了,会出现错误。要把链表学好,这样对于后面的等算法有很大的好处。
    3.对于这次的pta作业,有很多是书上有的,不会的话可以参考书籍,或者是自己已经写好了,可以去参考一下书上的代码,因为书上的代码都是一些简单易懂的算法,而且它的算法复杂度也是比较低的,所以可以多参考参考书籍。
    4.对于要写出优秀的算法那肯定不是可以马上学成的,需要经过时间,以及大量的编程来训练自己,有时候觉得自己的代码写得不好的话也可以多参考参考同学的代码,多理解理解,不会的话还可以请教同学,然后进行消化,最后成为自己的东西。

    2.PTA实验作业

    2.1.题目1:题目名称

    jmu-ds- 顺序表删除重复元素
    

    2.1.1设计思路(伪代码)

    设计思路:创建两个静态数组a,b,用数组a来判断该数是否重复,用数组b来保存没重复的数,最后令线性表等于数组b;
    
    • void CreateSqList(List &L,int a[],int n)创建有序表
    L动态申请内存;
    令L->length等于n;
    定义i用来循环
    for  i=0  to  i<n
          L->data[i]=a[i];
    end for
    
    • void DelSameNode(List &L)删除重复元素
    int i=j=k=0控制循环
    //判断是否重复
    for  i=0  to  i<L->length
        for  i=0  to  i<L->length 
              if  L->data[j]等于L->data[i]  then  a[j]=1  
        end for
    end for
    //删除重复的数
    for  i=0  to  i<L->length
         if  第i个元素重复  then  continue
         else  b[k]=L->data[i]  k++
    end for
    //把删除后的数组转移到线性表
    for  k=0  to  k<L->length
         L->data[k]=b[k]
    

    2.1.2代码截图

    2.1.3本题PTA提交列表说明。

    PS:由于是在DEVC上写好的代码,也是在上面进行调试的,所以在PTA的提交列表中出现错误的会比较少,其实也是调试挺久的。

    • Q1:写该题的时候思路还是挺清晰的,因为该题和以前的数组删除重复元素是差不多的,所以写的时候就有思路了,可是由于一开始马虎定义数组的时候没有用静态定义,所以出现了错误。
    • A1:后来改用静态static来定义,问题才解决了。
    • Q2:之后又出现了段错误的结果,找了很还是没有找到,要调试也不行,所以只好找以前的代码进行一下比较,才发现原来是循环哪里定义的时候出错了。
    • A2:开始的时候我把j=i,所以导致了错误,后来改成j=i+1,才解决了问题。
    • A3:最后还有一点就是删除完要对线性表的长度进行从新的定义,不然也会出错的。

    2.2.题目2:题目名称

    jmu-ds-单链表逆置
    

    2.2.1设计思路(伪代码)

    设计思路:定义指针p来遍历链表,指针q用来指要逆置的节点,p,q同时移动,q指针移动到头结点L的后面,最终完成链表的转置。
    
    • void ReverseList(LinkList &L)链表逆置
    定义p用来遍历指针,q用来指向要转置的节点
    p指向L->next
    L->next=NULL
    //对链表进行转置
    while  p  do
         q=p做为要转置的节点
         p=p->next
         q->next=L->next将要转置的节点连接到头结点的后面
         L->next=q
    end while
    

    2.2.2代码截图

    2.2.3本题PTA提交列表说明。

    • Q1:做这题的时候一开始是有一个很幼稚的想法的,那就是使用就像p->next=p;然后这样就可以进行指针往前移动,一开始以为这就可以了。
    • A1:然后在打了之后才发现是错误的想法,使用就去询问了老师,原来这样是不可以的,而且会使链表断掉,要指针前移就用双链表。
    • Q2:后来才想到的现在写的方法,这方法也是想了很久的,也是最简洁的。
    • A2:之前是定义了一个新的数组用来存放所有的数,最后再进行赋值一个个重新赋值。很麻烦。4
    • Q3:一开始我先把指针p往后移动了,而没有把q指向p,所以出现了错误。
    • A3: 修改过后就正确了。

    2.3.题目3:题目名称

    jmu-ds-有序链表合并 
    

    2.3.1设计思路(伪代码)

    设计思路:
    
    • void MergeList(LinkList &L1,LinkList L2)有序链表合并
    定义指针,pa为L1的遍历指针并指向L1的首结点,pb为L2的遍历指针并指向L2的首结点
    定义指针 s为放置数据域,r
    r为保存L1的指针
    //查找两链表共同的长度进行排序
    while  pa&&pb  do     
            if  pa->data<pb->data   then   //当pa的数据域小于pb的时候
                创立新节点s 并将pa的数据域存入s数据域中
                利用尾插法将s连起来   
                pa继续往后移
            else if  pa->data>pb->data    //当pa的数据大于pb  
                创立新节点s 并将pb的数据域存入s数据域中
                利用尾插法将s连起来   
                pb继续往后移
            else   //当两个数据一样时候
                创立新节点s 并将pa的数据域存入s数据域中
                利用尾插法将s连起来   
                pa,pb继续往后移
    end while
    //当pa不空时候
    while  pa不为空  do  
              创立新节点s并将pa的数据域存入s数据域中
              利用尾插法将r连起来
              pa继续往后移             
    end while
    //当pb不空时候
    while  pb不为空  do
              创立新节点s 并将pb的数据域存入s数据域中
              利用尾插法将r连起来
              pb继续往后移             
    end while
    r尾节点设为空
    

    2.3.2代码截图


    2.3.3本题PTA提交列表说明。

    • Q1:写这道题的时候一开始我用的方法是建立一个新的指针指向L1的首节点,然后开始进行比较两条链各个节点的大小进行排序,也就是在两条链之间接来接去形成一条链。
    • A1:但是由于不知道哪出错了,一直改不出来,然后我就换了新的方法。
    • Q2:换了一个新建一个节点用来储存数据,然后尾插法接到新建的链上。
    • Q3: 一开始新建链表节点的时候由于LNode写成Link,所以一直出现错误,但是由于这是很低级的错误,所以找了很久。
    • A3:最后还是找了同学来看一下子就看出来了,这也说明了越低级的错误越要注意。

    3、阅读代码

    3.1 题目

    • 单链表冒泡排序

    3.2 解题思路

    该题的解法与数组的冒泡排序差不多。
    1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
    3.针对所有的元素重复以上的步骤,直到没有任何一对数字需要比较。
    

    3.3 代码截图

    3.4 学习体会

    1.如果一开始让我来写这道题目,我循环的条件可能就不会用得那么准确,我可能会定义一个新的指针指向头结点,然后遍历链表,然后算出链表的长度,在定义i来控制循环,但是这样明显是比较麻烦的,要用该题的解法,就是以指针是否为空做为循环的条件,并进行指针的移动。
    2.还有就是在交换数值这一做法上我不会再去构造个函数的,会直接定义一个交换的变量temp,他在构造个函数感觉会更好用,可以在该函数内更少操作。
    3.但是有一点不明白的就是为什么在第一个for循环中每次循环cur都要等于head,那样在下一个循环中的if比较中好像有点儿问题吧。
    
  • 相关阅读:
    vue 表单校验报错 [Vue warn]: Error in mounted hook: "Error: please transfer a valid prop path to form item!"
    ES6学习笔记—— 变量声明和解构赋值
    ES6学习笔记 —— 数组
    elementUI 的 DateTimePicker日期时间选择器设置指定时间禁用状态
    去除数组的空字符串或者空值
    zabbix proxy mysql数据库配置 摩天居士
    ss sock监控抓取 摩天居士
    EasyNVR通过国标级联到上级云服务器,视频无法播放的原因是什么?
    如何修改配置让EasyNVR获取录像接口返回精确的录像文件?
    RTSP/Onvif协议EasyNVR平台流媒体内核启动失败的原因是什么?
  • 原文地址:https://www.cnblogs.com/wcrbailun/p/10629774.html
Copyright © 2020-2023  润新知