• DS博客作业02-线性表


    1.本周学习总结

    1.1思维导图

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

    线性表的学习让我最大的感受就是听得懂,看得懂,不会用。pta打起来是很困难,如果没有书本上的代码参考,很难完成一些稍微难点的,就是简单的头插法,尾插法是能够熟悉的运用,我觉得最大的困难是难以衔接上,时不时就出现野指针,箭头一不注意就不知道指向那里去了,我觉得这一章的学习确实不是很好理解,在做题目的时候一定要准备草稿纸,画画链的变化形式,不然很容易错误,很多时候画链帮忙理解,会容易很多。而且在练习pta的时候,要注重一些基础代码的套用,很多方法换汤不换药,可以背背代码。

    2.PTA实验作业

    2.1.题目1:题目名称

    6-1 jmu-ds-区间删除数据

    2.1.1设计思路(伪代码)

    void CreateList(SqList &L,int n)
    {
    定义 i
    L分配内存
    存储length=n
    for i to n 
        cin data//读取数据
    end for
    }
    
    void DelNode(SqList &L,int min,int max)
    {
    定义循环变量 i j  区间端点kmin  jmax 中间转换变量temp 重构线性表下标m
    for i =1 to length //冒泡法排序
     for j =0 to length
      if data[j] >data[j+1] then 
        temp=data[j];
        data[j]=data[j+1];
       data[j+1]=temp;
    end for
    end for
    
    for i=0 to length//遍历寻找区间
      if data[i]==min then kmin=i;//寻找左区间,刚刚好区间和元素相等,记住元素下标
       			or  data[i]<min then kmin=i+1;//区间比元素大,下标要加1
    end for
    	 
    	
    for i=0 to length	
     if data[i]<=max then jmax=i;//寻找右区间,记住元素下标
    end for
    
       
    for i=0 to length //重构顺序表
         	if i<kmin||i>jmax) then  L->data[m]=L->data[i];m++;//下标满足区间,存入顺序表
    end for
    L->length=m;//记录新顺序表长度
    }
    

    2.1.2代码截图



    2.1.3本题PTA提交列表说明。


    Q1:一开始以为题目的意思是不需要排序的,直接删除区间的里面的元素就行,
    A1:发现按这个意思打出来提交没分,所以加了冒泡排序。先把无序的顺序表变成有序表在去处理

    Q2:冒泡排序完后,又以为是区间都是顺序表找得到的,结果按这个思路,只能得一半分
    A2:添加了区间不属于顺序表里面元素的情况

    Q3:在寻找不属于顺序表元素的区间坐标是,找左区间的时候找到就记录,还是没有得满分,因为左区间在等与不等的情况下区间下标会有差别。
    A3:把左区间分了2种情况,相等的时候直接记录,不等的时候要下标往前加一

    2.2.题目2:题目名称

    6-8 jmu-ds-链表倒数第m个数

    2.2.1设计思路(伪代码)

    int Find(LinkList L, int m )
    {
    定义 p,x 结点分别指向L链首结点
    定义 i j 运算下标,作循环值
    for i =0 to p!=NULL//统计链表的结点数,记录长度i
    		p=p->next;//结点后移
    end for
    	j=i-m;//总长度减m为首结点到需要查找的结点循环次数
    if m<=0||m>I then return -1 //不合法判断
     or for j to 0 //循环遍历
    		    x=x->next;
    end for
    
    	return x->data;//返回结果
    }
    

    2.2.2代码截图

    2.2.3本题PTA提交列表说明。


    Q1:一开始没有判断不合法的情况没有返回-1,直接cout 数据
    A1:改用return 加了一句if语句不合法就return -1;

    2.3.题目3:题目名称

    6-10 jmu-ds-有序链表的插入删除

    2.3.1设计思路(伪代码)

    void ListInsert(LinkList &L,ElemType e)
    {
    定义前驱结点pre,目标结点p,数据结点s
    s分配动态内存
    p结点指向链,且为首节点
    
    while p //遍历链表,寻找插入位置结点
      if data>=e //有序表寻找大于e的结点位置,跳出
    
    pre=p;记住找到位置的前一个结点,就是要插入的位置
    p ->next   //结点后移
    
    end while
    s=e;//数据结点赋值
    
    s->next=pre->next;//头插法把s节点插入pre后面,连接起来
    	pre->next=s;
    }
    
    void ListDelete(LinkList &L,ElemType e)
    {
      if L->next=NULL then return //空链结束
    定义开关变量flag=0;
    定义 目标结点p,前驱结点pre,删除中间变量结点d;
    p指向L头结点
    
    while p 
      if p.data=e then//寻找到了要删元素
       flag=1;break;
    
    pre=p;记住找到位置的前一个结点,就是要插入的位置
    p ->next   //结点后移
    
         d=pre->next; //d结点存储
        pre->next=d->next;//关系重建
    	delete (d);//释放结点
    
    }
    

    2.3.2代码截图



    2.3.3本题PTA提交列表说明。


    Q1:出现多次提交为0分的问题,查找了很多遍代码,没有解决。
    A1:请求同学帮忙,原来是在建链的时候头节点没有给置域为NULL,但是后面函数用的时候也直接结点相等,导致链不能连接起来。更改添加置域,后成功。

    Q2:还有一个问题,删除后链表为空,输不出来。
    A2:开头加了一句if判断空链。结果可以输出。

    3、阅读代码

    3.1 题目

    查找单链表的中间节点,要求只能遍历一次;
    查找单链表的指定节点,我们可以通过不断遍历的到,但是题目要求只能遍历一次,那么我们原来的方法就不行了,这样我们就需要寻找新的途径。要解决这个问题,就需要应用快慢指针问题。

    3.2 解题思路

    定义两个指针,他们是fast和slow,开始他们都指向头节点,然后让他们同时遍历,但是每次fast走两步,即fast=fast->next->next,让slow走一步,即slow=slow->next,然后当fast走到最后的时候,slow所指的节点就是中间节点,这样我们就实现了遍历一次查找单链表的中间节点。

    3.3 代码截图

    3.4 学习体会

    这个快慢指针我是在一年的天梯赛题集看到的。它是一种算法,这种算法对代码运行的要求非常高,可以处理很多要求只能遍历一次的问题,比如这个题目就是对这种算法的完美解释。两个指针搭配,可谓干活不累,我学习完这种方法后,想起来这次pta里面的一道题目,查找单链表倒数第k个节点。似乎也可以用快慢指针来解决了,fast指针先走k步,slow在开始走,fast指针走完,slow指针所指的就是倒数k个结点,这样又一次就可以把题目解决,今后处理这种问题,我要考虑用到这种方法,会简便很多。

  • 相关阅读:
    Entity Framework 简介
    MongoDB 简述及安装
    js、sql和python版本的乘法口诀对比
    sql 判断输入的日期是否有重叠
    win10 不能调节屏幕亮度 win10 屏幕亮度调节快捷键不能用
    mysql主从配置常见错误处理
    Linux安装mysql总结
    linux安装mongodb总结
    centos安装redis总结
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
  • 原文地址:https://www.cnblogs.com/zhouqb/p/10629734.html
Copyright © 2020-2023  润新知