DS博客作业02-线性表

1.本周学习总结

1.1思维导图


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

(1)线性表是一种典型的线性结构,也是一种最常用的数据结构。线性表包括顺序存储结构和来链式存储结构两种,其中链式存储结构的链表正是上学期学过一点,在运用上的话,原理是懂了,但是运用起来还是
有点欠佳。刚开始做对链表的一些操作方法有点不清楚,还有就是这学期涉及到时间复杂度和空间复杂度的问题,但是目前对我而言任重而道远。先解决一下最起码的编程。对于自己的编程能力还是希望多看看别人打得好同学的代码,并且请教对方的方法以及思路。不过学习的最好的用处,还是在于自己的理解和运用。
(2)链表用起来也是非常方便,它实现存储空间动态管理。其中每个存储结点不仅包括元素本身的信息(成为数据域),而且包括表示元素之间逻辑关系的信息,在C和C++中用指针来实现,这称为指针域。链表也分有单链表和双链表。头指针通过头结点的指针来标识链表,相应的指向首结点或者开始结点的指针称为尾指针。

2.PTA实验作业

2.1题目1:6-3顺序表删除重复元素

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

  • 输入格式: 第一行输入顺序表长度。 第二行输入顺序表数据元素。中间空格隔开。
  • 输出格式:数据之间空格隔开,最后一项尾部不带空格。
  • 输出删除重复元素后的顺序表。

2.1.1设计思路

建顺序表函数(传入链表指针,传入顺序表长度n,输入数组)
int i;
动态申请空间存放L顺序表;
for循环输入数组存放到顺序表中,长度为数组最大下标
删除重复数组函数(传入顺序表指针)
int i=1,k,len;
for   i=0             // i  遍历顺序表
    for    j=i+1             // j  遍历i之后的顺序表元素,并每次与 i 位的元素进行比较
        if         // 如果第一层  i 遍历到的元素等于第二层 j 遍历到的元素则
        {
              for  k=j         //遇到重复元素,将该位后面的元素全部依次往左移
                    L->data[k-1]=L->data[k]
              L->length--;     //删除元素后,顺序表长度减 1
        }
    return;


2.1.2代码截图

  • 不同解法

2.1.3本题PTA提交列表

  • Q1第一个解法的问题就是全部重复元素 删除之后例如 5个1 ,输出结果是 1 1,还剩两个1 ,最后一个1理应被删除,但是没有,如果是L->data[k-1]=L->data[k]问题出现在i和j 比较之后,挪动的过程中第二个始终没有被删除,因为后面的元素一直往前补。
  • A1所以 后面该用了另外一种,第二种方法,是边挪边比较,i循环和 从第一个开始比较。这样就不会漏了。后面测试全过

2.2题目2:6-6尾插法建链表

2.2.1设计思路

定义两个指针
    申请空间存放链表,创建头结点
    r=L ;               //r 始终指向尾结点,初始时指向头结点
    for 
        动态申请空间循环
        创建数据结点s,将数组元素放进data
        将结点s插入到结点r之后
        r=s,将头结点r换为s
    尾节点的next置为NULL

2.2.2代码截图

2.2.3本题PTA提交列表说明

  • 函数接口的问题,题目说只要一个函数接口,而我把建链表和输出链表的也弄了上去

2.3题目3:6-2有序表插入数据

2.3.1设计思路

建表函数
    定义 i,j
        new List                 //新建顺序表,申请空间
        表长度为输入的长度也就是结点个数也就是n个正整数
        for 循环输入n个正整数到顺序表中
            cin->L->data[i]

插入元素函数
    定义i =0,j 
    while 在有效长度内找到比插入元素小的元素的位置 使得 i++,到下一位
    for j=L->length ;j>i;j-- 
         L->data[j]=L->data[j-1]       // 从 比插入元素大的元素开始将后面的元素循环后移
    将插入元素放到表中i++后的位置
    表长度加1 

输出表函数
    if 表长度为零 输出error
    else 
        先输出第一位元素,
        for 然后 从i=1 开始输出空格 加元素 

2.3.2代码截图

2.3.3本题PTA提交列表说明

  • Q1插入函数中长度没有控制好,导致输出表时输出错误
  • A1找到插入位置的时候不需要i--
  • Q1还有就是函数接口的问题,这题没有要求写摧毁表的函数
  • A1编译器上试了好几次都没问题,最后同学告诉我时函数接口错了,感觉好低级的错误。
  • Q1还有就是忽略了空表的问题,没有写空表时输出error,后面解决了
  • Q1刚开始已知想着说建表函数中定义一个数组先存放输入的数据然后再存放到表中,后面想了下不用那么麻烦,直接存放到表中就好了

3阅读代码

3.1题目

  • 设将n(n>1)个整数存放到一堆数组R中。设计一个在时间和空间两方面尽可能高效的算法。将R中的序列循环左移P(0<P<n)个位置,即将R中的数据由(X0,X1,.....X n-1)变换为(Xp,Xp-1,.....Xn-1,X0,X1......Xp-1)要求:
    (1)给出算法的基本思想。
    (2)根据设计思想,采用C或C++或JAVA语言描述算法,关键之处给出注释。
    (3)说明你所设计算法的时间复杂度和空间复杂度。

3.2解题思路

1. 把顺序表中的前p个元素逆序存储,
2. 再把顺序表中的后length-p个元素逆序存储,
3. 然后把整个顺序表逆序存储。
比如:v = 1 2 3 4 5 6 7 p = 3
    1. v = 3 2 1 4 5 6 7
    2. v = 3 2 1 7 6 5 4
    3. v = 4 5 6 7 1 2 3

3.3代码截图

3.4学习体会

  • 有时候解题 需要逆向思维,需要从不同的角度想问题,解法一般不单一。
posted @ 2019-03-30 23:46  El-AIRON  阅读(370)  评论(1编辑  收藏  举报