第二次作业--线性表

一、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、谈谈你对线性表的认识

线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。 

posted @ 2018-03-24 20:35  Just丶  阅读(337)  评论(0编辑  收藏  举报