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对应的存储空间。