一、PTA实验作业
本周要求挑3道题目写设计思路、调试过程。设计思路用伪代码描述。题目选做要求:
- 顺序表选择一题(6-2,6-3,7-1选一题),代码必须用顺序结构抽象数据类型封装
- 单链表选择一题(6-1不能选)
- 有序表选择一题
题目:
6-3 jmu-ds- 顺序表删除重复元素(25 分)
设计一个算法,从顺序表中删除重复的元素,并使剩余元素间的相对次序保存不变
设计思路:
int i=0,j=0,k; 先定义三个计数下标
for(i=0;i<L->length;i++){
j=i+1; 让j始终比i大1,才能让两个相邻的数比较
while(j<L->length){
if(L->data[i]==L->data[j]){ 判断相邻两个数是否相等
for(k=j;k<L->length-1;k++){
L->data[k]=L->data[k+1]; 如果相等让下标为J的数等与j+1然后在与下标为i的数相比
}
L->length--; 如果有相等的就表长减一
}
else
j++;
}
}
代码截图:
PTA测试结果;
6-3 jmu-ds-链表倒数第m个数(20 分)
已知一个带有表头节点的单链表,查找链表中倒数第m个位置上的节点
设计思路:
int Find(LinkList L, int m )
{
LinkList p;
p=L; 定义一个Linklist类型的P链表指针 让P等于L
int i=0,a;定义两个计数的
while(L!=NULL){
L=L->next; 计算L 的表长
i++;
}
if(i-m>0){ 判断m的位置是否有效
for(a=0;a<i-m;a++){ i-m表示倒数第m个
p=p->next;
}
if(p!=NULL){ 判断m位置是否有效
return p->data; 返回倒数第m个的值
}
else
return -1;
}
else
return -1;
}
代码截图:
PTA测试结果
错误原因:因为一开始只判断了i-m是否大于0即m位置是否有效,并没有判断P是否等于NULL所以只有部分正确,后面编译错误是少了符号;
7-1 两个有序链表序列的合并(20 分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的并集新非降序链表S3。
设计思路:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node* List;
struct Node
{
int data;
struct Node *next;
};
List IniList();
void In(List L);
void Out(List L);
void combine(List L1,List L2,List L3);
int main()
{
List L1,L2,L3;
L1=IniList(); 构建L1,L2,L3链表
L2=IniList();
L3=IniList();
In(L1);In(L2); 输入L1,L2序列
combine(L1,L2,L3); 比较L1,L2的值然后用尾插法 插入到L3中;
Out(L3); 输出L3;
return 0;
}
List IniList()
{ 初始化链表
List L;
L=(List)malloc(sizeof(struct Node));
if(!L) return NULL;
L->next=NULL;
return L;
}
void In(List L)
{
List p; 定义个List类型的P链表指针
int a; 定义一个a用于输入链表的值
scanf("%d",&a);
while(a!=-1) 根据题目意思当a=-1时停止输入;
{
p=(List)malloc(sizeof(struct Node));
if(!p) return; 初始化链表p
p->data=a; p的数据等于a
p->next=NULL; p的下一个节点等于空
L->next=p; 用尾插法让L头指针的下一个节点等于p
L=p; L数据等于p的数据。
scanf("%d",&a);
}
}
void Out(List L)
{
L=L->next; 让L等于头节点的下一个节点,从而进行输出链表L中数值
if(L==NULL)
{
printf("NULL"); 如果L等于NULL则输出NULL;
return;
}
printf("%d",L->data);
L=L->next; 输出L的数据后让L等于下一个节点的数据继续输出。
while(L)
{
printf(" %d",L->data);
L=L->next;
}
}
void combine(List L1,List L2,List L3) 比较L1,L2表中的数值。
{
L1=L1->next; 让L1,L2都等于各自头节点的下一节点
L2=L2->next;
while(L1!=NULL&&L2!=NULL) 当L1或L2中有一个等于NULL就结束循环
{
if(L1->data>L2->data) 判断L1的数据是否大于L2,
{
L3->next=L2; 如果大于L2的数据则用尾插法把L2的值插在L3中
L2=L2->next;
}
else
{
L3->next=L1; 否则就把L1的值插在L3中
L1=L1->next;
}
L3=L3->next;
}
if(L1==NULL&&L2==NULL) return;
if(L1!=NULL)
L3->next=L1; 如果L1,L2中有一个等于NULL 后跳出循环后,另一个链表中还有未插入的数据直接插在L3的后面
else L3->next=L2;
}
代码截图
PTA测试结果
错误分析:首先编译错误是因为定义结构体时忘记添加*List 倒置第一个函数的List 未知,后面部分正确是因为格式原因 最后一个不能有空格。
二、截图本周题目集的PTA最后排名
1、顺序表PTA排名
PTA总分201。
三、本周学习总结
1、谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
本周数据结构时间安排的较短,安排在了周五晚上和周六白天, 经历果这次之后发现以后一定要把时间多拍一点,才不会非常赶搞得非常累。
2、谈谈你对线性表的认识
线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
来源:https://www.cnblogs.com/MR-LlN/p/8641326.html