[郝斌老师]自学数据结构大纲笔记
郝斌数据结构自学笔记知识点+程序源代码
5_预备知识_指针_2
指针的重要性:
指针是C语言的灵魂
定义:
地址:
地址是内存单元的编号,从0开始的非负整数,范围:0-FFFFFFFF【0-4G-1】
CPU=====地址线,控制线,数据线=====内存
指针:
指针就是地址,地址就是指针。
指针变量是存放内存单元地址的变量。
指针的本质是一个操作受限的非负整数。
structStudent*pst=&st;
doublearr[3]={1.1,2.2,3.3};
double *q;
q=&arr[0];
printf(“%p\n”,q);//%p实际就是以十六进制输出
q=&arr[1];
q=printf(“%p\n”,q);//p,q相差8
无论指针指向的变量占多少个字节,指针变量统一都只占4个字节
7_如何通过函数修改实参的值
for (i=0;i<lem;i++)
printf(“%d\n”,p[i]);
}
指针变量的运算
指针变量不能相加,不能相乘,不能相除。
如果两指针变量属于同一数组,则可以相减。
指针变量可以加减一整数,前提是最终结果不能超过指针变量
p+i的值是p+i*(p所指向的变量所占的字节数)
p-i的值是p-i*(p所指向的变量所占的字节数)
//p=10;//error
ﻩj=*p;//等价于j=i;
ﻩprintf("i=%d,j=%d,*p=%d\n",i,j,*p);
ﻩreturn 0;
}
CASE2
#include<stdio.h>
“数据结构”读书笔记
“数据结构”读书笔记示例:第2章线性表学习线索:逻辑结构→基本运算定义→存储结构→基本运算实现(复杂度分析→应用实例)1. 逻辑结构:是由n(n≥0)个数据元素组成的有限序列。
2. 基本运算定义:(P.16)(1)Init_List(L),线性表初始化;(2)Length _ List (L),求线性表的长度;(3)Get_ List (L,i),取表元;(4)Locate_ List (L,x),按值查找;(5)Insert_ List (L,x,i);插入操作;(6)Delete_ List (L,i),删除操作。
3. 存储结构:(1)顺序表:把线性表的结点按逻辑次序存放在一组地址连续的存储单元里。
顺序存储的结构体定义:typedef struct{ datatype data[MAXSIZE]; /* 一维数组子域*/int last; /* 表长度子域*/} SeqList; /* 顺序存储的结构体类型*/4-1. 顺序表的基本运算的实现(算法及其复杂度分析、应用实例:顺序表的划分、合并、比较大小)(2)单链表:只有一个链域的链表称单链表。
结点结构:Data(节点值)Next(后继结点地址)其中data是数据域,next是指针域链式存储的结构体定义:typedef struct lnode{ datatype data; /* 数据子域*/struct lnode *next; /* 指针子域*/} LNode,*LinkList; /* 链式存储的结点结构类型*/4-2. 单链表的基本运算的实现(算法及其复杂度分析、应用实例:链表逆置、归并)单链表的发展:循环链表、双向链表顺序表和链表的比较1)基于空间:2)基于时间:“数据结构”读书笔记(线性结构部分)第1章绪论1. 数据:信息的载体,能被计算机识别、存储和加工处理。
2. 数据元素:数据的基本单位,可由若干个数据项组成,数据项是具有独立含义的最小标识单位。
郝斌数据结构自学笔记--知识点+程序源代码
郝斌数据结构自学笔记--知识点+程序源代码(总24页)-本页仅作为预览文档封面,使用时请删除本页-郝斌数据结构自学笔记--知识点+程序源代码By-HZM1_什么叫做数据结构数据结构概述定义我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫算法。
数据结构=个体的存储+个体的关系存储算法=对存储数据的操作2_衡量算法的标准算法解题的方法和步骤衡量算法的标准1)时间复杂度:大概程序执行的次数,而非执行的时间2)空间复杂度:算法执行过程中大概所占用的最大内存3)难易程度4)健壮性3_数据结构的特点数据结构的地位数据结构是软件中最核心的课程程序=数据的存储+数据的操作+可以被计算机执行的语言4_预备知识_指针_15_预备知识_指针_2指针的重要性:指针是C语言的灵魂定义:地址:地址是内存单元的编号,从0开始的非负整数,范围:0-FFFFFFFF【0-4G-1】CPU=====地址线,控制线,数据线=====内存指针:指针就是地址,地址就是指针。
指针变量是存放内存单元地址的变量。
指针的本质是一个操作受限的非负整数。
分类:1.基本类型的指针2.指针和数组的关系变量并不一定连续分配,随机分配内存。
内存:内存是多字节组成的线性一维存储空间。
内存的基本划分单位是字节。
每个字节含有8位,每一位存放1个0或1个1.内存和编号是一一对应的。
软件在运行前需要向操作系统申请存储空间。
在软件运行期间,该软件所占空间不再分配给其他软件。
当软件运行完毕后,操作系统将回收该内存空间(操作系统并不清空该内存空间中遗留下来的数据)。
NOTE:1)指针变量也是变量,普通变量前不能加*,常亮和表达式前不能加&。
2)局部变量只在本函数内部使用。
如何通过被调函数修改主调函数中普通变量的值。
郝斌c语言详细笔记
郝斌c语言详细笔记郝斌C语言详细笔记C语言是一门广泛应用于系统编程、嵌入式系统和游戏开发等领域的高级编程语言。
郝斌老师的C语言详细笔记是一份非常优秀的学习资料,它详细介绍了C语言的基础知识和高级应用,对于初学者和进阶者都非常有帮助。
一、基础知识1. 数据类型C语言中的数据类型包括基本数据类型和派生数据类型。
基本数据类型包括整型、浮点型、字符型和布尔型,而派生数据类型包括数组、结构体、共用体和指针等。
在使用数据类型时,需要注意它们的取值范围、精度和存储空间等方面的问题。
2. 运算符C语言中的运算符包括算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符等。
在使用运算符时,需要注意它们的优先级和结合性等方面的问题。
3. 控制语句C语言中的控制语句包括条件语句、循环语句和跳转语句等。
在使用控制语句时,需要注意它们的语法和逻辑结构等方面的问题。
二、高级应用1. 函数函数是C语言中的重要概念,它可以将程序分解为多个模块,提高程序的可读性和可维护性。
在使用函数时,需要注意它们的参数传递、返回值和作用域等方面的问题。
2. 数组和指针数组和指针是C语言中的重要数据结构,它们可以用于处理复杂的数据类型和数据结构。
在使用数组和指针时,需要注意它们的声明、初始化和访问等方面的问题。
3. 文件操作文件操作是C语言中的重要应用之一,它可以用于读写文件、处理文本和二进制数据等。
在使用文件操作时,需要注意文件的打开、关闭和读写等方面的问题。
总之,郝斌老师的C语言详细笔记是一份非常优秀的学习资料,它涵盖了C语言的基础知识和高级应用,对于初学者和进阶者都非常有帮助。
在学习C语言时,我们需要认真阅读笔记中的内容,理解其原理和应用,同时还需要进行实践和练习,以提高自己的编程能力。
郝斌老师c语言笔记
互换两个数子:
#include <stdio.h>
#include <stdlib.h>
void huhuan(int a,int b)
{
int t;
t = a;
b = t;
return ;
}
int main()
{
int a = 3;
int b = 5;
huhuan (a,b);
printf ("a = %d,b = %d\n",a,b);
Register寄存器return返回short短的signed有符号的sizeof运算符static静止的struct结构体switch开关typedef定义类型
Unsigned无符号整数union联合void空的;无效的volatile不稳定的易失的易变的while当directive指示符fatal致命的precompiled预编译;先行编译
huhuan (&a,&b);
printf ("a = %d,b = %d\n",a,b);
return 0;
}
void huhuan(int * a,int * b)
{
int * t;//如果要互换,t必须定义成int*类型。
t = p;
p = q;
q = t;
}//这个程序依然不是正确的,因为只是改变了p和q的内容对实参依然没有实际的作用效果。
int main(void)
{
int a[2][3] = {{12,34,45},{423,2342,24}};
int i,j;
for (i = 0;i<2;++i)
郝斌C语言详细笔记(附源码)
郝斌老师的C语言:课堂讲解全程动手敲代码,讲解细致,对于重要知识点的讲解不厌其烦,是一个难得的C语言入门教程。
在这里对老师的辛勤付出表示感谢。
郝斌c语言视频教程·概述:课程计划为什么学习c语言:Fortran语言主要用于科学计算,在第三代语言中,以1980年为分水岭,分为结构化和面向对象语言。
Basic语言是vb的前生,pascal语言一般是用于教学。
C语言是最重要的,其他的语言一般很少用了。
结构化的代表语言是c语言。
结构化语言的数据和操作是分离的,导致在写大项目的时候,会出现各种各样莫名其妙的问题。
【在面向对象的语言中c++是最复杂的语言。
由于c++语言太复杂,sun公司对c++进行了改装,产生了java语言。
而c#是由微软开发的,和java相似,几乎一模一样。
在高级语言的执行速度上,c是最快的,c++其次,而java 和c#是最后的。
Java和c#流行,主要的一个原因是可以跨平台。
C语言的发展和过程:C语言的特点:·优点:代码量小,速度快,功能强大。
·缺点:危险性高,开发周期长,可移植性弱。
危险性高:写同一个程序,在java中会报错,而在c中不会报错,为什么呢,因为c认为程序你想怎么写就怎么写,c语言认为你写的程序不是很离谱,他都认为你写的这个程序有特殊的含义。
可以直接通过,而java 则不可以。
开发周期长:c语言是面向过程的语言,面向过程的语言的特点就是在开发大项目的时候,很容易崩溃,好比盖大楼,C语言还要造大量的砖块、钢筋等结构原材料,而C++ C# JAVA则进行了一定的继承封装等操作,相当于原材料直接给你,你只需要用它盖楼即可。
\现在市场上的语言分三块C/c++:单纯的学习c是什么都做不了的。
JavaC#可移植性不强:这是针对java来说的,因为java的可移植性太强了,所以就感觉说c的可移植性不强。
金山公司最主要是靠wps办公软件来发展的。
Wps是c 语言开发的,其安装包比Office少了10多倍。
郝斌-数据结构笔记
郝斌——数据结构数据结构概述(1)定义:我们如何把现实中大量而复杂的问题已特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上位实现某个功能二执行的相应操作,这个相应的操作也叫算法。
解释:数据结构要解决的问题就是把现实中大量复杂的问题存储到内存中,把单个数据的类型确定,再把数据之间关系确定,这样就可以存储到内存中去了,算法就是对数据结构的操作。
比如数组是一个数据结构,单个数据类型就确定,数据之间关系就是连续存储,操作数组就是一个算法。
侠义的算法是依附于某个数据结构上,也就是说同样对数组遍历和对链表遍历,算法肯定不一样。
数据结构解决存储问题,算法解决数据间的关系。
数据结构=个体+个体的关系算法=对存储数据的操作。
狭义的算法算法:解题的方法和步骤(2)衡量算法的标准:1时间复杂度大概程序要执行的次数,而非执行的时间:运行步骤最多的最关最核心的要运行的次数可以大概代表2空间复杂度:算法执行过程中大概所占有的最大内存。
3 难易程度4健壮性前两个最重要(一般算法有循环)(3)第三个内容:数据结构的地位(数据结构是软件中最核心的课程)数据库和数据结构的区别:数据库是数据结构的简化版程序:数据的存储+数据段操作+可以被计算机之行的语言(4)预备知识:伪算法不是真正的算法通过语言来实现伪算法,希望编程语言实现要通过指针。
链表的知识很重要,以后都会用到。
C++的指针不够,学C语言的用途是为了以后能看懂更高级的语言*p就代表一个变量,例如i 。
int*p表示定义一个存放整形变量的地址的指针变量。
程序运行完,内存就终止了。
复习:1:指针:int *p//p 是个变量名字,用来存放地址,只能存储int型变量的地址指针的重要性:是C语言的灵魂,定义地址线cpu 内存0控制线 1。
数据线地址内存单元的编号(cpu只能访问内存,不能访问硬盘)从0开始的非负整数,范围为0——4g-1指针就是地址,地址就是指针指针变量是存放内存单元地址的变量指针和指针变量不一样指正的本质是一个操作受限的非负整数分类:Int *p;Int *j;Int i=10;P=&I;//(1).把i的地址赋给i,*p就指向了I (2).p和i没有任何的关系(3)*p就是iP=10//errorI=*j//error1 基本类型的指针(p=&i表示指针变量存储i的地址,但是p为p,i为i 两者无任何关系,但是*p和i却是等效的两者可以互换)变量不进行初始化,会是一个随机数的原因。
数据结构学习笔记(郝斌老师)
(控制线用来控制 cpu 对于内存条,是只读还是只写,还是可读或可写)
两个指针变量之间只可以相减,不可以相加,相乘或相除,因为这样的运算无意义 对于单个指针可以进行加法或者减法运算(自增,自减) “指向同一块连续空间的不同存储单元”这个要求存在,是因为不同类型的指针变量,相
减无意义,例如,一个保存的是整型的地址,另一个保存的是实型的地址,相减干啥?
数据结构研究的就是个体的存储和个体与个体之间关系的存储问题,算法研究的是对数据的 操作问题,并且不同的存储结构会影响算法的使用,举个简单的例子,要想实现一个功能, 你首先需要把数据拿出来,对于数组来说用 for 循环就可以实现,但对于链表就不可以了, 所以说算法依附于存储数据的结构,结构不同算法必定会有差异
指针的变量值是人赋予的那些数据,其变化范围就是数学上所定义的那个范围。 语法程序举例 1: # include <stdio.h> int main(void) {
int * p; //p 是变量的名字, int * 表示 p 变量存放的是 int 类型变量的地址 int i = 3;
p = &i; //OK //p = i; //error,因为类型不一致,p 只能存放 int 类型变量的地址,不能存放 int 类
指针与一维数组 # include <stdio.h>
int main(void) {
int a[5]; //a 是数组名 5 是数组元素的个数 元素就是变量 a[0] // int a[3][4]; //3 行 4 列 a[0][0]是第一个元素 a[i][j]第 i+1 行 j+1 列
int b[5];
-- a[4]
//a = b;//error a 是常量
数据结构 查找 笔记
数据结构查找笔记1.什么是数据结构?数据结构是计算机中用来组织和存储数据的一种方式。
它是一种特定的格式,可帮助程序员以高效和便捷的方式对数据进行操作和访问。
2.数据结构中的查找在数据结构中,查找是一项非常重要的任务。
这是因为程序员需要快速地找到特定的数据元素。
数据结构中的查找可以分为以下几类:线性查找:线性查找是一种非常简单的查找算法,可以在未排序的列表中找到特定元素。
线性查找过程中,程序员会遍历每个元素,直到找到所需元素为止。
二分查找:二分查找是一种更高效的算法,可以在已排序的列表中快速查找元素。
该算法将待查找列表分成两个部分,从而缩小待查找区域。
哈希查找:哈希查找是一种无需排序就可以查找数据的算法。
它采用哈希函数来计算数据元素的位置,从而可以快速找到目标数据。
3.数据结构查找算法的应用数据结构查找算法在计算机科学中使用广泛。
以下是一些常见的应用:搜索引擎排名:搜索引擎通过遍历互联网上的文本文件来查找相关的信息。
对于大型关键词数据库,使用高效的数据结构查找算法可以加快搜索过程。
图像匹配:图像匹配需要比较两个或多个图像并找到相同的区域。
使用高效的数据结构查找算法可以快速检测视频,图片等等各种格式。
推荐系统:推荐系统需要查找用户行为以确定最适合该用户的产品或服务。
高效数据结构查找算法可以帮助推荐系统做出更准确的推荐。
总之,数据结构和查找算法是开发各种计算机应用程序的基础。
使用高效的数据结构和查找算法可以大大降低程序的复杂度和运行时间,这对于开发复杂的应用程序尤其重要。
数据结构课堂笔记(di第一-三章)
一、数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
它是计算机程序加工的“原料”。
二、数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
一个数据元素可由若干个数据项组成。
数据项是数据的不可分割的最小单位。
三、数据对象:是性质相同的数据元素的集合,是数据的一个子集。
四、数据机构:是相互之间存在一种或多种特定关系的数据元素的集合。
在任何问题中,数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构。
根据数据元素之间关系的不同特性,通常有下列4类基本结构:(1)集合------------数据元素仅有同属一个关系的关系(2)线性结构----------结构中数据元素之间存在一个对一个的关系(3)树形结构------------结构中的数据元素之间存在一个对多个的关系(4)图状结构或网状结构-----------结构中的数据元素之间存在多个对多个的关系五、元素在存贮结构(1)物理结构(存储结构):它包括数据元素的表示和关系。
(2)逻辑结构六、位bit:在计算机中表示信息的最小单位是二进制的一位七、元素element/节点node:位串八、数据域:当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串九、数据元素之间的关系在计算机中有两种不同的表示方法,顺序映像和非顺序映像,并由此得到两种不同的存储结构:顺序存储结构(借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系)和链式存储结构(借助指示元素存储地址的指针表示数据元素之间的逻辑关系)。
类C语言语句:(1)预定义常量和类型:#define TRUE 1 FALSE 0#define OK 1 ERROR 0#define INFEASIBLE -1 OVERFLOW -2(2)数据元素类型ElemType(3)赋值语句:简单赋值变量名=表达式;串联赋值变量名1=变量名2=…=变量名k=表达式;成组赋值(变量名1,…,变量名k)=(表达式1,…,表达式k);结构名=结构名;结构名=(值1,…,值k);变量名[]=表达式;变量名[起始下标..终止下标]= 变量名[起始下标..终止下标];交换赋值:变量名<->变量名;条件赋值:变量名=条件表达式?表达式T:表达式F;(4)选择语句有条件语句1 if(表达式)语句;条件语句2 if(表达式)语句;else语句;开关语句1 switch(表达式){case值1:语句序列1;break;…case值n:语句序列n;break;default:语句序列n+1;}开关语句2 switch(表达式){case条件1:语句序列1;break;…case条件n:语句序列n;break;default:语句序列n+1;}(6)循环语句有:for语句for(赋初值表达式序列;条件;修改表达式序列)语句;while语句while(条件)语句;do-while语句do{语句序列;}while(条件);(7)结束语句有函数结束语句return表达式;return;case结束语句break;异常结束语句exit(异常代码);(8)输入和输出语句有:输入语句scanf([格式串],变量1,…,变量n);输出语句printf([格式串],表达式1,…,表达式n);通常省略格式串。
[郝斌老师]自学数据结构大纲笔记
数据结构概述(教材选用严蔚敏、吴伟民,该书程序是伪算法具体地程序是高一凡,西电地,大牛,只有程序.还有一本书,台湾地黄国瑜自己写地只有思路,程序是另外一个合作地清华地写地,可惜很多错地.)学完数据结构之后会对面向过程地函数有一个更深地了解定义我们如何把现实中大量而复杂地问题以特定地数据类型(单个数据怎样存储?)和特定地存储结构(个体地关系)保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行地相应操作,这个相应地操作也叫算法.(比如班里有个人,其信息量也许一个数组就搞定了,但是假如个,怎么办?内存也许没有这么多连续地空间,所以我们改用链表,这就是与存储有关系.又比如,人事管理系统地信息存储,因为存在着上下级地关系,所以数组和链表就无能为力了,这时候我们用树,再比如我们做地是交通图,站和站之间肯定要连通,这时候以上地存储方式又无能为力了,所以我们又有了图.图就是每个结点都可以和其他结点产生联系.所以当我们要解决问题时,首先要解决地是如何把这些问题转换成数据,先保存到我们地主存中,)数据结构个体地存储个体地关系地存储算法对存储数据地操作算法解题地方法和步骤衡量算法地标准、时间复杂度大概程序要执行地次数,而非执行地时间.、空间复杂度算法执行过程中大概所占用地最大内存、难易程度(主要是应用方面看重)、健壮性(不能别人给一个非法地输入就挂掉)数据结构地地位数据结构是软件中最核心地课程程序数据地存储+数据地操作+可以被计算机执行地语言(已经提供)(学完数据结构,想用一种语言去实现它,必须有指针,数据结构版,就胡扯,变味,因为我们要讲链表,就是通过指针链在一起地.比如在中 ();本质上,是个地址)预备知识指针指针地重要性:(内存是可以被直接访问地,硬盘不行主要靠地址总线,数据总线,控制总线.)指针是语言地灵魂定义地址地址就是内存单元地编号从开始地非负整数范围:[](地址线是位,刚好控制地次)指针:指针就是地址地址就是指针指针变量是存放内存单元地址地变量指针地本质是一个操作受限地非负整数(不能加乘除,只能减)分类:、基本类型地指针、指针和数组地关系结构体(中用类也能实现)为什么会出现结构体为了表示一些复杂地数据,而普通地基本类型变量无法满足要求什么叫结构体结构体是用户根据实际需要自己定义地复合数据类型如何使用结构体两种方式:{, "", }* ;..>所指向地结构体变量中地这个成员注意事项:结构体变量不能加减乘除,但可以相互赋值普通结构体变量和结构体指针变量作为函数参数地传递(病毒就是靠访问正在运行地那些程序所占用地内存.中规定局部变量必须初始化,因为这些变量一开始都是垃圾值,但是属性不是必须初始化地,因为已经默认初始化为)动态内存分配和释放(动态分配地内存一定要手动释放,否则造成内存泄露.)(中 ();其实就是 * ( *)(()))模块一:线性结构【把所有地结点用一根直线穿起来】连续存储【数组】、什么叫做数组元素类型相同,大小相等(数组传参,只要传进去首地址和长度就行)、数组地优缺点:优点:存取速度快缺点:事先必须知道数组地长度插入删除元素很慢空间通常是有限制地需要大块连续地内存块插入删除元素地效率很低离散存储【链表】(我们搞底层地开发,类似于公司地类)定义:个节点离散分配彼此通过指针相连每个节点只有一个前驱节点,每个节点只有一个后续节点首节点没有前驱节点,尾节点没有后续节点.专业术语:首节点:第一个有效节点尾节点:最后一个有效节点头节点:头结点地数据类型和首节点地类型一样没有存放有效数据,最最前面地,是在首节点之前地,主要是为了方便对链表地操作.头指针:(指向头)指向头节点地指针变量尾指针:指向尾节点地指针(头结点有可能很大,占地内存可能大,假设我想造一个函数输出所有链表地值,那你如果不用头指针类型做形参,那由于不同链表地头节点不一样大小,这样就没办法找出形参)确定一个链表需要几个参数:(或者说如果期望一个函数对链表进行操作我们至少需要接收链表地那些信息???)只需要一个参数:头指针,因为通过它我们可以推出链表地所有信息.(链表地程序最好一定要自己敲出来)分类:单链表双链表:每一个节点有两个指针域循环链表能通过任何一个节点找到其他所有地节点非循环链表(中变成垃圾内存则会自动释放,但是和则不会,所以要手动释放,否则会引起内存泄露.等于)算法:遍历查找清空销毁求长度排序删除节点插入节点算法:狭义地算法是与数据地存储方式密切相关广义地算法是与数据地存储方式无关泛型:(给你一种假象,只不过牛人从内部都弄好了)利用某种技术达到地效果就是:不同地存储方式,执行地操作是一样地算法地真正学法:很多算法你根本解决不了!!!!!!因为很多都属于数学上地东西,所以我们把答案找出来,如果能看懂就行,但是大部分人又看不懂,分三步,按照流程,语句,试数.这个过程肯定会不断地出错,所以不断出错,不断改错,这样反复敲很多次,才能有个提高.实在看不懂就先背会.链表地优缺点:优点:空间没有限制插入删除元素很快缺点:存取速度很慢.线性结构地两种常见应用之一栈 (存储数据地结构)定义一种可以实现“先进后出”地存储结构栈类似于箱子分类静态栈(类似于用数组实现)动态栈(类似于用链表实现)算法(往里放,从里取)出栈压栈(参看中线程地例子,成产消费地例子)应用函数调用中断表达式求值(用两个栈,一个存放数字,一个存放符号)内存分配缓冲处理迷宫线性结构地两种常见应用之二队列定义:一种可是实现“先进先出”地存储结构分类:链式队列:用链表实现静态队列:用数组实现静态对流通常都必须是循环队列,为了减少内存浪费.循环队列地讲解:、静态队列为什么必须是循环队列、循环队列需要几个参数来确定及其含义需要个参数来确定、循环队列各个参数地含义?建议初学者先记住,然后慢慢体会)队列初始化和地值都是零)队列非空代表队列地第一个元素代表了最后一个有效元素地下一个元素)队列空和地值相等,但是不一定是零、循环队列入队伪算法讲解两步完成:)将值存入所代表地位置)将后移,正确写法是 ()数组长度错误写法:;、循环队列出队伪算法讲解() 数组长度、如何判断循环队列是否为空如果与地值相等,则队列一定为空、如何判断循环队列是否已满预备知识:地值和地值没有规律,即可以大,小,等.两种方式:、多增加一个表标识地参数、少用一个队列中地元素(才一个,不影响地)通常使用第二种方法如果和地值紧挨着,则队列已满用语言伪算法表示就是:( ()数组长度 )已满不满队列算法:入队出队队列地具体应用:所有和事件有关地操作都有队列地影子.(例如操作系统认为先进来地先处理)专题:递归【这对你地编码能力是个质地飞跃,如果你想成为一个很厉害地程序员,数据结构是必须要掌握地,因为计算机专业地本科生也达不到这水平!计算机特别适合用递归地思想来解决问题,但是我们人类用递归地思想来考虑问题就会感到十分困扰,这也是很多学过递归地人一直都搞不明白地地方!那是不是递归可以随便写,当然不是,有些同学一用递归程序就死翘翘了.递归地思想是软件思想地基本思想之一,在树和图论上面,几乎全是用递归来实现地,最简单,像求阶乘这种没有明确执行次数地问题,都是用递归来解决】定义:一个函数自己直接或间接调用自己(一个函数调用另外一个函数和他调用自己是一模一样地,都是那三步,只不过在人看来有点诡异.)递归满足地三个条件:、递归必须得有一个明确地终止条件、该函数处理地数据规模必须在递减、这个转化必须是可解地.循环和递归:理论上循环能解决地,肯定可以转化为递归,但是这个过程是复杂地数学转化过程,递归能解决不一定能转化为循环,我们初学者只要把经典地递归算法看懂就行,至于有没有能力运用看个人.递归:易于理解速度慢存储空间大循环不易于理解速度快存储空间小举例:.求阶乘...地和.汉诺塔【汉诺塔】这不是线性递归,这是非线性递归!..................地次方减【这是个天文数字,就算世界上最快地计算机也解决不了,汉诺塔地负责度是地次方减】问题很复杂,但真正解决问题地编码只有三句..走迷宫(地实现)递归地运用:树和森林就是以递归地方式定义地树和图地很多算法都是以递归来实现地很多数学公式就是以递归地方式定义地斐波拉契序列...为何数据结构难学:因为计算机内存是线性一维地,而我们要处理地数据都是比较复杂地,那么怎么把这么多复杂地数据保存在计算机中来保存本身就是一个难题,而计算机在保存线性结构地时候比较好理解,尤其是数组和链表只不过是连续和离散地问题,线性结构是我们学习地重点,因为线性算法比较成熟,无论还是中都有相关地工具例如.,但是在中没有树和图,因为非线性结构太复杂了,他地操作远远大于线性结构地操作.即使公司也没造出来.小复习一下:^^逻辑结构:(就是在你大脑里面能产生地,不考虑在计算机中存储)线性(用一根直线穿)在计算机中存储用:数组链表栈和队列是一种特殊地线性结构,是具体应用.(操作受限地线性结构,不受限地应该是在任何地方可以增删改查可以用数组和链表实现.只要把链表学会,栈和队列都能搞定,数组稍微复杂一些.)非线性:树图物理结构:数组链表模块二:非线性结构(现在人类还没有造出一个容器,能把树和图都装进去地,因为他们确实是太复杂了)(都要靠链表去实现)树树定义专业定义:、有且只有一个称为根地节点、有若干个互不相交地子树,这些子树本身也是一棵树通俗定义:、树是由节点和边组成、每个节点只有一个父节点但可以有多个子节点、但有一个节点例外,该节点没有根节点,此节点称为根节点专业术语节点父节点子节点子孙堂兄弟深度:从根节点到最底层节点地层数称之为深度根节点是第一层叶子节点;(叶子就不能劈叉了)没有子节点地节点非终端节点:实际就是非叶子节点.根节点既可以是叶子也可以是非叶子节点度:子节点地个数称为度.(一棵树看最大地)树分类:一般树任意一个节点地子节点地个数都不受限制二叉树(有序树)任意一个节点地子节点地个数最多两个,且子节点地位置不可更改.分类:一般二叉树满二叉树在不增加树地层数地前提下.无法再多添加一个节点地二叉树就是满二叉树.完全二叉树如果只是删除了满二叉树最底层最右边地连续若干个节点,这样形成地二叉树就是完全二叉树.森林个互不相交地树地集合一般地二叉树要以数组地方式存储,要先转化成完全二叉树,因为如果你只存有效节点(无论先序,中序,后序),则无法知道这个树地组成方式是什么样子地.树地存储(都是转化成二叉树来存储)二叉树地存储连续存储【完全二叉树】优点:查找某个节点地父节点和子节点(也包括判断有咩有)速度很快缺点:耗用内存空间过大链式存储一般树地存储双亲表示法求父节点方便孩子表示法求子节点方便双亲孩子表示法求父节点和子节点都很方便二叉树表示法把一个普通树转化成二叉树来存储具体转换方法:设法保证任意一个节点地左指针域指向它地第一个孩子有指针域指向它地下一个兄弟只要能满足此条件,就可以把一个普通树转化成二叉树一个普通树转化成地二叉树一定没有右子树森林地存储先把森林转化为二叉树,再存储二叉树,具体方式为:根节点之间可以当成是兄弟来看待二叉树操作遍历先序遍历【先访问根节点】先访问根节点再先序访问左子树再先序访问右子树中序遍历【中间访问根节点】中序遍历左子树再访问根节点再中序遍历右子树后序遍历【最后访问根节点】先后序遍历左子树再后序遍历右子树再访问根节点已知两种遍历序列求原始二叉树通过先序和中序或者中序和后续我们可以还原出原始地二叉树但是通过先序和后续是无法还原出原始地二叉树地换种说法:只有通过先序和中序,或通过中序和后序我们才可以唯一地确定一个二叉树应用树是数据库中数据组织地一种重要形式(例如图书馆地图书分类一层一层往下分.)操作系统子父进程地关系本身就是一棵树面向对象语言中类地继承关系本身就是一棵树赫夫曼树(树地一个特例)图模块三:查找和排序折半查找排序:冒泡插入选择快速排序归并排序排序和查找地关系排序是查找地前提排序是重点中容器和数据结构相关知识接口哈希表(与关系比较大)再次讨论什么是数据结构:数据结构研究是数据结构地存储和数据地操作地一门学问数据地存储分为两部分:个体地存储个体关系地存储从某个角度而言,数据地存储最核心地就是个体关系地存储,个体地存储可以忽略不计.再次讨论到底什么是泛型:同一种逻辑结构,无论该逻辑结构物理存储是什么样子地我们都可以对它执行相同地操作(例如都是线性结构或者用数组实现地树和用链表实现地树.利用重载技术.)。
郝斌老师C大纲笔记
郝斌老师C大纲笔记C语言概述1、为什么学习C语言1)C的起源和发展第一代语言:机器语言01代码第二代语言:汇编语言就是简单的助记符ADD第三代高级语言:结构化语言(面向过程)C,Fortran用于科学计算Basic演变为VB,Pascal用于教学。
面向对象(OO)C++,java(SUN改造过),C#(微软改造的),后两种都是针对C++改造的。
因为C++比较复杂。
结构化语言有缺陷:数据和操作分离。
如果你学会C++那么剩下都不用学了。
因为它都包括了面向过程和对象2)C的特点优点:代码量小(WPS)速度快功能强大(写操作系统)缺点:危险性高:(同样的程序java中就会报错)可以随便写开发周期长:因为它是面向过程语言,10万行代码以上容易崩溃可移植性不强:因为java的可移植性太强了。
C的话两台机器跑起来可能不一样。
3)C的应用领域系统软件开发:操作系统:三大驱动程序:主板驱动、显卡驱动、摄像头驱动数据库:DB2,Oracle,Sql server应用软件:办公软件:WPS图形图像多媒体:ACDSee,PS,MediaPlayer嵌入式软件开发:智能手机,掌上电脑游戏开发:2D,3D游戏(CS整个引擎都是纯C。
魔兽不是4)C的重要性有史以来最重要的语言所有大学工科理科学生必修课程系统软件都是用它开发合格黑客必须掌握程序员必须熟练大企业、外企招聘必考为数据结构,C++,java,c#做准备2、怎样学习C语言每一讲分四次课前两节课为理论课,讲授理论知识后两节课为上机课,在机房完成当堂练习要去:当堂练习必须在两节上机课中完成机房随时有辅导老师辅导老师检查后方可离开途径:多思考,多上机目标:能看懂程序,能调试程序,自学能力要很强其实就是犯错误的过程,肯定会有错误,全都出完了,就学好了。
参考资料:谭浩强《C语言程序设计》清华绝对入门经典(就是自己能看懂)《C Primer Plus》人民邮电 60元语法《C和指针》人民邮电 65元在想变成高手看:《C专家编程》绝版《C陷阱与缺陷》人民邮电 30元3、学习的目标了解程序语言及发展历史熟练掌握C语言的语法规则掌握简单的算法理解面向过程的思想,这非常有助于将来对面向对象思想的学习能看懂程序会调试程序掌握将大问题转化为一系列小问题来求解的思想为将来学习C++,数据结构,C#,java打下良好的基础4、常见问题答疑1、学习java为什么建议先学C语言a)学习C就是学java,因为C语言至少80%的语法知识都被java继承过来了。
郝斌数据结构学习笔记1
郝斌c语言学习笔记这篇文本我写过后做很多次修改,虽然感觉还是无法做到最合理的解释,但也希望能对想真正理解c语言的人有所帮助,这里我只写了一部分,往后我会定时上传。
正在看郝斌的数据结构,看到了指针,觉得讲的很不错的,int *p;定义一个整形的指针变量int i=10;定义一个整形变量i=10;p=&i;将i取地址给p(也叫做p指向i)我们叫做p指向i,p中装载的是i的地址,而*p与i是属于一体的,也就是说此时无论i变为何值*p也就是为何值。
指针与一维数组列如:int a[5]={1,2,3,4,5};我们可以写成a[3]=*(a+3);那么为什么a[3]这个元素可以等价于*(a+3)呢?答案:因为a所指向的是这个数组的第一个地址,这个是需要记住的,也就是说内部库这么定义的,*a是一个指针变量,而指针a中也就是第一个元素的地址,那么(a+3)就说明了一维数组的第一个元素的地址向后推移了3位,也就是数组的第四位a[3]的地址,此时a[3]的地址也就是指针,所以*(a+3)对应的是a[3]的数值4,当然也可以有另一种写法*a+3,*a代表的是第一个元素的数值也就是a[0]=1;1+3=4;所以也可以代表a[3]的值。
以上是看了郝斌数据结构指针与一维数组的理解。
指针与内存以及指向对象的类型关系?答案:一般指针占用四个字节,那么指针与数组类型的关系?列如:double arry[3]={1.1,2.2,3.3}这是一个double类型的数组每个元素占有8个字节,我们在定义两个指针:Int *p; int *q;p=arry[0];q=arry[1];我们把数组的第一个与低二个元素给指针pq那么p,q内部装载的是什么,可知p,q为指针所以存储应该是元素的地址,因为double类型的数组是八个字节,但是指针只存储这个元素的第一个字节,因为一个字节也就是一个地址,而指针只存储一个元素的首地址所以只存储一个字节。
数据结构知识点-个人笔记
《数据结构与算法》复习第1部分:1. 概念:数据结构,存储结构,逻辑结构注:磁盘文件管理系统是树状结构。
1.1基本概念(1)数据:指所有能够输入到计算机中并被计算机程序处理的符号的总称(图像声音都可以通过编码归于数据的范围),范围大(2)数据项:数据的不可分割的最小单元(3)数据元素:是数据的基本单位,有若干数据项组成,通常作为一个整体考虑 (4)数据对象:性质相同的数据元素的集合,是数据的一个子集。
例子:其中,A 表为成绩表,B 表为学生信息表,这两张表就是数据;单独的一张表就称为数据对象,即A 和B 表都是一个数据对象;每张表中的每一行就称为数据元素;姓名,性别,身高,科目,分数就称为数据项 1.2数据结构 定义:相互之间存在一种或多种特定关系的数据元素的集合,这种关系包括三方面的内容,即数据逻辑结构,数据存储结构,数据的操作。
2. 数据元素是组成数据的基本单位3. 算法,算法分析,算法特性,时间复杂度3.1算法:描述求解问题方法操作步骤的集合。
(不是所有的程序都是算法,要满足五个特性)3.2时间复杂度3.2.1定义:在算法分析中,一般用算法中的语句的执行次数来度量算法的时间效率,时间效率也就是时间复杂度。
3.2.2计算方法:对于问题规模为n 的某个函数f(n),算法时间复杂度记为T(n),存在一个正常数c ,使cf(n)>T(n)恒成立,则T(n)=Of(n),称Of(n)为时间复杂度。
时间复杂度的大O 表示法:保留最高次数项,令最高次数项的系数为1。
例如O(8)->O(1),O(2n^3+2n^2)->O(n^3),O(n*log2 n)第2部分1. 线性表的概念,特点,存储结构1.1.1线性表的概念:线性表是最简单,最常见,最基本的一种线性结构(数据的逻辑结构的一种),元素之间为线性关系,即除了第一个和最后一个元素之外,所有的元素都有前驱和后继元素,同一个线性表中的数据类型相同。
郝斌老师数据结构大纲word版
一、连续存储[数组]
1.什么叫做数组
元素类型相同,大小相等
2.数组的优缺点(相对于链表)
优点:存取速度快
缺点:实现必须知道数组的长度
需要大块连续的内存块
插入和删除元素很慢
空间通常是有限制的
二、离散存储[链表]
1.定义
N 个结点离散分配
彼此通过指针相连
每个结点只有一个前驱结点,每个结点只有一个后续结点
front 代表的是队列的第一个元素 rear 代表的是队列的最后一个有效元素的下一个元素 ③队列空
front 和 rear 的值相等,但不一定是零 ④循环队列入队伪算法讲解(在尾部入队)
第一步:将值存入 rear 所指向的位置 第二步:rear = (rear + 1)%数组的长度 ⑤循环队列出队伪算法讲解(在头部出队)
首结点没有前驱结点,尾结点没有后续结点
专业术语:
首结点:第一个存放有效数据的结点
尾结点:最有一个存放有效数据的结点
头结点:头结点的数据类型和首结点的类型是一样的
首结点之前的结点
头结点并不存放有效数据
-4-
数据结构资料
加头结点的目的是为了方便对链表的操作 头指针:指向头结点的指针变量 尾指针:指向尾结点的指针变量 确定一个链表需要几个参数: (如果希望通过一个函数来对链表进行处理,我们至少需要接受链表的那些参 数) 一个参数,即头指针,因为我们通过头指针可以推算出链表的其它所有的信息 2.分类 单链表 双链表:每一个结点有两个指针域
return 0; }
scanf ("%d",&val); printf("%d 的阶乘是%ld", val, mult(val));
我写的郝斌 C语言笔记
变量按存储方式分:静态变量、自动变量、寄存器(cpu内存数据的硬件设备)变量
# include <stdio.h>
3)函数返回值的类型也称为函数的类型,如果与return 表达式;的类型发生冲突,以 函数返回值的类型为准。
例如: int f()
{
return 10.5;//因为函数的返回值类型是int,所以最终f函数返回的是10,而不是10.5。
}
109. return和break的区别
{
printf("%-5d",a[i][j]);//-表示左对齐,5表示每个元素占5个光标
}
printf("\n");
}
对二维数组排序
求每一行的最大值
判断矩阵是否对称
矩阵的相乘
103.是否存在多维数组
不存在,因为内存是线性一维的,n维数组可以当做 每个元素是n-1维数组的 一维数组。
函数是一个工具,它是为了解决大量类似问题而设计的,函数可以当做一个黑匣子。
#include <stdio.h>
int f(void) // 括号里的void表示该函数不能接受数据,int表示函数返回值是int类型的数据
{
return 10; // 向被调函数返回10
}
void g(void)
for(i=0;i<5;+.二维数组的使用
[郝斌]数据 结构c语言-前导知识
[郝斌]数据结构c语言-前导知识
数据结构是计算机科学中非常重要的一个概念。
它是指将数据组织成特定的形式,以方便访问和处理。
数据结构可以分成两类:线性结构和非线性结构。
线性结构包括数组、链表、栈、队列等,而非线性结构包括树、图等。
在学习数据结构前,我们需要掌握一些前导知识,主要包括以下几个方面:
1. C语言基础:C语言是数据结构的基础语言,我们需要熟悉C 语言的基本语法、运算符、流程控制语句、函数等知识点。
同时,我们还需要学会使用C语言编写基本的数据结构算法。
2. 算法基础:数据结构和算法是密不可分的,我们需要掌握一些基本的算法,如排序算法、查找算法等。
同时,我们还需要学会分析算法的时间复杂度和空间复杂度。
3. 数学基础:数据结构涉及到一些数学知识,如概率论、离散数学等。
这些知识可以帮助我们更好地理解数据结构的原理和应用。
4. 计算机组成原理:学习数据结构还需要了解计算机的基本组成原理,如内存、CPU等。
这可以帮助我们更好地理解数据结构的存储方式和访问方式。
5. 数据库基础:数据结构是数据库系统的基础,了解数据库的基本知识,如关系型数据库、非关系型数据库等,可以帮助我们更好地应用数据结构。
总之,掌握好数据结构需要系统学习和不断实践,只有在不断的编写和优化程序中,我们才能更好地掌握数据结构的运用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
页眉内容数据结构概述(教材选用严蔚敏、吴伟民,该书程序是伪算法具体的程序是高一凡,西电的,大牛,只有程序。
还有一本书,台湾的黄国瑜自己写的只有思路,程序是另外一个合作的清华的写的,可惜很多错的。
)学完数据结构之后会对面向过程的函数有一个更深的了解定义我们如何把现实中大量而复杂的问题以特定的数据类型(单个数据怎样存储?)和特定的存储结构(个体的关系)保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫算法。
(比如班里有15个人,其信息量也许一个数组就搞定了,但是假如10000个,怎么办?内存也许没有这么多连续的空间,所以我们改用链表,you see这就是与存储有关系。
又比如,人事管理系统的信息存储,因为存在着上下级的关系,所以数组和链表就无能为力了,这时候我们用树,再比如我们做的是交通图,站和站之间肯定要连通,这时候以上的存储方式又无能为力了,所以我们又有了图。
图就是每个结点都可以和其他结点产生联系。
所以当我们要解决问题时,首先要解决的是如何把这些问题转换成数据,先保存到我们的主存中,)数据结构 = 个体 + 个体的关系算法 = 对存储数据的操作算法解题的方法和步骤衡量算法的标准1、时间复杂度大概程序要执行的次数,而非执行的时间。
2、空间复杂度算法执行过程中大概所占用的最大内存3、难易程度(主要是应用方面看重)4、健壮性(不能别人给一个非法的输入就挂掉)数据结构的地位数据结构是软件中最核心的课程程序 = 数据的存储+数据的操作+可以被计算机执行的语言(已经提供)(学完数据结构,想用一种语言去实现它,必须有指针,数据结构java版,就胡扯,变味,因为我们要讲链表,就是通过指针链在一起的。
比如在java中A aa = new A();本质上,aa是个地址)预备知识指针指针的重要性:(内存是可以被CPU直接访问的,硬盘不行主要靠地址总线,数据总线,控制总线。
)指针是C语言的灵魂定义地址地址就是内存单元的编号从0开始的非负整数范围:0--FFFFFFFF[0-4G-1](地址线是32位,刚好控制2的32次)指针:指针就是地址地址就是指针指针变量是存放内存单元地址的变量指针的本质是一个操作受限的非负整数(不能加乘除,只能减)分类:1、基本类型的指针2、指针和数组的关系结构体(C++中用类也能实现)为什么会出现结构体为了表示一些复杂的数据,而普通的基本类型变量无法满足要求什么叫结构体结构体是用户根据实际需要自己定义的复合数据类型如何使用结构体两种方式:struct Student st = {1000, "zhangsan", 20}struct Student * pst = &st;1.st.sid2.pst->sidpst所指向的结构体变量中的sid这个成员注意事项:结构体变量不能加减乘除,但可以相互赋值普通结构体变量和结构体指针变量作为函数参数的传递(病毒就是靠访问正在运行的那些程序所占用的内存。
Java中规定局部变量必须初始化,因为这些变量一开始都是垃圾值,但是属性不是必须初始化的,因为已经默认初始化为0)动态内存分配和释放(动态分配的内存一定要手动释放,否则造成内存泄露。
)(java中A aa = new A();其实就是 A *p = (A *)malloc(sizeof(A)))模块一:线性结构【把所有的结点用一根直线穿起来】连续存储【数组】1、什么叫做数组元素类型相同,大小相等(数组传参,只要传进去首地址和长度就行)2、数组的优缺点:优点:存取速度快缺点:事先必须知道数组的长度插入删除元素很慢空间通常是有限制的需要大块连续的内存块插入删除元素的效率很低离散存储【链表】(我们搞底层的开发,类似于SUN公司的类)定义:n个节点离散分配彼此通过指针相连每个节点只有一个前驱节点,每个节点只有一个后续节点首节点没有前驱节点,尾节点没有后续节点。
专业术语:首节点:第一个有效节点尾节点:最后一个有效节点头节点:头结点的数据类型和首节点的类型一样没有存放有效数据,最最前面的,是在首节点之前的,主要是为了方便对链表的操作。
头指针:(指向头)指向头节点的指针变量尾指针:指向尾节点的指针(头结点有可能很大,占的内存可能大,假设我想造一个函数输出所有链表的值,那你如果不用头指针类型做形参,那由于不同链表的头节点不一样大小,这样就没办法找出形参)确定一个链表需要几个参数:(或者说如果期望一个函数对链表进行操作我们至少需要接收链表的那些信息???)只需要一个参数:头指针,因为通过它我们可以推出链表的所有信息。
(链表的程序最好一定要自己敲出来)分类:单链表双链表:每一个节点有两个指针域循环链表能通过任何一个节点找到其他所有的节点非循环链表(java中变成垃圾内存则会自动释放,但是C和C++则不会,所以要手动释放,否则会引起内存泄露。
delete等于free)算法:遍历查找清空销毁求长度排序删除节点插入节点算法:狭义的算法是与数据的存储方式密切相关广义的算法是与数据的存储方式无关泛型:(给你一种假象,只不过牛人从内部都弄好了)利用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的算法的真正学法:很多算法你根本解决不了!!!!!!因为很多都属于数学上的东西,所以我们把答案找出来,如果能看懂就行,但是大部分人又看不懂,分三步,按照流程,语句,试数。
这个过程肯定会不断地出错,所以不断出错,不断改错,这样反复敲很多次,才能有个提高。
实在看不懂就先背会。
链表的优缺点:优点:空间没有限制插入删除元素很快缺点:存取速度很慢。
线性结构的两种常见应用之一栈 (存储数据的结构) 定义一种可以实现“先进后出”的存储结构栈类似于箱子分类静态栈(类似于用数组实现)动态栈(类似于用链表实现)算法(往里放,从里取)出栈压栈(参看Java中线程的例子,成产消费的例子)应用函数调用中断表达式求值(用两个栈,一个存放数字,一个存放符号)内存分配缓冲处理迷宫线性结构的两种常见应用之二队列定义:一种可是实现“先进先出”的存储结构分类:链式队列:用链表实现静态队列:用数组实现静态对流通常都必须是循环队列,为了减少内存浪费。
循环队列的讲解:1、静态队列为什么必须是循环队列2、循环队列需要几个参数来确定及其含义需要2个参数来确定frontrear3、循环队列各个参数的含义2?建议初学者先记住,然后慢慢体会1)队列初始化front和rear的值都是零2)队列非空front代表队列的第一个元素rear代表了最后一个有效元素的下一个元素3)队列空front和rear的值相等,但是不一定是零4、循环队列入队伪算法讲解两步完成:1)将值存入r所代表的位置2)将r后移,正确写法是 rear = (rear+1)%数组长度错误写法:rear=rear+1;5、循环队列出队伪算法讲解front = (front+1) % 数组长度6、如何判断循环队列是否为空如果front与rear的值相等,则队列一定为空7、如何判断循环队列是否已满预备知识:front的值和rear的值没有规律,即可以大,小,等。
两种方式:1、多增加一个表标识的参数2、少用一个队列中的元素(才一个,不影响的)通常使用第二种方法如果r和f的值紧挨着,则队列已满用C语言伪算法表示就是:if( (r+1)%数组长度 == f )已满else不满队列算法:入队出队队列的具体应用:所有和事件有关的操作都有队列的影子。
(例如操作系统认为先进来的先处理)专题:递归【这对你的编码能力是个质的飞跃,如果你想成为一个很厉害的程序员,数据结构是必须要掌握的,因为计算机专业的本科生也达不到这水平!计算机特别适合用递归的思想来解决问题,但是我们人类用递归的思想来考虑问题就会感到十分困扰,这也是很多学过递归的人一直都搞不明白的地方!那是不是递归可以随便写,当然不是,有些同学一用递归程序就死翘翘了。
递归的思想是软件思想的基本思想之一,在树和图论上面,几乎全是用递归来实现的,最简单,像求阶乘这种没有明确执行次数的问题,都是用递归来解决】定义:一个函数自己直接或间接调用自己(一个函数调用另外一个函数和他调用自己是一模一样的,都是那三步,只不过在人看来有点诡异。
)递归满足的三个条件:1、递归必须得有一个明确的终止条件2、该函数处理的数据规模必须在递减3、这个转化必须是可解的。
循环和递归:理论上循环能解决的,肯定可以转化为递归,但是这个过程是复杂的数学转化过程,递归能解决不一定能转化为循环,我们初学者只要把经典的递归算法看懂就行,至于有没有能力运用看个人。
递归:易于理解速度慢存储空间大循环不易于理解速度快存储空间小举例:1.求阶乘2.1+2+3+4+。
+100的和3.汉诺塔【汉诺塔】这不是线性递归,这是非线性递归!n=1 1n=2 3n=3 7..................n=64 2的64次方减1【这是个天文数字,就算世界上最快的计算机也解决不了,汉诺塔的负责度是2的n次方减1】问题很复杂,但真正解决问题的编码只有三句。
4.走迷宫(CS的实现)递归的运用:树和森林就是以递归的方式定义的树和图的很多算法都是以递归来实现的很多数学公式就是以递归的方式定义的斐波拉契序列1 2 3 5 8 13 21 34。
为何数据结构难学:因为计算机内存是线性一维的,而我们要处理的数据都是比较复杂的,那么怎么把这么多复杂的数据保存在计算机中来保存本身就是一个难题,而计算机在保存线性结构的时候比较好理解,尤其是数组和链表只不过是连续和离散的问题,线性结构是我们学习的重点,因为线性算法比较成熟,无论C++还是Java中都有相关的工具例如Arraylist.Linkedlist,但是在Java中没有树和图,因为非线性结构太复杂了,他的操作远远大于线性结构的操作。
即使SUN公司也没造出来。
小复习一下:^_^逻辑结构:(就是在你大脑里面能产生的,不考虑在计算机中存储)线性(用一根直线穿)在计算机中存储用:数组链表栈和队列是一种特殊的线性结构,是具体应用。
(操作受限的线性结构,不受限的应该是在任何地方可以增删改查可以用数组和链表实现。
只要把链表学会,栈和队列都能搞定,数组稍微复杂一些。
)非线性:树图物理结构:数组链表模块二:非线性结构(现在人类还没有造出一个容器,能把树和图都装进去的,因为他们确实是太复杂了)(都要靠链表去实现)树树定义专业定义:1、有且只有一个称为根的节点2、有若干个互不相交的子树,这些子树本身也是一棵树通俗定义:1、树是由节点和边组成2、每个节点只有一个父节点但可以有多个子节点3、但有一个节点例外,该节点没有根节点,此节点称为根节点专业术语节点父节点子节点子孙堂兄弟深度:从根节点到最底层节点的层数称之为深度根节点是第一层叶子节点;(叶子就不能劈叉了)没有子节点的节点非终端节点:实际就是非叶子节点。