DS博客作业02--线性表

1.思维导图及学习体会

1.1 思维导图

1.2 学习体会

线性表的学习是对于对上学期知识的更深入的学习,相较于数组是一种更高效的做法,在本章的学习中,刚开始没有完全理解知识点,总是照着课本写,但是做了两三题之后不看课本,发现并没有完全理解,又重新看了些视频、请教同学,把之前所学的知识理解;但是在完成PTA的过程中,发现还是出现一些类似忘记判断空指针、指针域未置空等问题,还需要更加细心,还要继续加油呀💪

2.PTA实验作业

2.1 顺序表操作集

本题要求实现顺序表的操作集。
List MakeEmpty():创建并返回一个空的线性表;
Position Find( List L, ElementType X ):返回线性表中X的位置。若找不到则返回ERROR;
bool Insert( List L, ElementType X, Position P ):将X插入在位置P并返回true。若空间已满,则打印“FULL”并返回false;如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false;
bool Delete( List L, Position P ):将位置P的元素删除并返回true。若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值)并返回false。

2.1.1 设计思路

  • 设计思路:在查找,插入和删除函数中,首先都要判断位置是否合法
List MakeEmpty() //创建并返回一个空的线性表
{
	定义 L;
	动态申请内存;
	置空返回
} 
Position Find( List L, ElementType X ) //位置查找
{
	定义 i;
	for i=0 to i<=L->Last 
		找到并直接返回位置
	end for
	返回 ERROR;
}
bool Insert( List L, ElementType X, Position P ) //插入
{
	定义 i;
	if 表满
		输出 FULL;返回 false;
	end if
	if 位置非法
        	输出 ILLEGAL POSITION ;返回 false;
     	end if
	for i=L->Last+1 to i>P
		倒序后移
	end for
	L->Data[i]=X; //插入
	L->Last++;  
	返回 true;
}
bool Delete( List L, Position P ) //删除
{
	定义 i;
	if 位置非法
		输出 POSITION P EMPTY ;返回 false;
	end if
	for i=P to i<L->Last
		把i+1个数前移
	end for
	L->Last--;
	返回 true;
}

2.1.2 代码截图


2.1.3 PTA提交列表说明。

  • 1-2 刚开始没注意,忘记要用C的语法,就很开心的用C++语法,然后提交了两次,发现了这个问题
  • 3-5 修改成C的语法后,依旧答案错误,请教同学后发现,在创建线性表时,置空L->last=-1,而我是L->last=0,在插入时会少插入一个数

2.2 有序链表合并

已知两个递增链表序列L1与L2,2个链表都是带头结点链表。设计函数实现L1,L2的合并,合并的链表仍然递增有序,头结点为L1的头结点。 合并后需要去除重复元素。
void MergeList(LinkList &L1,LinkList L2);
输入格式: 输入分两行,先输入数据项个数,再输入数据项,数字用空格间隔。
输出格式: 在一行中输出合并后新的递增链表,数字间用空格分开,结尾不能有多余空格。

2.2.1 设计思路

  • 定义头结点L,遍历L1、L2直到其中某一条结束,按照从小到大的顺序把结点插入L后面,然后把剩余部分插入L中。
	定义链表结点 p,q,s,r,L;
	p指向L1的首个有效结点;
	q指向L2的首个有效结点;
	s=new LNode;
	s->next=NULL;
	L=s;
	while p&&q do//同时遍历两条链表,直至其中一条结束 
		if p结点值大于q结点值
			q结点插入L链表后面
            q向后挪
		else if p结点值小于q结点值
			p结点插入L链表后面
            p向后挪
		else
			p结点插入L链表后面
      	    p和q同时向后挪
      	end if
    end while
	if 未到达L1链尾 
	    L1剩余部分插入L中; end if
	if 未到达L2链尾 
	    L2剩余部分插入L中; end if
	L1=L;

2.2.2 代码截图

2.2.3 PTA提交列表说明。

  • 1-2 刚开始是想要直接在L1上操作,后来出现错误之后,采用建一个新的链表的方法解决,然后请教同学后也完成了直接在L1上的做法
  • 3-4 提交后发现在重复数据的测试点过不去,在编译器上多试了几组数据发现处理时会有遗漏,后来进行了修改

2.3 顺序表删除重复元素

设计一个算法,从顺序表中删除重复的元素,并使剩余元素间的相对次序保存不变。
输入格式: 第一行输入顺序表长度。 第二行输入顺序表数据元素。中间空格隔开。
输出格式:数据之间空格隔开,最后一项尾部不带空格。
void CreateSqList(List &L,int a[],int n); //创建顺序表
void DispSqList(List L);//输出顺序表
void DelSameNode(List &L) ;//删除顺序表重复元素

2.3.1 设计思路

  • 通过冒泡法将顺序表中数据进行排序,然后通过比较相邻数据,将重复的数据删除
其余两个函数与2.1的相同,就不再展示 
	定义 i,j,k=0,n,item;
	n=L->length;
	for i=0 to n
		for j=1 to n-i
			if L->data[j]<L->data[j-1]
				交换L->data[j]与L->data[j-1]的值
			end if 
		end for
	end for
	j=1;
    for i=1 to i<L->length
    	if i-1与i的数据不同 
     		L->data[j++]=L->data[i];//重构顺序表
	    k=j;
    end for	 
    L->length=k;

2.3.2 代码截图

2.3.3 PTA提交列表说明。

  • 1 因为没有仔细阅读题目,多提交了一个销毁函数
  • 2-4 空表的测试点没过,因为刚开始将j赋值为重构后顺序表的长度,发现j初始化为1,这样长度至少为1,后来新定义k,当表不为空时,将j的值赋给k

3.阅读代码

3.1 题目

3.2 解题思路

3.3 代码截图

3.4 学习体会

posted @ 2019-03-30 23:40  _TY  阅读(507)  评论(0编辑  收藏  举报