第02次作业——线性表
6-3 jmu-ds- 顺序表删除重复元素
设计一个算法,从顺序表中删除重复的元素,并使剩余元素间的相对次序保存不变。
输入格式: 第一行输入顺序表长度。 第二行输入顺序表数据元素。中间空格隔开。
输出格式:数据之间空格隔开,最后一项尾部不带空格。
输出删除重复元素后的顺序表。
{
数据对象:a[ ]
数据关系:L={data [ i ] | 0<i<length, data [ i ] 为顺序表中的数,length为顺序表的长度}
基本运算:
void CreateSqList(List &L,int a[],int n): 创建顺序表L将数组中的元素传入线性表中
void DispSqList(List L):输出顺序表从第一位开始,输出线性表
void DelSameNode(List &L):删除顺序表重复元素
}
设计思路:
1,创建顺序表
2,输出修改过的顺序表
2,删除相同元素部分:
利用for循环,将顺序表的第一位依次和顺序表的下一位进行比较
for(i=0;i<L->length-1;i++) for(j=i+1;j<L->length;j++)
,如果相等则从相等的位置起,后面的元素依次向前移动一位,
if(L->data[i]==L->data[j])顺序表长度减少1 L->length--,移动后的位置依次和前面的一位进行比较。
代码:
void CreateSqList(List &L,int a[],int n)//创建顺序表
{
int i;
L=new SqList;
for(i=0;i<n;i++)
L->data[i]=a[i];
L->length=n;
}
void DispSqList(List L)//输出线性表
{
int i;
for(i=0;i<L->length;i++)
{
if(i!=0)
cout<<" ";
cout<<L->data[i];
}
}
void DelSameNode(List &L)//删除相同元素
{
int i,j,k;
for(i=0;i<L->length-1;i++)
{
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--;//长度减一
j--;//移位后新的j所在位置的数再进行和i位置的进行比较,所以j一定要--不然的话运行不对
}
}
}
调试:
1,不全部重复
![](https://images2018.cnblogs.com/blog/1233654/201803/1233654-20180324080228970-1499011328.png)
2.全部都重复
![](https://images2018.cnblogs.com/blog/1233654/201803/1233654-20180324080433223-1792792154.png)
6-3 jmu-ds-链表倒数第m个数
已知一个带有表头节点的单链表,查找链表中倒数第m个位置上的节点。
输入要求:先输入链表结点个数,再输入链表数据,再输入m表示倒数第m个位置。
输出要求,若能找到则输出相应位置,要是输入无效位置,则输出-1
。
{
数据对象:L
数据关系:p=L,s=L (p,s的使用使运算方便
基本运算:
int Find(LinkList L, int m ):查找倒数第m个数
}
设计思路:
1.用n 记录链表节点的个数
2.判断m是否越界
3.j=n-m记录m的正数位置并输出m
代码:
int Find(LinkList L, int m )
{
int i=0,n=0,j,e;
LinkList p=L;
while(p->next!=NULL)
{
n++;
p=p->next;
}
if(m>n||m<=0)//越界输出
{
return -1;
}
else
{
j=n-m;
LinkList s=L;//行定义指针,之前定义的现在指的位置为链表最后一个,不可以用了
while(i<=j&&s->next!=NULL)
{
i++;
s=s->next;
}
e=s->data;
}
return e;
}
运行:
7-1 两个有序链表序列的合并
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的并集新非降序链表S3。
{
数据对象:L(a),L(b)
数据关系:L(c)={L(a)∪L(b)}
基本运算:LinkList a, b, c;
InitL(a);:创建头指针
InitL(b);
InitL(c);
ListCreateL(a);:创建链表
ListCreateL(b);
MergeListL(c, a, b);:合并链表
ListPrintL(c);
}
设计思路:
1.创建链表
2.合并链表:比较两个链表中的元素的大小,谁的元素小C的指针就指向谁,并且将谁的元素输入指针中。
代码:
void MergeListL(LinkList &c, LinkList &a, LinkList &b)//合并链表
{
c = a;
LNode *aa = a->next;
LNode *bb = b->next;
LNode *cc = c;
while(bb&&aa)
{
if(aa->data > bb->data)
{
cc->next = bb;
cc = bb;
bb = bb->next;
}
else
{
cc->next = aa;
cc = aa;
aa = aa->next;
}
}
if(aa)
{
cc->next = aa;
}
else
cc->next = bb;
}
运行:
1.
一般情况
2.链表为空
二、截图本周题目集的PTA最后排名
我的排名:65
我的总分:95
评价:1分;
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
我一般都是上完课后回来在看一下,讲过的,空闲的 时候用来写作业,没有固定的写作业时间,我对自己不满意,因为好多代码都不会,尤其是 编程题都是问同学,
我打算自己多思考,不会的再多想想,不要泛滥自己的依赖思想
2.谈谈你对线性表的认识?
我觉得线性表操作比较方便,尤其是在插入和删除上比顺序表 好的太多,感觉空间复杂度,和时间复杂度都比较的低
3.代码Git提交记录截图。