前置的一些东西
书上都有的我就不写了比如什么数据元素数据项等等,只及以下经常提到的或者自己对概念的理解。想看概念去 [1]数据结构严蔚敏C语言版p4序章1.2,我也是看着这个书写的
算法的特性:
- 有穷(能执行完),
- 确定(每条指令有明确含义无二义性,相同输入会有相同输出),
- 可行性(可以由有限个指令实现),
- 有一个或多个输入/输出
良好算法要求: - 正确(边缘的数据也能得到预期输出)
- 可读性,
- 健壮性(鲁棒性鲁大营老师很棒(。・∀・)ノ对于莫名其妙的输入也能处理不会崩)
- 时间空间复杂度良好。
# 时间复杂度
# 空间复杂度
# 线性表(LinerTable)
一般的线性表系统已经实现好了,自己再实现一次差不多就是对系统的list进行封装而已,注意内存地址连续。
性质:
- 有穷性有限个元素,元素长度就是表长
- 有前驱和后继节点,只有一个直接前驱和直接后继,头无前驱尾无后继
- 同一性,数据元素类型必需相同
- 有序性,存在序偶关系
顺序表也就是数组,直接存放在连续的内存中,物理内存对应和顺序是一致的。从0开始数不能切片
基本操作:初始化插入查找删除修改求长度
线性表查找插入等的时间耗费主要在表中结点的移动操作上,设在线性表L中的第i元素之前插入结点的概率为Pi,设各个位置插入是等概率,则Pi=1/(n+1)
?.而插入时移动结点的次数为n-i+1
.
总的平均移动次数:Einsert=ΣPi*(n-i+1)
(1<i<n) Einsert=n/2
即在顺序表上做插入运算,平均要移动表上一半结点。当表长n较大时,算法的效率相当低。因此算法的平均时间复杂度为 O(n)
.
动态分配
动态分配p=(LNode*)malloc(sizeof(LNode));
函数malloc
分配了一个类型为LNode的结点变量的空间,并其首地址放入指针变量p中。
动态释放free(p);
系统回收由指针变量p所指向的内存区。p必须是最近一次调用malloc函数时的返回值。
# 链表
一维,顺序存储的数据元素,可以直接用while进行遍历。只能从头开始,因为没有指向上一个的指针,而且有时候都没有变量名,就维护一个表。表头没有上一个结点,表尾没有下一个节点指向nullptr
点击查看线性表代码
/*include here*/
#include "iostream"
#include "string"
/*define here*/
using namespace std;
/*function&class*/
static int num=0;//表示这是创建的第几个node
class Liner {
private :
string value;
Liner *next;
public:
string GetValue(){//get 方法
return this->value;
}
int SetValue(string &v){//set方法
this->value=v;
return 1;
}
Liner GetNext(){
if (this->next!= nullptr){
return *this->next;//取值
}
else{
cout<<"no next node"<<endl;
}
}
Liner(string value="no first data set!",Liner *next=nullptr){
this->value = value;
this->next = next;
}
};
//entry
int main() {
cout << "hello world" << endl;
Liner B("you succeed");
Liner A("12345",&B);
cout<<A.GetNext().GetValue()<<endl;
return 0;
}
/*
created by a_little_rubbish
have a nice day : )
*/
# 链表插入,遍历,删除相同元素
链表删除相同的值,单链表往后循环的比,挨个删除
# 链表有序合并
# 双向链表&循环链表
插入,删除+删除相同元素(注意顺序或者用暂时的指针存储两种断表方式),遍历
# 一些应用
一元多项式的相加
(浮点系数为0怎么办1.0e-6)