数据结构快速回顾——开篇

六月到了。开始找工作的节奏,IT方面知识储备严重欠缺,定计划,更新博客,记录自己的准备历程。

1、数据结构  15天

2、常用算法(排序、动态规划、贪心等)  30天

3、数据挖掘算法   15天

4、移动端、web端开发入门  15天

5、操作系统  10天

共计85天,那时将近9月,还能赶上找工作的大潮。

何为数据结构?数据结构用处?
一般来说,使用计算机解决一个问题的时候需要经历以下步骤:分析问题、抽象出数学模型、设计解数学模型的算法、写程序、测试、得到最终结果。为了解决非数值型数学模型,需要使用诸如表、树、图之类的数据结构,数据结构可以帮助我们更好的表达和操作非数值计算的程序中的对象。
定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

根据数据元素之间关系的特征分为以下四种基本结构:集合、线性结构(链表)、树形结构、图状结构。

根据数据元素在计算机中的存储方式分为以下两种结构:顺序存储结构和链式存储结构。

本篇主要介绍第一种数据结构——线性表
线性表是n个数据元素组成的有限序列。数据元素的内容是可变的。

线性表的顺序表示及实现:
顺序表示是指使用一组地址连续的存储单元依次存储线性表的数据元素。


  1 //定义线性表顺序存储结构
2 #define OVERFLOW -2
3 #define OK 1
4 #define ERROR 0
5 #define LIST_INIT_SIZE 100
6 #define LISTINCREMENT 10 //空间不足时 增加分配的空间大小
7
8 typedef int ElemType;
9 typedef int Status;
10
11 typedef struct
12 {
13 ElemType *elem;//存储数据的首地址
14 int length; //当前长度
15 int listsize;//线性表容量
16 }SqList;
17
18 //初始化顺序表
19 Status InitList_Sq(SqList &L)
20 {
21 L.elem = (ElemType*) malloc (LIST_INIT_SIZE * sizeof(ElemType));
22 if(!L.elem)
23 exit(OVERFLOW);
24 L.length = 0;
25 L.listsize = LIST_INIT_SIZE;
26 return OK;
27 }
28
29 //创建顺序表
30 void CreateList(SqList &L, int len)
31 {
32 if(len > LIST_INIT_SIZE) //顺序表大小大于初始化大小,重新分配空间
33 {
34 L.elem = (ElemType*) realloc (L.elem, len*sizeof(ElemType));
35 L.listsize = len;
36 }
37 printf("请输入顺序表元素: \n");
38 for(int i = 0; i < len; i++)
39 scanf("%d", &L.elem[i]);
40 L.length = len;
41 printf("建立的顺序表为:\n");
42 for(int i = 0; i < len; i++)
43 printf("%d ", L.elem[i]);
44 printf("\n顺序表一共 %d 个元素。\n",L.length);
45 }
46
47 //顺序表L的第i个位置之前插入新的元素e
48 Status ListInsert_Sq(SqList &L, int i, ElemType e)
49 {
50 if(i > L.length+1 || i<1)
51 return ERROR;
52 if(i > L.listsize)
53 {
54 newBase = (ElemType*)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType);
55 if(!newBase)
56 exit(OVERFLOW);
57 L.elem = newBase;
58 L.listsize += LISTINCREMENT;
59 }
60 ElemType *q,*p;
61 q = &(L.elem[i-1]);
62 for(p = &(L.elem[L.length-1]); p > q; --p)
63 *(p+1) = *p;
64 *q = e;
65 ++L.length;
66 return OK;
67 }
68
69 //删除顺序表L的第i个位置
70 Status ListInsert_Sq(SqList &L, int i, ElemType& e)
71 {
72 if(i > L.length || i<1)
73 return ERROR;
74
75 ElemType *q,*p;
76 q = &(L.elem[i-1]);
77 e = *q;
78 p = &(L.elem[L.length-1]);
79 for(; q < p ; ++p)
80 *q = *(q+1);
81
82 --L.length;
83 return OK;
84 }
85 //返回指定位置的元素
86 ElemType GetElem(SqList &L, int i)
87 {
88 ElemType *e;
89 if(!L.elem || i > L.length || i < 1)
90 exit (ERROR);
91 e = L.elem+i-1;
92 return *e;
93 }
94
95
96 //定位指定元素,如果有,返回第一个匹配的元素的位置
97 int LocateElem(SqList &L, ElemType e)
98 {
99 int i;
100 if(!L.elem)
101 exit (ERROR);
102 for(i = 0; i < L.length; i++)
103 if(e == L.elem[i])
104 return i+1;
105 return 0;
106 }

