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

    1.本周学习总结

    1.1思维导图

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

    本章线性表与上学期所学的链表接轨,所以前面有一部分是上学期学过的内容,学起来就相对容易。后面一部分是新的链表操作方法,
    刚开始对链表的认识可能还不够深刻,所以总是会出现各种错误,后来错误减少了,但是发现自己的解题方法时间复杂度较高,总之
    现在还在努力提高这一方面,准备多看看别人的代码让自己的代码更加好。

    2.PTA实验作业

    2.1.题目1:6-4 顺序表操作集

    本题要求实现顺序表的操作集

    2.1.1设计思路

    第一个函数创建返回一个空链表

    第二个函数数据插入:首先判断位置是否已满,若不满再判断插入位置是否合法,若合法再找到对应位置进行插入

    第三个函数进行数据查找:从第一个找到最后一个,找到返回位置,找不到返回错误

    第四个函数进行数据删除:判读位置是否合法或存在数据,若存在再进行删除

    ```c
    List MakeEmpty()//建立空表
        定义结构体指针L
        对L申请空间
        L->Last=0  //赋值
        返回L
    bool Insert( List L, ElementType X, Position P )//插入
        定义整型i
        if L->Last=MAXSIZE than
            输出"FULL"
            返回false
        end if
        if P>L->Last或P<0 than
            输出"ILLEGAL POSITION"
            返回false
        for i=L->Last-1 to i<P do i--
            L->Data[i+1]=L->Data[i]  //后移
        end for
        L->Data[P]=X  //插入
        L->Last++   //上限加1
        返回ture
    Position Find( List L, ElementType X )  //找到数据位置
        定义整型i
        for i=0 to i>L->Last-1 do i++
            if L->Data[i]==X than   //找到位置
                返回i
            end if
        end for
        返回ERROR   //找不到返回错误
    bool Delete( List L, Position P )  //删除数据
        定义整型i
        if P>L->Last-1或P<0 than 
            输出"POSITION %d EMPTY"   //%d为P
            返回false
        for i=P to i==L->Last-1 do i++  //找到位置
            L->Data[i]=L->Data[i+1]
        end for
        L->Last--  //上限减1
        返回true
    ```

    2.1.2代码截图

    2.1.3本题PTA提交列表说明

    Q1:前几次的写法自认为已经很完美
    A2:然而改了又改就是编译错误,最后发现new是c++语法。。。。。。
    Q2:改回来后发现答案错误
    A2:仔细再看了一遍题目,原来第一个位置是0。。。。。。
    Q3:改完之后又错了
    A3:干脆把其中一个函数重写,经过不断努力,终于通过了

    2.2.题目1:7-2 一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和。

    2.2.1设计思路

    先用两条链存储输入数据,再分别建链存储相乘和相加后的数据,再写函数进行消除同类元素,

    消除系数是0的元素,再排序,最后输出,销毁链

     Multi函数是乘法

    ```c
    void Multi(SqList L1,SqList L2) //传入两条指针
        定义结构体指针L,p,r,p1,p2
        对L申请空间
        r=L
        for p1=L1->next to p1==NULL do p1=p1->next    //移动链表L1
            for p2=L2->next to p2==NULL do p2=p2->next  //移动链表L2
                对p申请空间
                p->num1=p1->num1*p2->num1;
            p->num2=p1->num2+p2->num2;
            r->next=p;        //将p放在链表L中
            r=r->next;
            end for
        end for
        r->next=NULL;     //新链L建立完成 
        DealSame(L);      //消去相同指数元素
        FindZero(L);    //消去系数0元素 
        DealList(L);   //排序
        DispList(L);   //输出
        DestroyList(L);  //销毁
    ```

    Addition函数是加法

    ```c
    void Addition(SqList L1,SqList L2)  //传入两条链
        定义结构体指针L,p
        L=L1 
        for p=L to p->next==NULL do p=p->next
        end for
        p->next=L2->next  //合并L1和L2
        DealSame(L);      //消去指数相同元素
        FindZero(L);    //消去系数0元素 
        DealList(L);   //排序
        DispList(L);    //输出
        DestroyList(L);  //销毁
    ```

    DealSame是处理指数相同元素的函数

    ```c
    void DealSame(SqList &L)  //传入L指针
        定义结构体指针p,q,r
        for p=L->next to p==NULL do p=p->next    //一个一个与前面所有元素比较
            for r=p,q=p->next to q==NULL do
                if p->num2==q->num2 than   //找到指数相同
                    p->num1+=q->num1;
            r->next=q->next;
            q=q->next;
                end if
                else than        //找不到
                    r=r->next;
            q=q->next;
                end else
            end for
        end for
    ```

    FindZero用来消去系数为0的元素

    ```c
    void FindZero(SqList &L)
        定义结构体指针p,r
        for r=L,p=L->next to p==NULL do
            if p->num1==0 than     //找到0
                r->next=p->next;
            p=p->next; 
            end if
            else than      //不是0
                r=r->next;
            p=p->next;  
            end else
        end for
    ```

    另外还有几个常用函数,排序,输出,销毁链(较常用,偷个懒不写了。。。)

    2.2.2代码截图

    2.2.3本题PTA提交列表说明

    Q1:刚开始写代码的时候函数分的比较少,难以修改,并且大量重复
    A1:所以我将函数功能分的更加细化了,更直观
    Q2:后来感觉改的差不多了,但总是段错误
    A2:经过调试,发现是在一些特殊情况的时候会使得对空指针进行操作,故将之修改
    Q3:从段错误变成了答案错误
    A3:发现是0 0得情况理解错题目
    Q4:期间也会出现格式错误
    A4:末尾不加空格。。。。。。
    (此题用时最长,感觉最难)

    2.3.题目1:6-10 jmu-ds-有序链表的插入删除

    链表L是一个有序的带头结点链表,实现有序链表插入删除操作。

    2.3.1设计思路

    插入时用指针p存放数据e,对链表进行遍历后插入

    删除时直接对链表进行遍历后删除

    ```c
    void ListInsert(LinkList &L,ElemType e)//有序链表插入元素e
        定义结构体指针p,q,r
        对q申请空间
        q->data=e;  //存入数据
        for r=L,p=L->next to p==NULL do p=p->next,r=r->next
            if e<p->data than  //找到并插入
                q->next=p;
            r->next=q;
            返回
            end if
        end for
        if p==NULL than //插在最后
            r->next=q;
        q->next=NULL;
        返回
        end if
    void ListDelete(LinkList &L,ElemType e)//链表删除元素e
        定义结构体指针p,r,q
        if L->next==NULL than  //空表
            返回
        end if
        for r=L,p=L->next to p==NULL do p=p->next,r=r->next
            if p->data==e than    //找到开始删
                r->next=p->next;
            q=p;
            p=p->next;
            delete q;
            返回
            end if
        end for
        if p==NULL than
            输出e找不到
    ``` 

    2.3.2代码截图

     

    2.3.3本题PTA提交列表说明

     

    Q1:刚刚看题目感觉挺简单,然而还是大意了
    A1:经过查找找到了编译错误的原因,原来是忘记申请空间
    Q2:中间又陆陆续续出现了几次错误
    A2:具体是什么已经忘了......
    (记得有一个是感叹号的问题)

    3.阅读代码

    3.1 题目

    C++类实现线性表

    3.2 解题思路

    利用头文件#include <List.h>,使用类来解决一些函数

    3.3 代码截图

    3.4 学习体会

    1.使用这个类可以大量简化代码,用已经设计好的函数直接解题,提高了编程速率。
    2.学习更多类后,可以快速提高编程能力,但是我们应该知道函数的内容,知道函数是如何运行的。
    3.线性表是基础,打牢固基础对后面的学习起到决定性的作用,所以熟练线性表的各种操作至关重要的
  • 相关阅读:
    PyQt5-关闭窗体显示提示框(窗口界面显示器上居中)-5
    PyQt5-按钮关闭窗体-4
    PyQt5-显示提示消息文本-3
    PyQt5-显示一个窗体,设置标题和图标-2
    [bzoj1053][HAOI2007]反素数ant【暴力】
    [bzoj1083][SCOI2005]繁忙的都市【MST】
    [bzoj1088][SCOI2005]扫雷Mine【乱搞】
    [bzoj1070][SCOI2007]修车【费用流】
    [bzoj1087][SCOI2005]互不侵犯King【dp】
    [bzoj4558][JLoi2016]方【容斥原理】【计数】
  • 原文地址:https://www.cnblogs.com/putianliuzhong/p/10597451.html
Copyright © 2011-2022 走看看