第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次作业-线性表的主要内容,如果未能解决你的问题,请参考以下文章