线性表的链式表示及实现:

时间: 2024-10-28 16:23:11

数据结构快速回顾——开篇的相关文章

数据结构快速回顾——图的遍历

图的遍历指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上. 图的遍历方法目前有深度优先搜索法和广度(宽度)优先搜索法两种算法. 深度优先搜索法DFS 深度优先搜索法的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续.如果当前被访问过的顶点的所有邻接顶点都已

数据结构快速回顾——栈

堆栈,也可直接称栈,是一种特殊的串行形式的数据结构,它的特殊之处在于只能允许在链结串行或阵列的一端进行加入资料和输出资料的运算.另外堆栈也可以用一维阵列或连结串行的形式来完成. 1 #define STACK_INIT_SIZE 100 2 #define STACKINCREMENT 10 3 4 typedef struct 5 { int* top; 6 int* base; 7 int stacksize; 8 }SqStack; 9 10 int InitStack(SqStack &

数据结构快速回顾——二叉树 解幂子集问题

回溯法是设计递归的一种常用方法,它的求解过程实质上就是一个先序遍历一棵"状态树"的过程,只是这棵树不是遍历前预先建立的而是隐含在遍历过程中的. 下面举一个例子:求含n个元素的集的幂集:集合A={ {1,2,3}, {1,2}, {1,3}, {1}, {2,3},{2},{3},{}}; //{}表示空集合从集合A的每一个元素的角度看,它只有两种状态:或者是属于幂集的元素集,或不属于幂集元素集,则求幂集的过程就可以看成是依次对集合A中的元素进行"取","舍

数据结构快速回顾——二叉树

二叉树(Binary Tree)是个有限元素的集合,该集合或者为空.或者由一个称为根(root)的元素及两个不相交的.被分别称为左子树和右子树的二叉树组成.当集合为空时,称该二叉树为空二叉树.在二叉树中,一个元素也称作一个结点. 基本概念: (1)结点的度.结点所拥有的子树的个数称为该结点的度. (2)叶结点.度为0的结点称为叶结点,或者称为终端结点. (3)分枝结点.度不为0的结点称为分支结点,或者称为非终端结点.一棵树的结点除叶结点外,其余的都是分支结点. (4)左孩子.右孩子.双亲.树中一

数据结构快速回顾——平衡二叉树 AVL (转)

平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树.1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵树,所以它又叫AVL树.平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果插入或者删除一个节点使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态.这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(

数据结构快速回顾——二叉查找树

二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 任意节点的左.右子树也分别为二叉查找树. 没有键值相等的节点(no duplicate nodes). 二叉查找树相比于其他数据结构的优势在于查找.插入的时间复

算法快速回顾——排序算法

常用排序算法有以下几种:冒泡排序.插入排序.快速排序.归并排序.堆排序. 本文将对五种常用算法分析并实现. //交换两个元素的值 这里列出几种不同写法 void swap(int *a, int *b) { int c = *a; *a = *b; *b = c; } void swap(int *a,int *b) { *a = (*a)^(*b); *b = (*b)^(*a); *a = (*a)^(*b); } void swap(int *a,int *b) { *a = *a + *

快速回顾C#基础(编程的小技巧)待完善

一.类型转换 二.可变参数 三.字符串 四.委托 五.构造函数 六.Lamba表达式 七.Linq 八.Entity Framework 1.程序的入口:Entities        文件后缀Context.cs 2.数据库的相关信息都在生成的一个与数据库表对应的类中      文件数据库名.tt中的表名(一般EF的名字和数据库的名字或者项目的名字相同后面加DB) 3.EF对数据库进行增删查改 增: TestEntities entities = new TestEntities(); Use

C++ primer分章节快速回顾

第三章: 1,sozeof(int): int n_int=INT_MAX; sizeof n_int;(对变量括号可选)2,#include<climits>包含一些类型的最大值3,count 默认显示十进制, cout<<dec(默认) count<<hex count<<oct4,bool, char, short, int, long, longlong, float, double, long double5,count.setf(ios_base