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.线性表是基础,打牢固基础对后面的学习起到决定性的作用,所以熟练线性表的各种操作至关重要的

 

posted @ 2019-03-25 23:02  ywww  阅读(206)  评论(0编辑  收藏  举报