第02次作业-线性表
一、PTA实验作业
题目一:6-3 jmu-ds- 顺序表删除重复元素
1.题目要求
2.设计思路
(1)创建顺序表 创建顺序表L,并置其长度为零。 将主函数传递过来的数组依次放入顺序表(定义i控制元素的写入),并将顺序表长度置为数长度 (2)浏览顺序表 定义i控制输出,当i<顺序表长度时输出,大于时结束输出。 (3)删除重复元素 定义i,j,k控制循环
for(i=0;i<L->length-1;i++)
{
找到与下标为i的元素data域相同的元素
for(j=i+1;j<L->length;j++)
if(L->data[i]==L->data[j])
{
将重复元素后的元素向前移一位
for(k=j;k<L->length-1;k++)
L->data[k]=L->data[k+1];
L->length--;
}
}
当L的长度为2且两元素的data相同时,顺序表的长度减一
if(L->length==2&&L->data[0]==L->data[1]){
L->length--;
}
3.代码截图
4.pta提交列表说明
错误点:全部重复数据时,结果应只有一个数字,而我未修改前有两个。
修改前: 修改后:
修改方法:在删除重复元素的函数中,加入一个条件语句,当顺序表长度为2且两个元素data相同时,顺序表长度减一。
题目二:7-1 两个有序链表序列的合并
1.题目要求
2.设计思路
创建、浏览、销毁函数都比较常规,不做说明。
void Union(LinkList *&ha,LinkList *&hb,LinkList *&hc) {
LinkList *pa=ha->next,*pb=hb->next,*r,*s,*q; hc=new LNode; r=hc;
当pa且pb都不为空时,进行循环 while(pa!=NULL&&pb!=NULL) {
pa的data小于pb的data时创建新结点存放pa的data if(pa->data<pb->data) { s=new LNode; s->data=pa->data; r->next=s; r=s; pa=pa->next; }
否则创建新节点存放pb的data else { s=new LNode; s->data=pb->data; r->next=s; r=s; pb=pb->next; } }
pa或pb其中一个为空时上述循环结束,进入以下循环。
将pa或pb中剩余数据放入新链表。 while(pa!=NULL) { s=new LNode; s->data=pa->data; r->next=s; r=s; pa=pa->next; } while(pb!=NULL) { s=new LNode; s->data=pb->data; r->next=s; r=s; pb=pb->next; }
将新链表的next域置空 r->next=NULL; }
3.代码截图
4.pta提交列表说明
错误点一:链表为空时段错误。
修改方法:在主函数中加入一条判断语句。在建立了链表ha和hb后,直接判断ha与hb是否为空,若为空,则输出NULL。
错误点二:大规模输入时运行超时。
修改方法:我先找到了运行超时的原因。我原本是先将两链表合并后再排序再输出,但此题链表本身有序,我的这种算法应该比较适合本身无序的链表。后来新写了一个合并函数,将ha与hb中的元素比较大小后将较小的元素写入hc就不会超时了。
题目三:6-2 jmu-ds-单链表逆置
1.题目要求
2.设计思路
(1)用尾插法存入数据,以保证数据按输入顺序存储。代码与课本相同,不做说明。 (2)用头插法将已创建的链表得到数据重新存入新链表 void ReverseList(List &L) { ListNode *p; ListNode *q; p=new node; p->next=NULL; 头插法存入数据 while(L->next!=NULL){ q=new node; L=L->next; q->data=L->data; q->next=p->next; p->next=q; } 令原链表L等于新链表 L=p;
3.代码截图
4.pta提交列表说明
错误点一:链表为空时段错误。
修改方法:一开始我是在CreateList函数中加入了条件语句,若输入的n为零就输出NULL,但修改后发现此错误仍然存在,不论在CreateList函数中是否输出了NULL,主函数都要接着运行,此时运行碰到PrintList函数时由于缺少对于链表为空情况的判断,出现了段错误,所以最后在PrintList函数中加入了判断链表是否为空的条件语句又删除了CreateList函数的判断结果就正确了。
二、本周PTA题目集排名
1.顺序表PTA排名
2.链表PTA排名
3.我的总分
2分
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
1)学习时间:在上课前花1~2小时做预习工作,对于上课老师讲的有疑惑的地方课后花时间解释解决。其余学习时间主要是在编程时对于疑惑的地方再翻书或询问同学。2)编程时间:没课的时候基本都在打pta。3)对于不懂的问题主要是询问同学或自行百度。
2.我对线性表的认识
线性表的存储结构主要分为两种:顺序表和链式存储。对于元素的插入与删除,用顺序表做会比较麻烦,用链表则比较方便快捷。
3.Git提交记录截图