第02次作业-线性表

Posted 吴修恩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第02次作业-线性表相关的知识,希望对你有一定的参考价值。

一实验题目

1.题目1:6-3 jmu-ds- 顺序表删除重复元素

设计一个算法,从顺序表中删除重复的元素,并使剩余元素间的相对次序保存不变。

  • 输入格式: 第一行输入顺序表长度。 第二行输入顺序表数据元素。中间空格隔开。
  • 输出格式:数据之间空格隔开,最后一项尾部不带空格。
  • 输出删除重复元素后的顺序表。
  • 你需要实现的函数有下面三个:

函数接口定义:

void CreateSqList(List &L,int a[],int n);  //创建顺序表
void DispSqList(List L);//输出顺序表
void DelSameNode(List &L) ;//删除顺序表重复元素
  • L :顺序表
  • a :输入数组
  • n :输入数据个数

 

2.设计思路

1.在void CreateSqList(List &L,int a[],int n)中,先建立一个顺序表,再定义一个i表示顺序表元素的下标。

  for i=0 to i<n

     L->data[i]=a[i];

  end for

 这样就建立好了一个顺序表。

2.在void DispSqList(List L)中,定义一个i表示顺序表元素的下标。

  先判断L->lenght==0,是的话直接返回。

  for  i=0 to i<L->length-1

    输出L->data[i]

  end for

3在void DelSameNode(List &L)中,定义i表示顺序表元素的下标;定义j表示与i相比较元素是否重复的元素下标;定义m表示删除重复元素的下标。

  先判断L->lenght==0,是的话直接返回。

  for i=0 to i<L->length {

    for j=i+1 to j<=L->length{

      判断 L->data[j]==L->data[i]{  //相等则进行删除

        for m=j to m<L->length-1

           L->data[m]=L->data[m+1]//位置前移

      }   L->length--;   

    }

  }

 

  

3.代码截图

 

 

 

4.PTA提交列表说明

 

测试点2是因为边界判断错误

测试点3是因为在函数中我没有对L->lenght==0时进行判断

 

   

 

  

1.题目2:6-2 jmu-ds-单链表逆置

本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表为带头结点链表。链表结点定义如下:

typedef struct node{
      int data;
      struct node *next;
}ListNode;
typedef ListNode *List;

函数接口定义:

void CreateList(List &L,int n);
void ReverseList(List &L);
void PrintList(List L);

要实现函数有3个分别为:

  • CreateList:创建单链表。输入n个正整数,按照输入顺序创建单链表。其中 L 是指向链表的头指针。 n 输入的链表结点个数;要求尾插法建表
  • ReverseList:将链表L逆置。
  • PrintList:输出L为头指针的单链表内容。

 

2.设计思路

  此题的核心思路在void ReverseList(List &L)函数中,其他函数就不再多解释了

  方法一:(自己的想法)

   首先我定义了一个数组a[100];

   然后通过while(p!=NULL)a[i]=p->data等等将链表中的值存入数组

   之后从数组a[]的尾到头依此重新定义链表

  方法二:

   void ReverseList(List &L)
  {
    ListNode *p,*q;定义两个链表
    p=L->next;
    L->next=NULL;将表头独立出来
    while(p为空时) 
    {
    q=p;
    p=p->next;
    q->next=L->next; 
    L->next=q;使用头插法将p指针后面依此插入表头L后
  }

  这种方法更加节约空间

 

3.代码截图

 

 

 

4.PTA提交列表说明

没有对n=0时进行判断

 

 

1.题目3:7-1 两个有序链表序列的合并

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的并集新非降序链表S3。

输入格式:

输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−表示序列的结尾(−不属于这个序列)。数字用空格间隔。

输出格式:

在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL

 

2.设计思路

  此题的核心思路在void Union(LinkList *ha,LinkList *hb,LinkList *&hc)函数中,其他函数就不再多解释了

  建立链表hc

  在建立三个链表指针pa,pb,pc分别指向链表ha,hb,hc;

  while(pa且pb不为空是){

    if pa->data>pb->data  //这种方法是让pa,pb对应的data进行比较,pc->next指向data较小的指针,使hc的元素值为递增(不过破坏了ha,hb链表原有顺序)

    真:{         //而要避免破坏ha,hb链表原有顺序,我们可以先将其pa或pb的值存入新的结点t,再将其用尾插法传给hc。 //还可以先将ha和hc的值存入新的结点t,直接给hc,再在hc进行选择排序

      pc->next=pb;

      pb=pb->next;

    }

    假:{
      pc->next=pa;
      pa=pa->next;
    }    

    pc=pc->next;

  }

  if(pa不为空){    //将不为空的链表中余下的值,直接衔接在链表hc后
  pc->next=pa;
  }
  else{
  pc->next=pb;

  }

 

 

3.代码截图

 

 

 

4.PTA提交列表说明

 

 

 

二、截图本周题目集的PTA最后排名

  

1.顺序表排名

 

2.链表PTA排名

 

3.我的总分

总分为:2.0分

 

 

三、本周学习总结

  

1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?

 作业发布的时候,因为写物理实验报告和平日作业而没有练习,导致后面时间比较赶,有些题目没打。总体来说这种时间安排方式不够好,每天应该挤出一点时间进行练习,而不是三天打渔两天晒网。

2.谈谈你对线性表的认识?

线性表是n个数据元素的有限集合,他的特点是:(1)存在唯一的一个被叫做“第一个”的数据元素,存在唯一的一个被叫做“最后一个”的数据元素。(2)除了第一个数据元素外,其它的数据元素都有一个前驱。除了最后一个数据元素外,其它的数据元素都有一个后继。

3.代码Git提交记录截图

在码云的项目中,依次选择统计-Commits历史-设置时间段,进行搜索并截图,如下图所示,需要出现学号、项目提交说明。请在码云中将你的昵称改为“学号-姓名”。

 

 

 

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

第02次作业-线性表

第02次作业-线性表

第02次作业-线性表

第02次作业-线性表

第02次作业-线性表

第02次作业-线性表