博客园作业02——线性表

1.本周学习总结

1.1思维导图

1.2.谈谈你对线性表的认识及学习体会

本周我们学习了顺序表和链表的知识,自我感觉对它们已经有了初步的认识,但是可能因为链表相对于顺序表的操作可能会更加的复杂与抽象,对于一些相对复杂的操作可能还不是特别的熟悉,比如说逆置与插入,每次做题前都要想很久该怎么做,这其实就是对链表的基础掌握太不扎实。通过这一周数据结构的学习,我能很明显感觉到数据结构相较于c,会更加的理论化和抽象化,需要我们能更加深层的理解代码,要我们清楚的知道要怎么进行步骤。如果你只敲完代码,却不去真正理解,去想明白他的结构与变换方法,就会像我一样,敲完一题代码,过了几天,又把它的原理忘得一干二净。吸取了上次的教训,在今后的数据结构的学习中,我要更加频繁的去读代码,去理解代码,而不是一打完就晾在一旁,勤能补拙!

2.PTA实验作业

2.1.题目1:6-9 jmu-ds-有序链表合并

2.1.1设计思路(伪代码)

思路:先将两个链表的数据依次存入一个数组中,在对这个数组进行排序和删除重复元素的操作,再将这个数组通过尾插法插入一个新链表中,再将新链表的值赋给要返回的链表。
伪代码:

排序函数
 定义整形数组 a
 定义三个整型变量i=0,k,j
 LinkList p;
 p=p->next;
 while(p不为空)
   数据存入数组
   p移向下一个节点
   i++
end while
LinkList c;
c=L2->next
while(c不为空)
   数据存入数组
   c移向下一个节点;
   i++;
end while
for j=0 to i
  for k=0 to j
     冒泡法排序
   end for
 end for
定义整型变量 q,w=0;
删除数组里的重复元素
LinkList s r L;
定义一个整型变量 m
用尾插法将数组数据写入一个链表
L1=L;

2.1.2代码截图


2.1.3本题PTA提交列表说明

说明

  • Q:一开始没想到用尾插法将数组的值写入
  • A:尾插法是一个很好的将数组的值输入链表的工具
  • Q:在数组里删除重复元素不太熟悉
  • A:我们以前的题目都是删数据后返回长度,对于这类的算法可能我接触的不多,最后想了很久终于想出来一种算法

2.2.题目2:6-10 jmu-ds-有序链表的插入删除

2.1.1设计思路(伪代码)

思路:通过遍历链表找到插入位置进行插入,这样插入的得到的链表是有序的,在遍历链表得到相同的元素,继续删除,输出链表
伪代码:

插入函数
 LinkList p,r,q
 q = new LNode;
 p = L->next;
 r = L;
 q->data = e;
 q->next = NULL;
while (p)
if (p->data >= e)//寻找插入位置 	
  记录位置并插入
end if
  后移
end while
  q->next = p;
  r->next = q;
删除函数
 if (L->next == NULL) return;
 LinkList p, r, c;
 p = r = L;
 c = L->next;
 while (r->next)
 if (c->data == e)//寻找删除元素 
  删除数据
 return;
end if
 记录位置并后移
end while
cout << e <<"找不到!"<< endl;

2.2.2代码截图

2.2.3本题PTA提交列表说明

说明

  • Q:没有按pta中的输出的要求的输出格式
  • A:以后这种东西我一定复制!!!!
  • Q:一开始忘记记录位置直接开始往下继续遍历链表
  • A:导致位置多移了一位

2.3.题目3:7-1 两个有序序列的中位数 (25 分

2.3.1设计思路(伪代码)

思路:将两个有序表里的数据按顺序输入一个数组中,在输出这个数组中相应位置的元素
伪代码:

#include <iostream>
#define MaxSize 100000
using namespace std;
typedef int ElemType; 
typedef struct 
{	
    int data[MaxSize];		//存放顺序表元素
    int length ;			//存放顺序表的长度
} List;	
typedef List *SqList;
void CreateList(SqList &L,int n);//建顺序表 
void LineNode(SqList &L1,SqList &L2,int n);//排序 
int main() 
{
	定义两个整型变量i,n
	新建两条链L1,L2
	输入线性表元素个数 
	CreateList(L1,n);//创建线性表
	CreateList(L2,n);//创建线性表
	LineNode(L1,L2,n);//排序 
} 
void CreateList(SqList &L,int n)
{
	尾插法建链表
}
void LineNode(SqList &L1,SqList &L2,int n)
{
	定义两个整型变量i,j和num,t都等于0
	SqList L;	
	定义一个整形数组
	判断大小分别以小的数据写入数组,i与j要小于两条链的长度
	长度翻倍
	num=(n-1)*0.5;
	cout<<b[num];
 } 


2.3.2代码截图


2.3.3本题PTA提交列表说明

说明

  • Q:一开始直接将两个链表的元素写入数组,再在数组中进行冒泡法排序
  • A:导致时间复杂度过大,没有达到题目要求的时间限制
  • Q:输出时没把握好输出的位置,导致输出错误
  • A:题目叫你输出那个位置你就输出,不用相应的加减

3、阅读代码

3.1 题目

从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删除元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。

3.2 解题思路

搜索整个线性表,查找最小值元素的位置,并记录该位置,然后用最后一个元素的值将其覆盖,并返回最小值。

3.3 代码截图

3.4 学习体会

为什么不传递值,而传递地址?
函数内部的都是局部变量,对这些变量的操作只在函数内部有效。细节一点儿,局部变量存放在计算机的寄存器中,不写入主存,也就不改变内存中的C代码(数据)。
这里如果函数调用传递的是顺序表L,L就相当于局部变量,相当于复制了L,并不会修改最初的L。而如果引用L的地址,可以直接操作内存,修改的就是L,修改后的内容也会被写入L对应的存储空间。

posted @ 2019-03-30 22:41  AshinLuoX  阅读(305)  评论(0编辑  收藏  举报