传智播客C和C++与数据结构基础讲义
- 格式:docx
- 大小:11.83 MB
- 文档页数:72
传智播客C提高讲义传智扫地僧1程序内存模型1.1就业班引言1.1.1问题引出企业需要能干活的人➢C学到什么程度可以找工作?➢对于C/C++初级开发者,怎么达到企业的用人标准➢就业问题问:老师,有没有一个框框?有没有一个标准啊?我们学什么哪?C工程开发需要什么(培养什么能力)成熟的、商业化的信息系统在分区、分层信息系统的技术模型在分层找出对我们初学者最近的那一层(哪些能力是你入行前,必须要掌握的)C项目开发的套路(一套接口)➢//socket_client pool api 设计与实现➢int sckClient_poolinit(void **handle);➢int sckClient_getConnet(void *handle, void **hConnect);➢int sckClient_sendData(void *hConnect, unsigned char *data, int dataLen);➢int sckClient_getData(void *hConnect, unsigned char **data, int *dataLen);➢int sckClient_getData_Free(void *hConnect, unsigned char *data);➢int sckClient_putConnet(void *handle, void **hConnect);➢int sckClient_pooldestory(void **handle);总结:寻找到学习的标准培养两种能力➢接口的封装和设计(功能抽象和封装)➢接口api的使用能力➢接口api的查找能力(快速上手)➢接口api的实现能力➢建立正确程序运行内存布局图(印象图)➢内存四区模型图➢函数调用模型图1.1.2总体课程安排课程大纲➢C提高➢C++➢数据结构➢总体时间1个月实用专题➢总:轻松入门实战应用➢形式1:专题的形式录制话题集中便于初学者学习➢形式2:知识点分段录制、细致讲解,从根本上提高初学者水平➢项目开发中的重要点做剖析➢指针铁律1 2 3 4 5 6 7 8 9 10===》企业用人标准1.1.3学员要求➢资料,时间空间管理➢工作经验,记录和积累➢临界点➢事物认知规律➢挑战*p,**p, ***p➢提高课堂效率➢课堂例子,当堂运行。
数据结构C语言版讲义数据结构是计算机科学的一门基础课程,主要讲述了如何组织和存储数据的方法和技术。
它不仅仅是一门理论学科,还涉及到具体的算法和实现技巧。
C语言作为一种高效、可移植的编程语言,被广泛用于数据结构的实现和应用。
本篇讲义将介绍数据结构的基本概念和常见的几种数据结构的C语言实现。
数据结构的基本概念包括数据元素、数据项、数据对象和数据结构等。
其中,数据元素是数据的基本单位,可以是一个数字、一个字母或一个记录。
数据项是数据元素的组成部分,可以是一个字符、一个字符串或一个整数。
数据对象是指具有一定意义的数据元素的集合,例如学生、学生信息等。
数据结构是指数据元素之间的关系。
常见的数据结构包括数组、链表、栈、队列和树等。
数组是一种线性的数据结构,它由相同类型的元素组成,这些元素在内存中连续存放。
C语言中的数组使用一维或多维数组来表示。
数组的访问使用下标进行,下标从0开始。
例如,定义一个整型数组arr,可以通过arr[0]、arr[1]等来访问数组中的元素。
链表是一种非线性的数据结构,它由一个个节点组成,每个节点存储数据元素和指向下一个节点的指针。
链表可以分为单向链表和双向链表。
C语言中可以通过结构体和指针来实现链表。
例如,定义一个单向链表节点的结构体,包含数据元素和指向下一个节点的指针,再定义一个指向链表头节点的指针,通过指针可以实现链表的遍历和操作。
栈是一种先进后出(LIFO)的数据结构,它可以用数组或链表来实现。
栈的主要操作包括入栈(push)和出栈(pop)。
入栈是将元素压入栈顶,出栈是将栈顶的元素弹出。
C语言中可以用数组和一个指向栈顶的指针来实现栈。
队列是一种先进先出(FIFO)的数据结构,它也可以用数组或链表来实现。
队列的主要操作包括入队(enqueue)和出队(dequeue)。
入队是将元素放入队尾,出队是将队首元素移除。
C语言中可以用数组和两个指针来实现队列。
树是一种非线性的数据结构,它由节点和边组成。
传智播客C 提高讲义传智扫地僧1 程序内存模型1.1 就业班引言1.1.1 问题引出企业需要能干活的人➢ C 学到什么程度可以找工作?➢对于C/C++初级开发者,怎么达到企业的用人标准➢就业问题问:老师,有没有一个框框?有没有一个标准啊?我们学什么哪?C 工程开发需要什么(培养什么能力)成熟的、商业化的信息系统在分区、分层信息系统的技术模型在分层找出对我们初学者最近的那一层(哪些能力是你入行前,必须要掌握的)C 项目开发的套路(一套接口)➢//socket_client pool api 设计与实现➢int sckClient_poolinit(void **handle);➢int sckClient_getConnet(void *handle, void **hConnect);➢int sckClient_sendData(void *hConnect, unsigned char *data, int dataLen);➢int sckClient_getData(void *hConnect, unsigned char **data, int *dataLen);➢int sckClient_getData_Free(void *hConnect, unsigned char *data);➢int sckClient_putConnet(void *handle, void **hConnect);➢int sckClient_pooldestory(void **handle);总结:寻找到学习的标准培养两种能力➢接口的封装和设计(功能抽象和封装)➢接口api 的使用能力➢接口api 的查找能力(快速上手)➢接口api 的实现能力➢建立正确程序运行内存布局图(印象图)➢内存四区模型图➢函数调用模型图1.1.2 总体课程安排课程大纲➢ C 提高➢C++➢数据结构➢总体时间1 个月实用专题➢总:轻松入门实战应用➢形式1:专题的形式录制话题集中便于初学者学习➢形式2:知识点分段录制、细致讲解,从根本上提高初学者水平➢项目开发中的重要点做剖析➢指针铁律1 2 3 4 5 6 7 8 9 10===》企业用人标准1.1.3 学员要求➢资料,时间空间管理➢工作经验,记录和积累➢临界点➢事物认知规律➢挑战*p,**p, ***p➢提高课堂效率➢课堂例子,当堂运行。
传智播客C提高讲义传智扫地僧1程序内存模型企业需要能干活的人➢C学到什么程度可以找工作?➢对于C/C++初级开发者,怎么到达企业的用人标准➢就业问题问:老师,有没有一个框框?有没有一个标准啊?我们学什么哪?C工程开发需要什么〔培养什么能力〕成熟的、商业化的信息系统在分区、分层信息系统的技术模型在分层找出对我们初学者最近的那一层〔哪些能力是你入行前,必须要掌握的〕C项目开发的套路〔一套接口〕➢//socket_client pool api 设计与实现➢int sckClient_poolinit(void **handle);➢int sckClient_getConnet(void *handle, void **hConnect);➢int sckClient_sendData(void *hConnect, unsigned char *data, int dataLen);➢int sckClient_getData(void *hConnect, unsigned char **data, int *dataLen);➢int sckClient_getData_Free(void *hConnect, unsigned char *data);➢int sckClient_putConnet(void *handle, void **hConnect);➢int sckClient_pooldestory(void **handle);总结:寻找到学习的标准培养两种能力➢接口的封装和设计〔功能抽象和封装〕➢接口api的使用能力➢接口api的查找能力〔快速上手〕➢接口api的实现能力➢建立正确程序运行内存布局图〔印象图〕➢内存四区模型图➢函数调用模型图课程大纲➢C提高➢C++➢数据结构➢总体时间1个月实用专题➢总:轻松入门实战应用➢形式1:专题的形式录制话题集中便于初学者学习➢形式2:知识点分段录制、细致讲解,从根本上提高初学者水平➢项目开发中的重要点做剖析➢指针铁律1 2 3 4 5 6 7 8 9 10===》企业用人标准➢资料,时间空间管理➢工作经验,记录和积累➢临界点➢事物认知规律➢挑战*p,**p, ***p➢提高课堂效率➢课堂例子,当堂运行。
传智播客C提高讲义全传智播客C提高讲义传智扫地僧1程序内存模型1.1就业班引言1.1.1问题引出企业需要能干活的人C学到什么程度可以找工作?对于C/C++初级开发者,怎么达到企业的用人标准?就业问题问:老师,有没有一个框框?有没有一个标准啊?我们学什么哪?C工程开发需要什么(培养什么能力)成熟的、商业化的信息系统在分区、分层信息系统的技术模型在分层找出对我们初学者最近的那一层(哪些能力是你入行前,必须要掌握的)C项目开发的套路(一套接口)//socket_client pool api 设计与实现int sckClient_poolinit(void **handle);int sckClient_getConnet(void *handle, void **hConnect);int sckClient_sendData(void *hConnect, unsigned char *data, int dataLen);int sckClient_getData(void *hConnect, unsigned char **data, int *dataLen);int sckClient_getData_Free(void *hConnect, unsigned char*data);int sckClient_putConnet(void *handle, void **hConnect);int sckClient_pooldestory(void **handle);总结:寻找到学习的标准培养两种能力接口的封装和设计(功能抽象和封装)接口api的使用能力接口api的查找能力(快速上手)接口api的实现能力建立正确程序运行内存布局图(印象图)内存四区模型图函数调用模型图1.1.2总体课程安排课程大纲C提高C++。
传智播客C提高讲义传智扫地僧1程序内存模型1.1就业班引言1.1.1问题引出企业需要能干活的人➢C学到什么程度可以找工作?➢对于C/C++初级开发者,怎么达到企业的用人标准➢就业问题问:老师,有没有一个框框?有没有一个标准啊?我们学什么哪?C工程开发需要什么(培养什么能力)成熟的、商业化的信息系统在分区、分层信息系统的技术模型在分层找出对我们初学者最近的那一层(哪些能力是你入行前,必须要掌握的)C项目开发的套路(一套接口)➢//socket_client pool api 设计与实现➢int sckClient_poolinit(void **handle);➢int sckClient_getConnet(void *handle, void **hConnect);➢int sckClient_sendData(void *hConnect, unsigned char *data, int dataLen);➢int sckClient_getData(void *hConnect, unsigned char **data, int *dataLen);➢int sckClient_getData_Free(void *hConnect, unsigned char *data);➢int sckClient_putConnet(void *handle, void **hConnect);➢int sckClient_pooldestory(void **handle);总结:寻找到学习的标准培养两种能力➢接口的封装和设计(功能抽象和封装)➢接口api的使用能力➢接口api的查找能力(快速上手)➢接口api的实现能力➢建立正确程序运行内存布局图(印象图)➢内存四区模型图➢函数调用模型图1.1.2总体课程安排课程大纲➢C提高➢C++➢数据结构➢总体时间1个月实用专题➢总:轻松入门实战应用➢形式1:专题的形式录制话题集中便于初学者学习➢形式2:知识点分段录制、细致讲解,从根本上提高初学者水平➢项目开发中的重要点做剖析➢指针铁律1 2 3 4 5 6 7 8 9 10===》企业用人标准1.1.3学员要求➢资料,时间空间管理➢工作经验,记录和积累➢临界点➢事物认知规律➢挑战*p,**p, ***p➢提高课堂效率➢课堂例子,当堂运行。
传智播客C++课程讲义传智扫地僧1、C++对C的扩展1简单的C++程序求圆的周长和面积数据描述:半径,周长,面积均用实型数表示数据处理:输入半径r;计算周长= 2*π*r;计算面积= π* r2 ;输出半径,周长,面积;在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。
因此,1)当使用<>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;2)当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
二:由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:1、直接指定标识符。
例如std::ostream而不是ostream。
完整语句如下: std::cout << std::hex << << std::endl;2、使用using关键字。
using std::cout; using std::endl; using std::cin; 以上程序可以写成 cout << std::hex << << endl;3、最方便的就是使用using namespace std; 例如: using namespace std;这样命名空间std 内定义的所有标识符都有效(曝光)。
就好像它们被声明为全局变量一样。
那么以上语句可以如下写: cout <<hex << << endl;因为标准库非常的庞大,所以程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。
所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。
但这又会带来了一个新问题。
无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。
传智播客C提高讲义传智扫地僧1程序内存模型1.1就业班引言1.1.1问题引出企业需要能干活的人C学到什么程度可以找工作?对于C/C++初级开发者,怎么达到企业的用人标准 就业问题问:老师,有没有一个框框?有没有一个标准啊?我们学什么哪?C工程开发需要什么(培养什么能力)成熟的、商业化的信息系统在分区、分层信息系统的技术模型在分层找出对我们初学者最近的那一层(哪些能力是你入行前,必须要掌握的)C项目开发的套路(一套接口)//socket_client pool api 设计与实现int sckClient_poolinit(void **handle);int sckClient_getConnet(void *handle, void **hConnect);int sckClient_sendData(void *hConnect, unsigned char *data, int dataLen);int sckClient_getData(void *hConnect, unsigned char **data, int *dataLen);int sckClient_getData_Free(void *hConnect, unsigned char *data);int sckClient_putConnet(void *handle, void **hConnect);int sckClient_pooldestory(void **handle);总结:寻找到学习的标准培养两种能力接口的封装和设计(功能抽象和封装)接口api的使用能力接口api的查找能力(快速上手)接口api的实现能力建立正确程序运行内存布局图(印象图)内存四区模型图函数调用模型图1.1.2总体课程安排课程大纲C提高C++数据结构总体时间1个月实用专题总:轻松入门实战应用形式1:专题的形式录制话题集中便于初学者学习形式2:知识点分段录制、细致讲解,从根本上提高初学者水平项目开发中的重要点做剖析指针铁律1 2 3 4 5 6 7 8 9 10===》企业用人标准1.1.3学员要求资料,时间空间管理工作经验,记录和积累临界点事物认知规律挑战 *p,**p, ***p提高课堂效率课堂例子,当堂运行。
传智播客C++课程讲义传智扫地僧1、C++对C的扩展1简单的C++程序1.1求圆的周长和面积数据描述:半径,周长,面积均用实型数表示数据处理:输入半径r;计算周长= 2*π*r;计算面积= π* r2 ;输出半径,周长,面积;方法2:用面向对象方法编程,求圆的周长和面积#include<iostream.h>using name std;class Circle{ double radius ; //成员变量public : //类的访问控制void Set_Radius( double r ) { radius = r ; } //成员函数double Get_Radius() { return radius ; } //通过成员函数设置成员变量double Get_Girth() { return 2 * 3.14f * radius ; } //通过成员函数获取成员变量double Get_Area() { return 3.14f * radius * radius ; }} ;void main(){Circle A, B ; //用类定义对象A.Set_Radius( 6.23 ) ; //类的调用cout << "A.Radius = " << A.Get_Radius() << endl ;总结:建立类、对象、成员变量、成员函数,输入输入流基本概念。
1.2初学者易犯错误模型总结:从内存四区的角度,解释为什么会出现乱码理解为什么需要成员函数2程序设计方法的发展历程面向过程的结构化程序设计方法●设计思路–自顶向下、逐步求精。
采用模块分解与功能抽象,自顶向下、分而治之。
●程序结构:–按功能划分为若干个基本模块,形成一个树状结构。
–各模块间的关系尽可能简单,功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成。
传智播客C和C++与数据结构基础讲义传智扫地僧1、数据结构概念1.1数据结构相关概念1.1.1疑惑1、我学完了C语言,可是现在感觉还是写不出代码。
2、为什么会有各种各样的程序存在?3、程序的本质是什么?程序是为了具体问题而存在的程序需要围绕问题的解决进行设计同一个问题可以有多种解决方案如何追求程序的“性价比”?是否有可量化的方法判别程序的好坏?1.1.2 数据结构起源计算机从解决数值计算问题到解决生活中的问题现实生活中的问题涉及不同个体间的复杂联系需要在计算机程序中描述生活中个体间的联系数据结构主要研究非数值计算程序问题中的操作对象以及它们之间的关系不是研究复杂的算法1.1.3数据结构中的基本概念数据-程序的操作对象,用于描述客观事物(in ta,i ntb,) 数据的特点:可以输入到计算机可以被计算机程序处理数据是一个抽象的概念,将其进行分类后得到程序设计语言中的类型。
如:int ,float ,char 等等数据元素:组成数据的基本单位数据项:一个数据元素由若干数据项组成数据对象-性质相同的数据元素的集合(比如:数组,链表)//友情提示,来自结构体课堂代码//声明一个结构体类型struct_MyTeacher〃一种数据类型{char n ame[32];char tile[32];int age;char addr[128];};in tmai n21(){数据元素之间不是独立的,存在特定的关系,这些关系即结构数据结构指数据对象中数据元素之间的关系女口:数组中各个元素之间存在固定的线性关系编写一个“好”的程序之前,必须分析待处理问题中各个对象的特性,以及对象之间的关系。
基本概念总结:1.1.4数据的逻辑结构指数据元素之间的逻辑关系。
即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
逻辑结构可细分为4类:1.1.5 数据的物理结构1.1.6 数据的运算1.2、算法1.2.1 算法概念算法是特定问题求解步骤的描述在计算机中表现为指令的有限序列算法是独立存在的一种解决问题的方法和思想。
传智播客C提高讲义传智扫地僧1程序内存模型1.1就业班引言1.1.1问题引出企业需要能干活的人➢C学到什么程度可以找工作?➢对于C/C++初级开发者,怎么达到企业的用人标准➢就业问题问:老师,有没有一个框框?有没有一个标准啊?我们学什么哪?C工程开发需要什么(培养什么能力)成熟的、商业化的信息系统在分区、分层信息系统的技术模型在分层找出对我们初学者最近的那一层(哪些能力是你入行前,必须要掌握的)C项目开发的套路(一套接口)➢//socket_client pool api 设计与实现➢int sckClient_poolinit(void **handle);➢int sckClient_getConnet(void *handle, void **hConnect);➢int sckClient_sendData(void *hConnect, unsigned char *data, int dataLen);➢int sckClient_getData(void *hConnect, unsigned char **data, int *dataLen);➢int sckClient_getData_Free(void *hConnect, unsigned char *data);➢int sckClient_putConnet(void *handle, void **hConnect);➢int sckClient_pooldestory(void **handle);总结:寻找到学习的标准培养两种能力➢接口的封装和设计(功能抽象和封装)➢接口api的使用能力➢接口api的查找能力(快速上手)➢接口api的实现能力➢建立正确程序运行内存布局图(印象图)➢内存四区模型图➢函数调用模型图1.1.2总体课程安排课程大纲➢C提高➢C++➢数据结构➢总体时间1个月实用专题➢总:轻松入门实战应用➢形式1:专题的形式录制话题集中便于初学者学习➢形式2:知识点分段录制、细致讲解,从根本上提高初学者水平➢项目开发中的重要点做剖析➢指针铁律1 2 3 4 5 6 7 8 9 10===》企业用人标准1.1.3学员要求➢资料,时间空间管理➢工作经验,记录和积累➢临界点➢事物认知规律➢挑战*p,**p, ***p➢提高课堂效率➢课堂例子,当堂运行。
传智播客C和C++与数据结构基础讲义传智扫地僧1、数据结构概念1.1数据结构相关概念1.1.1疑惑1、我学完了C语言,可是现在感觉还是写不出代码。
2、为什么会有各种各样的程序存在?3、程序的本质是什么?程序是为了具体问题而存在的程序需要围绕问题的解决进行设计同一个问题可以有多种解决方案如何追求程序的“性价比”?是否有可量化的方法判别程序的好坏?1.1.2数据结构起源计算机从解决数值计算问题到解决生活中的问题现实生活中的问题涉及不同个体间的复杂联系需要在计算机程序中描述生活中个体间的联系数据结构主要研究非数值计算程序问题中的操作对象以及它们之间的关系不是研究复杂的算法1.1.3数据结构中的基本概念数据–程序的操作对象,用于描述客观事物(int a, int b,)数据的特点:可以输入到计算机可以被计算机程序处理数据是一个抽象的概念,将其进行分类后得到程序设计语言中的类型。
如:int,float,char 等等数据元素:组成数据的基本单位数据项:一个数据元素由若干数据项组成数据对象–性质相同的数据元素的集合(比如:数组,链表)//友情提示,来自结构体课堂代码//声明一个结构体类型struct _MyTeacher //一种数据类型{char name[32];char tile[32];int age;char addr[128];};int main21(){struct _MyTeacher t1; //数据元素struct _MyTeacher tArray[30]; //数据对象memset(&t1, 0, sizeof(t1));strcpy(, "name"); //数据项strcpy(t1.addr, "addr"); //数据项strcpy(t1.tile, "addr"); //数据项t1.age = 1;}数据元素之间不是独立的,存在特定的关系,这些关系即结构数据结构指数据对象中数据元素之间的关系如:数组中各个元素之间存在固定的线性关系编写一个“好”的程序之前,必须分析待处理问题中各个对象的特性,以及对象之间的关系。
基本概念总结:1.1.4数据的逻辑结构指数据元素之间的逻辑关系。
即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
逻辑结构可细分为4类:1.1.5数据的物理结构1.1.6数据的运算1.2、算法1.2.1算法概念算法是特定问题求解步骤的描述在计算机中表现为指令的有限序列算法是独立存在的一种解决问题的方法和思想。
对于算法而言,语言并不重要,重要的是思想。
1.2.2算法和数据结构区别数据结构只是静态的描述了数据元素之间的关系高效的程序需要在数据结构的基础上设计和选择算法=== 程序=数据结构+算法总结:算法是为了解决实际问题而设计的数据结构是算法需要处理的问题载体数据结构与算法相辅相成1.2.3算法特性输入算法具有0个或多个输入输出算法至少有1个或多个输出有穷性算法在有限的步骤之后会自动结束而不会无限循环确定性算法中的每一步都有确定的含义,不会出现二义性可行性算法的每一步都是可行的1.2.4算法效率的度量注意1:判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略。
注意2:在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。
2、大O表示法算法效率严重依赖于操作(Operation)数量在判断时首先关注操作数量的最高次项操作数量的估算可以作为时间复杂度的估算O(5) = O(1)O(2n + 1) = O(2n) = O(n)O(n2+ n + 1) = O(n2)O(3n3+1) = O(3n3) = O(n3)常见时间复杂度关系算法的空间复杂度通过计算算法的存储空间实现S(n) = O(f(n))其中,n为问题规模,f(n))为在问题规模为n时所占用存储空间的函数大O表示法同样适用于算法的空间复杂度当算法执行时所需要的空间是常数时,空间复杂度为O(1)空间与时间的策略多数情况下,算法执行时所用的时间更令人关注如果有必要,可以通过增加空间复杂度来降低时间复杂度同理,也可以通过增加时间复杂度来降低空间复杂度练习1:分析sum1 sum2 sum3函数的空间复杂度O(4n+12) O(8)=O(1) O(4)=O(1)总结:实现算法时,需要分析具体问题,对执行时间和空间的要求。
练习2:时间换空间/*问题:在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。
设计一个算法,找出出现次数最多的数字。
*/方法1:排序,然后找出出现次数最多的数字方法2:void search(int a[], int len){int sp[1000] = {0};int i = 0;int max = 0;for(i=0; i<len; i++){int index = a[i] - 1;sp[index]++;}for(i=0; i<1000; i++){if( max < sp[i] ){max = sp[i];}}for(i=0; i<1000; i++){if( max == sp[i] ){printf("%d\n", i+1);}}}int main(){int array[] = {1, 1, 3, 4, 5, 6, 6, 6, 2, 3};search(array, sizeof(array)/sizeof(*array));return 0;}把每个数字出现的次数的中间结果,缓存下来;在缓存的结果中求最大值。
2、线性表2.1线性表基本概念2.1.1线性表定义线性表(List)是零个或多个数据元素的集合线性表中的数据元素之间是有顺序的线性表中的数据元素个数是有限的线性表中的数据元素的类型必须相同2.1.2数学定义线性表是具有相同类型的n(≥0)个数据元素的有限序列(a1, a2, …, an)ai是表项,n 是表长度。
2.1.3性质a0为线性表的第一个元素,只有一个后继an为线性表的最后一个元素,只有一个前驱除a0和an外的其它元素ai,既有前驱,又有后继线性表能够逐项访问和顺序存取2.1.4练习下面的关系中可以用线性表描述的是A.班级中同学的友谊关系N:NB.公司中的上下级关系1:NC.冬天图书馆排队占座关系D.花名册上名字之间的关系1::12.2.5线性表的操作创建线性表销毁线性表清空线性表将元素插入线性表将元素从线性表中删除获取线性表中某个位置的元素获取线性表的长度线性表在程序中表现为一种特殊的数据类型线性表的操作在程序中的表现为一组函数2.2线性表的顺序存储结构2.2.1基本概念2.2.2设计与实现链表顺序存储插入算法和删除算法2.2.3优点和缺点优点:无需为线性表中的逻辑关系增加额外的空间可以快速的获取表中合法位置的元素缺点:插入和删除操作需要移动大量元素当线性表长度变化较大时难以确定存储空间的容量2.3线性表的链式存储2.3.1基本概念链式存储定义为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。
表头结点链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息数据结点链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息尾结点链表中的最后一个数据结点,其下一元素指针为空,表示无后继。
2.3.2链表技术领域推演2.3.2设计与实现链表链式存储_api实现分析在C语言中可以用结构体来定义链表中的指针域链表中的表头结点也可以用结构体实现带头结点、位置从0的单链表返回链表中第3个位置处,元素的值LinkListNode* LinkList_Get(LinkList* list, int pos) {int i = 0;TLinkList *tList = (TLinkList *)list;LinkListNode *current = NULL;LinkListNode *ret = NULL;if (list==NULL ||pos<0 || pos>=tList->length){return NULL;}current = (LinkListNode *)tList;for (i=0; i<pos; i++){current = current->next;}ret = current->next;return ret ;}返回第三个位置的移动pos次以后,当前指针指向哪里?答案:指向位置2,所以需要返回ret = current->next;备注:循环遍历时,遍历第1次,指向位置0遍历第2次,指向位置1遍历第3次,指向位置2遍历第n次,指向位置n-1;所以如果想返回位置n的元素的值,需要怎么做ret = current->next;此问题是:指向头结点的指针移动n次和第n个元素之间的关系?删除元素重要技术场景图链表链式存储_插入链表链式存储_删除2.3.3优点和缺点优点:无需一次性定制链表的容量插入和删除操作无需移动数据元素缺点:数据元素必须保存后继元素的位置信息获取指定数据的元素操作需要顺序访问之前的元素2.4循环链表2.4.1基本概念循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素循环链表拥有单链表的所有操作创建链表销毁链表获取链表长度清空链表获取第pos个元素操作插入元素到位置pos删除位置pos处的元素新增功能:游标的定义在循环链表中可以定义一个“当前”指针,这个指针通常称为游标,可以通过这个游标来遍历链表中的所有元素。
循环链表新操作将游标重置指向链表中的第一个数据元素CircleListNode* CircleList_Reset(CircleList* list);获取当前游标指向的数据元素CircleListNode* CircleList_Current(CircleList* list);将游标移动指向到链表中的下一个数据元素CircleListNode* CircleList_Next(CircleList* list);直接指定删除链表中的某个数据元素CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);// 根据元素的值删除元素pk根据元素的位置删除元素2.4.2循环链表的应用2.4.2.1 证明循环链表打印两次。
2.4.2.2 约瑟夫问题求解约瑟夫问题-循环链表典型应用n 个人围成一个圆圈,首先第1 个人从1 开始一个人一个人顺时针报数,报到第m 个人,令其出列。