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