首页 > 代码库 > 数据结构快速回顾——开篇
数据结构快速回顾——开篇
六月到了。开始找工作的节奏,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 }
线性表的链式表示及实现:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。