第二章随笔小结
看到链表实在很慌。因为上学期学c++时这方面没怎么学,对于其的使用和理解都很浅薄,导致在看这方面的代码和使用时都很吃力。
好在老师讲的很详细,代码的注释也很多。对于链表的原理和诸如插入,删除,查询等这方面代码是怎么走的已经了解的十分详细。剩下的就是语法规则,这就是要自己看书恶补一翻了。
感觉数据结构偏理论性,相对于解决问题它更强调在解决问题的基础上对空间和时间的利用和把控,因此在编程时要考虑的问题很多,循环一个不小心时间可能就几倍几十倍的增长。写作业算是第一次要处心积虑的去优化代码,去减小运行时间。第一次傻傻的直接双循环之后排序,果不其然的超时了。在老师的提醒下先排序在输出,然后在纸上走了一下大致过程,又找到了两处可优化的地方(1.比较中,你所对比的那个数组(以下称为副数组)的数比所比较的那个数大的话直接跳出循环,因为副数组之后的数肯定都比其大。2.下一个数比较时,从比较的上一个数开始,前面的无需比较),这样就可以成功了。
另外感觉链表十分的绕,以下是一段代码
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
} LNode, *LinkList;
Status InitList( LinkList&L ); //函数声明
void CreateList( LinkList&L,int n ); //函数声明
void DisplayList( LinkList ); //函数声明
void DestroyList( LinkList ); //函数声明
int main()
{
LinkList L; //将值传递
InitList( L ); //函数调用
int n;
cin >> n;
CreateList( L, n );
DisplayList( L );
DestroyList( L );
return 0;
}
Status InitList( LinkList&L )
{
L = new LNode ;
L->next = NULL ;
return OK;
}
void CreateList( LinkList&L,int n )
//尾插法建立带头结点的有n个元素的链表
{
LNode *p, *r; //定义p与r两个指针
r = L ; //尾指针r指向头结点
for( int i=0; i<n; ++i ){
p = new LNode ; //生成新结点p
cin >> p->data; //输入元素值
p->next = NULL;
r->next = p ; //将p插入到表尾
r = p ; //r指向新的尾结点
}
}
void DisplayList( LinkList L )
//遍历带头结点的单链表
{
LNode *p = L->next ;
while ( p )
{
if(p->next==NULL){
cout<<p->data;
p=p->next;
}
else{
cout << p->data << " ";
p = p->next ;
}
}
}
void DestroyList( LinkList L )
{//回收L的所有结点的空间
LNode *p = L, *q;
while ( p ) //当p指向结点不为空
{
q = p->next; //q指向p的下一结点
delete p; //回收p指向的结点空间
p = q; //p指向q指向的结点
}
}
作业的填空题,看了N久,在注释的帮助下理解了许多,包括其遍历其更改,以后要多看看类似的代码,把链表这一块彻底熟练。
写的时候参考了几篇博客1.https://blog.csdn.net/qie_wei/article/details/79243417(曾一段时间怀疑sort的效率,想着自己写是不是能好许多,结果发现其效率还是很高的。同时也学习了其更多的用法)
2.https://blog.csdn.net/ybhjx/article/details/52422493(一些排序方法)
3.https://www.cnblogs.com/byonecry/p/4458821.html(链表的一些用法,配合书理解的更深了吧)
下面目标:1.彻底熟练链表和顺序表的种种操作
2.以后在编程时多多考虑优化时间和空间的问题