第02次作业-线性表

Posted 陈玉婷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第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提交记录截图

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于第02次作业-线性表的主要内容,如果未能解决你的问题,请参考以下文章

第02次作业-线性表

第02次作业-线性表

第02次作业-线性表

第02次作业-线性表

第02次作业-线性表

第02次作业-线性表