zoukankan      html  css  js  c++  java
  • DS博客作业02--线性表

    1.本周学习总结

    1.1思维导图

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

    线性表中的顺序表其实还挺好理解的,和数组的差距不大,链表就比较抽象了,本来插入感觉挺简单的,链表那么一弄,还得先断链,然后接上去要插的这种操作,不过这也有好处,只要对插入的位置进行操作就可以了,不像以前数组还得把后面的数组往后移。链表好用是好用,不过抽象的东西挺多的。链表的头插法和尾插法在很多题目中都用得到。有序表比较好处理。

    2.PTA实验作业

    2.1.题目1:顺序表删除重复元素

    本题要求:从顺序表中删除重复的元素,并使剩余元素间的相对次序保存不变。

    2.1.1设计思路(伪代码)

    定义k来判断data[i]之前有没有出现过这个数字,如果没出现过让L->data【j】记住L->data【i】,j++;然后最后把j+1赋给L的长度,只输出到j+1;后面的数据不输出。

    
    ###void CreateSqList(List &L,int a[],int n)
    定义链表L并动态申请内存。
    
    然后用for循环将a[i]的值赋给L->data[i]
    
    ###void DelSameNode(List &L)
    for循环遍历链表并且在for循环里面有
    
    while(k<=j&&L->data[k]!=L->data[i])   //不断比较前面是否有与L->data[i]重复的元素 
    k++;      k是用来判断是否出现重复数字
    if(k>j) L->data[++j]=L->data[i];   如果此时的data[i]不为重复数字,k将小于j
    
    最后将j+1赋给L的长度
    
    ###void DispSqList(List L)
    判断链表非空时输出链表,
    
    for(i=0;i<L->length;i++)
    
    当i没有读到链表尾端时输入数据和一个空格,读到尾端时不输出空格。
    
    如果链表为空,return。
    
    

    2.1.2代码截图

    2.1.3本题PTA提交列表说明。

    •Q1:一开始把全部代码都粘贴进去了,然后编译错误。

    •A1:后面发现了,改了之后变成了部分正确。

    •Q2:还是部分正确,发现空表时不正确。

    •A2:添了判断条件if(L->length==0)  return;的条件还是部分正确,输出部分和别的同学也一样,就是不对。

    2.2.题目2: 两个有序序列的中位数

    求出两个有序序列合并后的中位数

    2.2.1设计思路(伪代码)

    首先依次比较data1和data2数组各个数据的大小,谁小谁的下标+1,然后运用flag变量来判断当n读到两链表长度的一半时这时第n个数是data1还是data2数组里的,然后输出L->data1[i-1]或L->data2[j-1]。

    
    ###void CreateList(SqList &L,int n)
    给链L申请动态空间
    
    两个for循环输入两个有序表的数据
    
    ###int seek(SqList &L,int n)     //寻找中位数 
        定义i,j来比较两有序表中的数,定义k代表读到第k数了。
    
       定义中间变量flag=0,flag作为中间变量判断中位数是data1中的数还是data2中的数
    
    while(k!=n)          当读到第n+1个数时跳出循环
      {
            if(L->data1[i]<L->data2[j])         如果data1[i]大于data2[j] 
              flag控制为0,下标 i+1
       else  
           {
             data1[i]小于data2[j]的情况和等于的情况,等于的话不管谁排在前面都可以,所以不分类讨论
             flag控制为1;  下标j+1
            }
        }
    
        if判断 (如果flag=0),
                则第n个数是data1的数据,
        否则为data2的数据
        
    return  返回L->data1[i-1]或L->data2[j-1]  因为读到了第n+1个数,比如说n=5,这时读到了data1[5]是第六个数,所以应该为i-1
    
    ###void DestroyList(SqList &L)
     delete L;    销毁表
    
    

    2.2.2代码截图


    2.1.3本题PTA提交列表说明。

    •Q1: 一开始用直接返回的是data1[i]和data2[j]没考虑到已经读到了第n+1个数

    •A1: 后面通过调试发现每次输出的都是后一个数,然后就想到用i-1和j-1;

    •Q2: 一开始只对了一个测试点,有什么最小N啊奇数序列什么的没过。

    •A2: 后面看了代码之后想到因为我的k是从0开始的,如果递增到n的话就是n+1个数了

    2.3.题目3: jmu-ds-单链表逆置

    将一个链表的表头置为表尾,表尾置为表头,即倒过来输出链表

    2.3.1设计思路(伪代码)

    运用头插法从第二个开始将链表逆置,插入表头,重复插入。直到表头置为表尾。

    首先定义结构体指针p,temp。
    然后将p指向表头 p=L->next。
    将p置为空            p=L->next。
    当p非空时          while(p非空)
    临时变量temp储存p,
    将p后移的同时将temp接到表头,
    L->next=temp。
    链表逆置完成。
    

    2.3.2代码截图

    2.3.3本题PTA提交列表说明。

    •Q1 : 后面好像有忘了L->next=temp这步的操作了,就还是带着以前的思维写作业。
    •A1 : 还是多亏了老师的代码。
    •Q2 :一开始不太懂temp应该怎么做才能实现链表逆置,不太懂尾插法的使用
    •A2 : 后面钻研了书上的代码和我拍的老师上课的代码做出来了

    3、阅读代码

    3.1 题目:已知在一维数组A[m+n]中依次存放着两个线性表(a1,a2,a3,…am)和(b1,b2,b3,…,bn)。试编写一个函数,将数组中两个顺序表的位置互换,即将(b1,b2,b3,…,bn)放在(a1,a2,a3,…,am)的前面。

    3.2 解题思路:首先将第一个与最后一个元素交换,得到bn,bn-1.....b1,am,am-1......a1,然后再对两个线性表分别逆置得到需要的顺序。

    3.3 代码截图

    3.4 学习体会:这份代码没有在一个函数里重复交换,而是灵活的运用函数调用,在 Exchange函数里面反复调用Reverse函数来实现三次逆置的操作。换我是不会想到去这么做,可能就是傻傻的直接在一个函数里面重复逆置。

  • 相关阅读:
    ci框架与smarty的整合
    jQuery 1.3.2 简单实现select二级联动
    Nginx配置https
    tp5.1最新的类库使用规则
    Linux指令大全
    Redis锁机制处理高并发
    Nginx配置https站点
    vue的入门
    HTTP 请求头中的 X-Forwarded-For,X-Real-IP
    Composer包制作以及发布!
  • 原文地址:https://www.cnblogs.com/yvvq/p/10630602.html
Copyright © 2011-2022 走看看