一、PTA实验作业
顺序表
1.6-3 顺序表删除重复元素
2.设计思路
void CreateSqList(List &L,int a[],int n)
为L申请SqList中的动态存储空间
令顺序表L长度为n
定义整型变量i表示下标
for i=0 to n-1
L->data[i]=a[i]
end for
void DispSqList(List L)
定义整型变量i表示下标
for i=0 to L->length-1
if数据遍历到最后一位,输出不带空格
否则输出带空格
void DelSameNode(List &L)
定义整型变量i、j、k表示下标
for i=0 to L->length-1从头开始遍历
for j=i+1 to j=L->length-1从下一个数开始遍历
if L->data[j]==L->data[i]
for k=j to L->length-1
L->data[k]=L->data[k+1 //]删除重复元素
end for
L->length减一
i减一
end for
end for
3.代码截图
4.PTA提交列表说明
单链表
1.6-2 jmu-ds-单链表逆置
2.设计思路
void CreateList(List &L,int n)
{
为L申请动态存储空间
新建节点p等于L的头节点
尾插法插入数据data
}
void ReverseList(List &L)
{
新建节点p,q,temp,其中p等于L的头节点,q为空指针
while(p)
temp为p的下一个节点
用尾插法将p插入q后面
节点变为temp的头节点
循环结束后,L头节点变为q当前节点
}
void PrintList(List L)
{
如果L为空链表,输出NULL
否则遍历链表,第一位数不输出空格,之后的数前面都输出空格
}
3.代码截图
4.PTA提交列表说明
有序表
1.7-3两个有序序列的中位数
2.设计思路
定义结构体Node{
int data
struct Node* next
}
int main()
{
输入正整数n表示链表公共长度
创建链表L1、L2以及并集L3
为L1和L2读入数据
求L1和L2的并集L3
求L3的中位数并输出
}
List InitList()
{
为链表L申请动态空空间
if链表为空,输出NULL
L下一次指针域为空
返回L
}
void Read(List L,int m)
{
通过递减链表长度m来输入数据
为temp申请动态空间L
if temp为空链表 退出函数
将data的值赋给temp当前的数据节点
temp下一个指针域为空
用尾插法插入数据
}
void Combine(List L1,List L2,List L3)
{
while(L1&&L2)
if L1的data大于L2的data
用尾插法插入L2的数据
L2指向下一个节点
else
用尾插法插入L1的数据
L1指向下一个节点
if 链表L1为空L2不为空
遍历L1
用尾插法将q的节点插入到L2中
L2指向下一个节点
else if 链表L2为空L1不为空
遍历L2
用尾插法将q的节点插入到L1中
L1指向下一个节点
q下一个指针域为NULL
}
void MidList(List L)
{
定义节点l为L下一个指针域
为l3申请动态空间
遍历l
计算链表长度len
l指向下一个指针域
之后找到中位数的len/2节点位置后输出其值
l3下一个指针域为NULL
}
3.代码截图
4.PTA提交列表说明
二、本周PTA最后排名
1.顺序表排名
2.单链表排名
3.总分排名
215
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
首先,我自己平时安排敲代码的时间大概只有发布pta题目和课堂派预习作业的时候才会去学习吧,这学期的课程和作业相比上学期增加不少,学习节奏越来越紧凑,还有点跟不上节奏,但也在尽力的熟悉这种快节奏,平时周末的话总想放松一下不去做一些费脑子的事情,但总是清闲过头到头来陷入赶作业的死循环,这一点也正在努力改变,先定一个小目标:周末给自己抽出2到3个小时的时间来学习数据结构;现在遇到不会的题目大多是请教舍友或者和他们分享自己的看法,指出自己的问题所在并加以改正
2.谈谈你对线性表的认识?
线性表的储存结构分为顺序存储结构和链式存储结构。线性表的顺序存储结构是,把线性表中的所有元素按照其逻辑结构依次存储结构到向计算机申请的一块存储空间,但其缺点就是不好控制其内存大小,不便于内存的管理;线性表的链式存储结构是,每个存储节点中都包含有元素本身的信息,而且包含元素之间逻辑关系的信息,其相比顺序存储结构的优点是,可以实现动态申请空间进行管理
循环链表是另一种形式的链式储存结构,它的特点是尾节点的指针域不再是空,而是指向头节点,使链表形成环状结构,因此可从表中任一一点出发寻找其他节点
双链表中每个节点有两个指针域,一个指向前驱节点,另一个指向后继节点,相比单链表,访问节点更加方便
3.代码Git提交记录截图
4.阅读代码
PTA 多项式A除以B
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <cmath>
using namespace std;
struct poly{
int e;
double c;
}p[10000],ans[10000];//p记录除数多项式,ans记录商或余数
int main(){
int n,m,ant = 0,e;//m记录被除数多项式指数的最高次
double c;
map<int,double>q;
cin >> n;
for(int i = 0; i < n; i++){
cin >> e >> c;
q[e] = c;
if(i == 0) m = e;
}
cin >> n;
for(int i = 0; i < n; i++){
cin >> p[i].e >> p[i].c;
}
while(m >= p[0].e){
double change = q[m] / p[0].c;//系数bi
int diff = m - p[0].e;//指数比
if(fabs(change) >= 0.05){
ans[ant].e = diff;
ans[ant++].c = change;
for(int i = 0; i < n; i++){//更新a多项式
q[p[i].e + diff] -= change * p[i].c;//通过b多项式加上指数比去找a多项式的项进行减法
}
}
else m--;
while(m >= p[0].e && fabs(q[m]) < 0.05){//这一步的作用是防止上一步m--后的项虽然次数减少了,可能系数小于0.05
m--;
}
}
cout << ant;
if(!ant) cout << " 0 0.0";
for(int i = 0; i < ant; i++){
printf(" %d %.1f",ans[i].e,ans[i].c);
}
cout << endl;
ant = 0;
while(m >= 0){
if(fabs(q[m]) >= 0.05){
ans[ant].e = m;
ans[ant++].c = q[m];
}
m--;
}
cout << ant;
if(!ant) cout << " 0 0.0";
for(int i = 0; i < ant; i++){
printf(" %d %.1f",ans[i].e,ans[i].c);
}
return 0;
}
功能:计算两个多项式相除的商和余
优点:用了数组封装多项式及其商和余,极大的减少了代码量且易懂,我想过用链表来存储商和余,发现要同时操作两三条链表非常的复杂,并且判断输出也较为简单,不需要多条链表那样通过遍历存储数据节点,精简了许多