一、PTA实验作业-02
(一)1.题目1:6-3 jmu-ds- 顺序表删除重复元素(25 分)
2. 设计思路(伪代码或流程图)
题目要求:创建顺序表,输出顺序表,删除顺序表重复元素;
创建顺序表:
Procedure <CreateSqList> ([List &L,int a[],int n])
Begin
定义i=0;
给L分配一个动态存储空间;
If <L->length==0>
return
else
For i=0 to n-1
{
L->data[i]=a[i];
}
End
输出顺序表
Procedure DispSqList(List L)
Begin
定义i
If (L->length==0)
Return
Else
For i=0 to length-1
{
cout<<L->data[i]<<" ";
}
输出L->data[length]和“\n”
End
删除顺序表中重复元素
Procedure DelSameNode(List &L)
Begin
定义i=0,j;
If(L->length==0)
return;
Else
For i=0 to length-1
{
For j=i+1 to L->lenth
{
If(L->data[i]==L->data[j])
for(int k=j;k<L->length-1;k++)
{
L->data[k]=L->data[k+1];
}
L->length--;
i--;
}
}
End
3. 代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4. PTA提交列表说明。
全部重复数据错误是因为在DelSameNode函数中,在多次循环时,没有i--使得,程序进入死循环
而空表错误是因为在函数输出函数中没有考虑到L->length=0的情况,无返回
(二)1.题目2:6-4 集合的基本运算(单链表)
2. 设计思路(伪代码或流程图)
Procedure DispList(LinkList *L); //输出链表元素,每个结点元素值以空格符间隔,以换行符结束
Begin
定义s并初始化s=L->next;
while(s!=NULL)do
{
printf("%c ",s->data);
s=s->next;
}
printf("\n");
End
Procedure CreateListR(LinkList *&L,ElemType a[],int n); //用数组元素值尾插法创建链表。
Begin
定义s,r,i
给L分配一个动态存储空间
r=L;
For i=0 to n-1
{
s=new LNode;
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
End
Procedure DestroyList(LinkList *&L)//销毁链表。
Begin
定义q并初始化
q=L->next;
while(q!=NULL)do
{
L=q->next;
free(q);
q=L;
}
End
Procedure sort(LinkList *&L) //单链表元素递增排序。
定义p,q,s
并初始化p=L->next->next;
L->next->next=NULL;
while(p!=NULL)do
{
q=p->next;
s=L;
while(s->next!=NULL&&s->next->data<p->data)do
s=s->next;
p->next=s->next;
s->next=p;
p=q;
}
End
Procedure Union(LinkList *ha,LinkList *hb,LinkList *&hc) //求两有序集合ha、hb的并集hc。
Begin
定义s,q,i
给hc分配一个动态存储空间
r=hc;
while(ha->next!=NULL&&hb->next!=NULL)do//当ha和hb都不为空时,两个链表从头结点的下一个结点开始比较大小,小的在前,,并把小的值存入人中,此链表往后移一个结点,若相同则取一个结点的值放入r,链表都往下移一个结点,
{
if(ha->next->data>hb->next->data)
{
s=new LNode;
s->data=hb->next->data;
hb=hb->next;
r->next=s;
r=s;
}
else if(ha->next->data<hb->next->data)
{
s=new LNode;
s->data=ha->next->data;
ha=ha->next;
r->next=s;
r=s;
}
else
{
s=new LNode;
s->data=ha->next->data;
ha=ha->next;
hb=hb->next;
r->next=s;
r=s;
}
}
while(ha->next)
{
s=new LNode;
s->data=ha->next->data;
ha=ha->next;
r->next=s;
r=s;
}
while(hb->next)
{
s=new LNode;
s->data=hb->next->data;
hb=hb->next;
r->next=s;
r=s;
}
r->next=NULL;
End
同理可得
Procedure void InterSect(LinkList *ha,LinkList *hb,LinkList *&hc) //求两有序集合ha、hb的的交集hc。
Procedure void Subs(LinkList *ha,LinkList *hb,LinkList *&hc) //求两有序集合ha、hb的差集hc。
3. 代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4. PTA提交列表说明。
误以为两链表差集为两链表不同的数据,所以在Subs(LinkList *ha,LinkList *hb,LinkList *&hc)函数中,在有一链表结束的情况下,接着输出还没结束的链表,所以错了。
(三)1.题目3:7-1 两个有序链表序列的合并(20 分)
2. 设计思路(伪代码或流程图)
同题目2中的Procedure Union(LinkList *ha,LinkList *hb,LinkList *&hc) //求两有序集合ha、hb的并集hc。函数
3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4.PTA提交列表说明。
二、截图本周题目集的PTA最后排名
本次2个题目集总分:290分
1. 顺序表PTA排名
2.链表PTA排名