• 博客作业02---线性表


    一、PTA实验作业

    题目1:7-1 最长连续递增子序列

    给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。
    例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)

    1. 设计思路(伪代码或流程图)

    /*查找最长连续递增子序列函数 */
      定义整型变量i,j表示循环变量,k用来作找到后新数组下标
      定义整型变量 MaxLength=1; //MaxLength为1, 表示长度只有头部
      定义整型 a[maxsize]存放最长连续递增子序列
      for i=0 to L->length
        a[i]=1;   //表示长度只有头部 
         for i=0 to L->length-1
            for i=0 to L->length-1
                如果 前一个元素 > 后一个元素
    		    a[i]++
    		    否则 break	  
        找到后:  
    	for i=0 to L->length
    		如果 a[i] > MaxLength,k=i
    	如果 长度为1,直接输出此数
    	如果 长度为0,return
    	输出最后结果 
      end for
    

    2.代码截图


    3.PTA提交列表说明

    • 编译错误。把PTA中的C改成C++后提交;
    • 部分正确。没有考虑只有一个数时的情况,需要再加上if(MaxLength==1)时,直接输出这个数;

    题目2:6-2 jmu-ds-单链表逆置

    本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表为带头结点链表。
    (单链表基本操作根据老师发的变化。)

    1. 设计思路(伪代码或流程图)

    /*逆置函数void ReverseList(List &L)调用 */
        如果链表L 为空表||只有有一个元素 
               输出 NULL,不逆置
        定义指针p,q ListNode *p,*q移动
        令p指向L的第二个数据
        while(p)
        	q 保存下p的值 ,p移动 
        	p的next指向前一个元素
    		L->next的值不断变化,循环
        end for	
    
    

    2.代码截图


    3.PTA提交列表说明

    • 需要考虑空表或仅仅只有有个元素时,不需要逆置;
    • 答案错误。输入1 2 3 4 5逆置后输出4 3 2 1,修改第一个输出所指结点输出;
    • 部分正确。猜想是逆置函数出错,注释掉其他函数,再读代码,查找出错地方,修改:在建模输入值时循环条件出错,将for(i=1;i<n;i++)改为for(i=1;i<=n;i++);
    • 格式错误。输出函数,最后一个无空格;

    题目3:7-3 两个有序序列的中位数

    1. 设计思路(伪代码或流程图)

    先类似7-1将给出的两个链表S1,S2合并,用链表S3装好
    /*查找中位数int Find(LinkList S3, int m,int n)调用*/ 
        m为中位数下标 
        定义整型变量j=0 表示S3下标
    	定义整型变量length=2*n表示合并后S3长度 
        定义 LinkList p=S3方便进行移动
    	如果 p为空 return 0
    	当 j<=m 时
    	     j递增
    		 p移动
        直到j==m找到
    	返回找到的下标所指的值
    	end for
    

    2.代码截图



    3.PTA提交列表说明

    • 编译错误。忘记把PTA中的C改成C++后提交;
    • 段错误。之前把合并后的S3先输出来,函数没注释掉,不用输出,直接输出中位数的值;
    • 答案错误。中位数查出错误,函数出错,检查发现length长度在合并后没有及时改变,应该变成2n;

    二、截图本周题目集的PTA最后排名

    1.顺序表PTA排名

    2.链表PTA排名

    3.我的总分:215

    三、本周学习总结

    1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?

    • 课前完成老师布置的预习作业,然后平时上数据结构课程,课后完成相应的PTA练习题;
    • 不太满意。除了老师安排的固定学习外可以自己课下多看数据结构书,看看代码和解题思路;
    • 编程上不懂的地方先上网自己尝试弄懂,如果不行,请教同学;

    2.谈谈你对线性表的认识?

    主观认识:线性表是一种数据结构,能表示出前后相同元素之间的关系,让元素有规律的排列或组合;
    本章小结:
    (1)线性表的定义。线性表是具有相同特性的数据元素的一个有限序列;
    (2)线性表的抽象数据类型描述。 
    ADT List {
      数据对象:D={ | ∈ ElemSet, i=1,2,...,n, n≥0 }
    数据关系:R1={ <ai-1 ,ai >| ,∈D, i=2,...,n }
    基本操作:
       { 结构初始化 InitList( &L ) }  
        操作结果:构造一个空的线性表 L
    { 销毁结构 DestroyList( &L ) }
      }
    (3)线性表的顺序存储结构---顺序表及其运用。
    包括顺序表的建立、初始化线性表、销毁线性表、判断是否为空表、求线性表长度、输出线性表,
    还有在线性表中进行某些基本操作运算:如: 求线性表中某个数据元素值、按元素值查找 、插入元素值、 删除元素值;
    (4)线性表的链式存储结构---链表,分有单链表、双链表和循环链表及其运用。
    单链表中,每个节点有一个指针域,指向其后继节点,进行操作 时,除了对该节点操作外,还需要考虑其前后的节点;
    单链表也有顺序表里面的基本操作:删除、插入、建表(头插法或尾插法,头插法会逆序输出)、初始化、销毁等;
    双链表中,每个节点有两个指针域,一个指向其后继节点,另一个指向其前驱节点;
    建立双链表也有两种方法:头插法或尾插法,基本操作跟单链表同;
    插入节点(如:s插入p后):
    s->next=p->next;
    p->next->prior=s;
    s->prior=p;
    p->next=s;
    删除节点(如:删除p后的节点,得修改两个指针域):
    p->next=q->next;
    q->next->prior=p;
    (5)循环链表,是另一种形式的链式存储结构。
    特点:表中尾节点的指针域不再是空,而是指向头节点,整个链表形成一个环,因此,从表中任一个节点出发均可找到链表中其他节点;
    基本运算:与非循环链表基本相同,只对表尾的判断作了改变,例如,在循环单链表或循环双链表L中,判断表尾节点p的条件是p->next==L;
    (6)有序表,指其中所有元素以递增或递减方式有序排列的线性表。
    有序表的存储结构及其基本运算:
    若以顺序表存储,除插入函数外其余运算基本相同,扫描L,找到插入位置 i,将data[ i ]及后面元素后移一个位置,插入元素e;
    若以单链表存储,除插入函数外其余运算基本相同,查找前驱节点
    pre,创建放e的数据节点p,在pre后插入*p节点;
    有序表的归并。将两个有序表合并成一个有序表---二路归并法。
    二路归并法:
    分别扫描LA和LB两个有序表,两个均未扫描完时,比较LA和LB当前元素,较小的放入LC中,再从较小元素所在的有序表中取下一个元素,重复此过程直到 LA或LB比较完毕,最后将没有比较完的有序表中余下的元素放入LC中;

    3.代码Git提交记录截图

  • 相关阅读:
    Swagger入门
    UOS
    Java多线程
    英语语法小知识-Unit1
    MVVM
    Vue入门
    Mybatis入门
    Python pip install
    js 触发LinkButton点击事件,执行后台方法
    ajax 请求 ascx
  • 原文地址:https://www.cnblogs.com/78tian/p/8643544.html
Copyright © 2020-2023  润新知