第02次作业-线性表
一、PTA实验作业
题目一:1.6-3 jmu-ds- 顺序表删除重复元素(25 分)
2.设计思路:
删除函数:
变量定义i,j表示计数。
if L->length>0{
for i=1 to L->length{
k一直初始化为0;
while(k<=j且L->data[k]!=L->data[i])
k加一;
if k>j{
L->data[i]赋予L->data[++j]
}
}
L长度=j+1;
}
else{
L长度为0;
}
3.代码截图
4.PTA提交列表说明
(1)应是链表形式却写成结构体形式导致编译错误。
eg:L.data[i]=a[i];
应改为L->data[i]=a[i];
(2)输出函数出错:题目要求最后输出不能有空格。删除函数:只能在空表的情况下成立,代码不符合要求,第二个人for循环j++后此节点就往后移动,最后比较不了。
输出函数修改:从第一个到倒数第二个输出后面都带空格,最后一个数单独输出,不带空格。
for(i=0;i<L.length;i++)
printf("%d",L.data[i]);
printf("\n");
改为:
for(i=0;i<L->length;i++)
{
if(i!=L->length-1)
printf("%d ",L->data[i]);
else
printf("%d",L->data[i]);
}
(3)删除函数修改:利用for循环嵌套while循环,利用while循环从前到后找与i所指向的元素相同的数,找到跳出while循环,若没有重复数字,则K一定大于j,在k>j的情况下重新记录数据。一定要记住判断此顺序表是否为空,否则空表的测试点不通过。
for(i=1;i<L->length;i++){
k=0;
while(k<=j&&L->data[k]!=L->data[i])
k++;
if(k>j)
L->data[++j]=L->data[i];
}
改成
if(L->length>0){
for(i=1;i<L->length;i++){
k=0;
while(k<=j&&L->data[k]!=L->data[i])
k++;
if(k>j)
L->data[++j]=L->data[i];
}
L->length=j+1;
}
else{
L->length=0;
}
题目二:6-2 jmu-ds-单链表逆置(25 分)
2.设计思路:
if(L的下一个节点不为空){
创建p指向L的节点;
s=p的下一个节点;
while(s的下一个节点不为空){
int t指向s的下一个节点;
s的下一个节点指向p;
p指向s;
s指向t;
}
最后一个还是要指向其前一个;
头指针逆序后变最后一个,最后一个next=null ;
头指针指向s;
}
3.代码截图
4.PTA提交列表说明
(1)没有考虑到空链表的情况,导致空链表运行出错。
解决方法:在每一个函数要进行时都判断一下链表是否为空,不为空才继续进行。
题目三:7-2 一元多项式的乘法与加法运算(20 分)
2.设计思路:
分别建立创建一元多项式,一元多项式加法,一元多项式乘法,一元多项式输出四个函数。
(2)一元多项式的加法:
定义结构体指针ha,hb分别指向链表a,b头节点,
定义结构体指针f用于存储新链表,
while a and b都不空
do
if(ha->exp!=hb->exp)
then 指数,系数相加后存入新链表
else ha,hb同时往后移一个节点,同样存入新链表
if a不为空
then c
if b不为空
then c
返回c
(3)一元多项式乘法
定义结构体指针ha,hb分别指向链表a,b头节点,
定义结构体指针f用于存储新链表,
if a空orb空
then 返回空的c
while ha
do
依次乘b中的指数和系数
调用加法函数,将结果赋予f,
返回f
3.代码截图
4.PTA提交列表说明
(1)没意识到输出要求数字间以空格分隔。
if(hc==NULL){
printf("0 0");
}
while(hc!= NULL){
printf("%d %d",hc->coef,hc->exp);
hc = hc->next;
}
改为:
if(hc==NULL){
printf("0 0");
}
while(hc!= NULL){
if(flag)
printf(" ");
else
flag=1; //打出一对后中间要有空额
printf("%d %d",hc->coef,hc->exp);
hc = hc->next;
}
(2)
乘法函数:没有意识到俩链表相乘完没有按递减顺序排放,应在乘完之后再利用加法函数使其成递减输出。
while(ha!=NULL){
temp=new node;
L=temp;
hb=b->next;
while(hb!=NULL){
node *l=new node;
l->exp=ha->exp+hb->exp; //指数相加,系数相乘
l->coef=ha->coef*hb->coef;
hb=hb->next;
L->next=l;
L=l;
}
ha=ha->next;
return f;
}
应在ha=ha->next;后添加
L->next=NULL;
f= add(f,temp); //相当于按递减排序
二、截图本周题目集的PTA最后排名
1.顺序表PTA排名
2.链表PTA排名
3.我的总分:
总分:2.5分
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
1.1)编程时间:每天都有进行,一般划分较大片时间进行编码学习,尽量每天都能有所发现。2)学习时间:周一至周五有提前预习并做必要笔记和复习,一般安排在晚上自习时间,在周末进行系统复习总结。3)遇到不懂问题大部分向班级大佬求救和百度搜查,还有和舍友探讨。对自己的学习安排认为还有待提高,领悟能力较差,需要多加练习。
2.谈谈你对线性表的认识?
线性表就是有唯一的“第一个”和“最后一个”元素的有限序列。线性表元素与位置有关,这种位置上的的有序性就是一种线性关系。1)顺序表:在存储空间中是按顺序存储,不容易随意改动。2)链表:含有指向后继节点的指针,变换更灵活。
3.代码Git提交记录截图