数据结构(c语言版本来写)
第一章 数据结构入门
第二章 链表
第三章 栈
第四章 队列
第五章 串,数组,矩阵,广义表
第六章 树
第七章 图
第八章 算法—查找
第九章 算法—排序
第十章 算法,思维培养
第一章 数据结构入门
要想学好数据结构,就要学好数组和指针和结构和其他数据形式
必须开这个头,可能刚开始比较困难,只有入了这个门才能学好
第二章 链表
我们在开始计算机课程没多久后就已经知晓了数组的概念,数组作为一个顺序储存方式数据结构为我们的程序设计带来了大量的便利,几乎任何的高级程序设计,算法设计都离不开数组的灵活使用,但是,数组最大的缺点就是我们的插入和删除时需要移动大量的元素,显然这需要消耗大量的时间。
以C语言数组插入一个元素为例,当我们需要在一个数组{1,2,3,4,5,6,7}的第1个元素后(即第2个元素)的位置插入一个’A’时
我们需要做的有,将第1个元素后的整体元素后移,形成新的数组{1,2,2,3,4,5,6,7},再将第2个元素位置的元素替换为我们所需要的元素’A’,最终形成我们的预期,一个简单的插入操作要进行那么多的步骤,显然不是很核算。
C语言使用中,由于以上出现的这些问题,我们链表的概念就应运而生,链表通过不连续的储存方式,以及指针的灵活使用,巧妙的简化了上诉的内容,同时链表是自适应内存大小的,也就是说无论我们设多大的数据,理论上都可以实现。
需要学到链表:单链表,双向链表,循环链表
第三章 栈
栈是一种先进后出的数据结构。
栈(stack)是限定仅在表的一端进行操作的数据结构,设想一个单链表我们只能够对其链表的表尾结点进行操作,而操作也只能够进行插入一个新的结点与删除最末尾的这个结点两个操作,而这样强限制性的‘链表’,就是我们所说的栈。
第四章 队列
队列是一个先进先出的数据结构。
队列(queue)是限定在表的一端进行插入,表的另一端进行删除的数据结构,如同栈的学习,请联系前文所学链表,试想一个单链表,我们只能对他的链表表尾进行插入,而只能对链表的表头进行结点的删除,其余一切的操作均不允许,这样强限制性的“链表“,就是我们所说的队列。
让我们重新理顺一下定义:队列是一个线性的数据结构,规定这个数据结构只允许在一端进行插入,另一端进行删除,禁止直接访问除这两端以外的一切数据。
第二章 链表 第三章 栈 第四章 队列 学习总结:
了解其原理,就业方面需要手写出来,但是大部分都可以直接去c标准库去找,也就是说不需要自己动手去打,但是就得先懂其原理,对以后学其他高级语言都心中有数。
第五章 串,数组,矩阵,广义表
串:串的算法常用BF和KMP;BF:暴力解决 KMP:就是优化的解决
对BF和KMP两个比较的话,最坏的情况的坏 BF(O(n*m)) KMP(O(n+m)),如果正常使用的话BF和KMP差不多,KMP的优越出现在主串和支串有很多部分匹配的情况下。
矩阵:线性代数和离散数学都讲过。
广义表:我们以常规方法来看,广义表是一种不定规模的数据结构,很难为之分配具体的空间,因此创建的方法采用动态的链式方法,动态的创建空间。和链表差不多。
第六章 树
树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。
树的算法:树的遍历:
先序遍历:根左右
中序遍历:左根右
后序遍历:左右根
DFS和BFS这两个算法得搞懂(树的比较重要的)
哈夫曼树和哈夫曼编码远不及DFS和BFS重要。
第七章 图
我感觉图和树的算法都是一样的思想差不多
第八章 算法—查找
1.线性(顺序)查找
2.折半查找(二分查找)(重点)
3.分块查找算法
4.动态查找-二叉排序树(重点)
5.动态查找-平衡二叉树(重点)
第九章 算法—排序
1.冒泡排序算法
2.简单选择排序算法
3.直接插入排序算法
4.希尔排序算法
5.堆排序算法(同样重要)
6.归并排序算法
7.快速排序算法(一个解决所有问题)
8.排序算法总结
我认为5 7 是必须掌握的 一个解决所有,一个适合大数据排序。
第十章 算法,思维培养
1.哈希算法实例
2.动态规划DP算法
3.贪心算法
4.博弈算法
小结:未完待续
附加一个用线性表做的图书管理系统
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#define OK 1
#define ERROE 0
#define OVERFLOW -2
#define MAXSIZE 100 // 表的最大长度
using namespace std;
typedef int status; // 返回值的状态
typedef int ElemType; // 返回值的状态
// 书籍结构体
struct Book
{
string id; // 编号
string name; // 名字
double price; // 价格
};
// 顺序表的结构体
typedef struct
{
Book *elem; // 顺序表的地址
int length; // 表长
}Sqlist;
// 顺序表的初始化
status InitlistSq(Sqlist &L)
{
L.elem = new Book[MAXSIZE];
if (!L.elem)
{
exit(OVERFLOW);
}
L.length = 0;
return OK;
}
// 顺序表的取值
status GetElems(Sqlist L, int i, Book &e)
{
if (i<1 || i>L.length)
{
return ERROE;
}
e = L.elem[i - 1];
return OK;
}
// 顺序表的查找
int locateElem_Sq(Sqlist L, double e)
{
for (int i = 0; i < L.length; i++)
{
if (L.elem[i].price == e)
{
return i + 1;
}
}
return 0; // 查找失败
}
// 顺序表的插入
status ListInsertSq(Sqlist &L,int i,Book e)
{
if (i < 1 || (i > L.length + 1))
{
return ERROE;
}
if (L.length == MAXSIZE)
{
return ERROE;
}
for (int j = L.length-1; j >=i-1 ; j--)
{
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;
++L.length;
return OK;
}
// 顺序表的删除
status ListDeleteSq(Sqlist &L,int i)
{
if (i < 1 || (i > L.length ))
{
return ERROE;
}
for (int j = i; j <= L.length; j++)
{
L.elem[j - 1] = L.elem[j];
}
--L.length;
return OK;
}
int main()
{
Sqlist L;
int i = 0;
int temp, a, c, choose = -1;
double price;
Book e;
string hand_1, hand_2, hand_3;
cout << "*****************************************************" << endl;
cout << "* *" << endl;
cout << "* 1 建立 2 录入 3 取值 4 查找 *" << endl;
cout << "* *" << endl;
cout << "* 5 插入 6 删除 7 输出 0 退出 *" << endl;
cout << "* *" << endl;
cout << "*****************************************************" << endl;
while (choose != 0)
{
cout << "请选择操作项【0-7】:";
cin >> choose;
switch (choose)
{
case 1: // 创建顺序表
if (InitlistSq(L))
{
cout << "顺序表创建成功!" << endl;
}
else
{
cout << "顺序表创建失败!" << endl;
}
break;
case 2: // 顺序表信息录入
{
int i = 0;
L.elem = new Book[MAXSIZE];
if (!L.elem)
{
exit(OVERFLOW);
}
L.length = 0;
FILE *fp;
// fp=fopen("book.txt","r");
//char FilePtr;
fstream FilePtr;
FilePtr.open("book.txt");
// FilePtr=getc(fp);
if (!FilePtr)
{
cout << "文件读取失败!" << endl;
exit(ERROE);
}
FilePtr >> hand_1 >> hand_2 >> hand_3;
while (!FilePtr.eof())
{
FilePtr >> L.elem[i].id >> L.elem[i].name >> L.elem[i].price;
i++;
}
cout << "书籍信息导入成功!" << endl;
L.length = i;
FilePtr.close();
break;
}
case 3: //取值
{
cout << "请输入要查找的图书的价格排列:" << endl;
cout<<"请在1到"<<L.length<<"查找"<<endl;
cin>>c;
if(GetElems(L, c, e))
{
cout << "查找成功!" << endl;
cout << setw(15) << e.id;
cout << setw(40) << e.name;
cout << setw(10) << e.price << endl;
}
else
{
cout << "查找失败!" << endl;
}
break;
case 4: //查找
{
cout << "请输入要查找的图书所对应的价格:" << endl;
cin>>c;
int d=0;
d=locateElem_Sq(L,c);
if(d!=0)
{
cout << setw(15) << L.elem[d-1].id;
cout << setw(40) << L.elem[d-1].name;
cout << setw(10) << L.elem[d-1].price << endl;
}
else
{
cout << "查找失败!" << endl;
}
}
break;
case 5: //插入
{
cout << "请输入要插入图书的图书位置:" << endl;
int n,i;
i=L.length;
cin>>n;
if(n>L.length) {
cout<<"你的输入插入位置有误,请重新输入!!!"<<endl;
break;
}
else{
cout<<endl;
cout<<"请输入该图书的id"<<endl;
cin>>e.id;
cout<<endl;
cout<<"请输入该图书的name"<<endl;
cin>>e.name;
cout<<endl;
cout<<"请输入该图书的price"<<endl;
cin>>e.price;
cout<<endl;
status ListInsertSq(Sqlist &L,int n,Book e);
ListInsertSq(L,n,e);
if(L.length>i) cout<<"成功插入!"<<endl;
else cout<<"插入失败!"<<endl;
}
break;
}
case 6: // 顺序表的删除
cout << "请输入要删除的图书位置:" << endl;
cin >> c;
if (ListDeleteSq(L,c))
{
cout << "删除成功!" << endl;
}
else
{
cout << "删除失败!" << endl;
}
break;
}
case 7: // 输出顺序表
cout << "当前图书信息管理系统输出数据如下:" << endl;
for (int i = 0; i < L.length; i++)
{
cout << left << setw(15) << L.elem[i].id;
cout << left << setw(40) << L.elem[i].name;
cout << left << setw(10) << L.elem[i].price << endl;
}
break;
case 0:
break;
default:
cout<<"你的输入有误,请重新输入!!!"<<endl;
break;
}
}
return 0;
}
非常欢迎大家能在讨论区指出此文的不足处,作者会及时对文章加以修正 !如果有任何问题,欢迎评论,非常乐意为您解答