考研数据结构代码

合集下载

长沙理工大学850数据结构2020年考研专业课初试大纲

长沙理工大学850数据结构2020年考研专业课初试大纲

科目代码:850 科目名称:数据结构一、考试内容一、数据结构的有关概念1.掌握数据结构的有关概念,理解逻辑结构与物理结构之间的关系。

2.掌握数据结构的几种基本结构。

3.掌握抽象数据类型的表示与实现方法。

4.熟悉算法分析的分析方法。

二、线性表1.掌握线性表的顺序存储方法及链式存储方法。

2.熟悉线性表的建立、插入、删除、搜索与归并算法。

3.了解一元多项式的表示方法及其应用。

三、栈和队列1.掌握栈和队列的顺序存储方法及链式存储方法。

2.熟悉进栈、出栈、进队、出队的实现方法。

3.栈和对列的简单应用。

4.递归的实现。

四、串1.掌握串的有关概念,了解顺序存储方法及链式存储方法。

2.了解串的有关操作的实现方法。

3.了解串的模式匹配算法。

4.串的简单应用。

五、数组与广义表1.掌握数组的顺序存储方法及矩阵的压缩存储方法。

2.掌握矩阵的转置算法和矩阵的相加算法的实现。

3.了解广义表在m元多项式中的简单应用。

六、树和二叉树1.熟悉树和二叉树的有关定义,掌握二叉树的顺序存储结构和链式存储结构的实现方法。

2.掌握二叉树的建立及二叉树的几种遍历算法,了解树和森林的遍历方法。

3.了解最优二叉树和哈夫曼树的应用。

4.其他简单应用。

七、图1.熟悉图的有关定义,掌握图的数组存储结构和邻接表存储结构的实现方法。

2.了解图的深度优先遍历算法和广度优先算法。

3.了解最小生成树、拓扑排序、关键路径的有关算法。

4.其他简单应用。

八、查找1.掌握静态查找表的几种查找方法。

2.掌握哈希表的构造方法及其冲突处理方法。

九、内部排序和外部排序1.掌握内部排序和外部排序的概念。

2.熟悉插入排序、选择排序及常用的几种排序方法。

2019年大连理工大学考研专业课810数据结构和计算机组成原理考试大纲

2019年大连理工大学考研专业课810数据结构和计算机组成原理考试大纲

大连理工大学2019年硕士研究生入学考试大纲科目代码:810科目名称:数据结构和计算机组成原理Ⅰ.考查目标计算机学科专业基础综合考试是为大连理工大学招收计算机科学与技术学科的硕士研究生而设置的具有选拔性质的联考科目,其目的是科学、公平、有效地测试考生掌握计算机科学与技术学科大学本科阶段专业基础知识、基本理论、基本方法的水平和分析问题、解决问题的能力,评价的标准是高等学校计算机科学与技术学科优秀本科生所能达到的及格或及格以上水平,以利于大连理工大学择优选拔,确保硕士研究生的入学质量。

Ⅱ.考查范围计算机学科专业基础综合考试涵盖数据结构、计算机组成原理等学科专业基础课程。

要求考生系统地掌握上述专业基础课程的概念、基本原理和基本方法,能够运用所学的基本原理和基本方法分析、判断和解决有关理论问题和实际问题。

Ⅲ.考试形式和试卷结构(一)试卷满分及考试时间本试卷满分为150分,考试时间为180分钟。

(二)答题方式答题方式为闭卷、笔试。

(三)试卷内容结构数据结构75分计算机组成原理75分(四)试卷题型结构选择题50分(数据结构20分、计算机组成原理30分)综合应用题100分(数据结构55分、计算机组成原理45分)Ⅲ.考查内容数据结构[考查目标]1.掌握数据结构的基本概念、基本原理和基本方法。

2.掌握数据的逻辑结构、存储结构及基本操作的实现,能够对算法进行基本的时间复杂度与空间复杂度的分析。

3.能够运用数据结构的基本原理和方法进行问题的分析与求解,具备采用C或C++语言设计与实现算法的能力。

一、线性表1.线性表的定义2.线性表的顺序表示和实现3.线性表的链式表示和实现4.线性表的应用二、栈、队列和数组1.栈和队列的基本概念2.栈的顺序表示和实现3.栈的链式表示和实现4.队列的顺序表示和实现5.队列的链式表示和实现6.栈和队列的应用7.数组的定义,数组的顺序表示和实现8.矩阵的压缩存储三、树与二叉树1.树的定义和基本概念2.二叉树(1)二叉树的定义及性质(2)二叉树的存储结构(3)二叉树的遍历(4)线索二叉树3.树、森林(1)树的存储结构(2)树和二叉树的转换,森林与二叉树的转换(3)树和森林的遍历4.哈夫曼(Huffman)树和哈夫曼编码四、图1.图的定义和基本概念2.图的存储方式(1)数组(邻接矩阵)表示法(2)邻接表3.图的遍历及其应用(1)深度优先搜索(2)广度优先搜索4.图的基本应用(1)最小生成树(2)最短路径(3)拓扑排序(4)关键路径五、查找1.查找的基本概念2.静态查找表(1)顺序查找法(2)折半查找法3.动态查找表(1)二叉排序树和平衡二叉树(2)B-树4.哈希(Hash)表5.查找算法的分析及应用六、排序1.排序的基本概念2.插入排序(1)直接插入排序(2)折半插入排序3.起泡排序(bubble sort)4.简单选择排序5.希尔排序(shell sort)6.快速排序7.堆排序8.二路归并排序(merge sort)9.基数排序10.外部排序11.各种排序算法的比较12.排序算法的应用计算机组成原理[考查目标]1.理解单处理器计算机系统中各部件的内部工作原理、组成结构以及相互连接方式,具有完整的计算机系统的整机概念。

王道考研数据结构代码总结

王道考研数据结构代码总结

王道考研数据结构代码总结⽬录⼀、线性表1.顺序表#include<stdlib.h>#include<stdio.h>#include<iostream>using namespace std;#define InitSize 10 //定义最⼤长度静态分配//typedef struct {// int data[InitList];// int length;//}SqlList;//动态分配typedef struct {int *data;int length; //当前长度int MaxSize;//最⼤长度}SqlList;//初始化顺序表void InitList(SqlList &L) {L.data = (int *)malloc(InitSize * sizeof(int));L.length = 0;L.MaxSize = InitSize;}//增加顺序表的长度void IncreaseSize(SqlList &L, int len) {int* p = L.data;L.data = (int*)malloc((L.MaxSize + len) * sizeof(int));for (int i = 0; i < L.length; i++) {L.data[i] = p[i];}L.MaxSize += len;free(p);}//插⼊元素,在位序i的位置插⼊元素ebool ListInsert(SqlList& L, int i, int e) {if (i<1 || i>L.length + 1) return false; //i的范围是否有效if (L.length >= L.MaxSize) return false; //当前存储空间已满,不能插⼊for (int j = L.length; j >= i; j--) {L.data[j] = L.data[j - 1];}L.data[i - 1] = e;L.length++;L.length++;return true;}//删除操作,删除位序i个位置上的元素,e是删除的元素bool ListDelete(SqlList& L, int i, int& e) {if (i<1 || i>L.length) return false;e = L.data[i - 1];for (int j = i; j < L.length; j++) {L.data[j-1] = L.data[j];}L.length--;return true;}//按位查找返回位序i的元素int GetElem(SqlList L, int i) {if (i<1 || i>L.length) return -1;return L.data[i - 1];}//查找第⼀个元素值等于e的元素,并返回其位序int LocateElem(SqlList L, int e) {for (int i = 0; i < L.length; i++) {if (L.data[i] == e) return i + 1;}return -1;}//删除值位于s和t之间的数bool Delete_s_t(SqlList& L, int s, int t) {if (L.length == 0 || s >= t) return false;int k = 0;for (int i = 0; i < L.length; i++) {if (L.data[i]<s || L.data[i]>t) {L.data[k++] = L.data[i];}}L.length = k;return true;}int main() {SqlList L;InitList(L);ListInsert(L, 1, 1);ListInsert(L, 2, 6);ListInsert(L, 3, 3);ListInsert(L, 4, 8);ListInsert(L, 5, 2);for (int i = 0; i < L.length; i++) {cout << L.data[i] << " ";}cout << endl;Delete_s_t(L, 2, 3);for (int i = 0; i < L.length; i++) {cout << L.data[i] << " ";}cout << endl;return 0;}2.单链表(不带头结点)#include<iostream>#include<algorithm>using namespace std;typedef struct LNode {int data;struct LNode* next;}LNode, * LinkList;//struct LNode* == LinkList//强调节点⽤LNode//强调链表⽤LinkList//初始化单链表bool InitList(LinkList& L) {L = NULL;return true;}//按位查找,返回第i个元素(不带带头节点)LNode* GetElem(LinkList L, int i) {if (i <= 0) return NULL;int j = 1;LNode* p = L;while (p && j < i) {p = p->next;j++;}return p;}//按值查找,找到数据域等于e的节点LNode* LocateElem(LinkList L, int e) {LNode* p = L;while (p && p->data != e) {p = p->next;}return p;}//统计单链表的长度int Length(LinkList L) {int len = 0;LNode* p = L;while (p) {len++;p = p->next;}return len;}//后插操作,在节点p之后插⼊元素ebool InsertNextNode(LNode* p, int e) {if (!p) return false;LNode* s = (LNode*)malloc(sizeof(LNode)); if (!s) return false;s->data = e;s->next = p->next;p->next = s;return true;}//不带头节点的插⼊操作,在第i个位置插⼊元素ebool ListInsert(LinkList& L, int i, int e) {if (i < 1) return false;if (i == 1) {LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = L;L = s;return true;}LNode* p;p = L;int j = 1; //当前p指向的是第⼏个节点,没有头节点,所以从1开始 while (p && j < i - 1) {p = p->next;j++;}if (!p) return false;return InsertNextNode(p, e);}//前插操作,在p节点前插⼊元素ebool InsertPriorNode(LNode* p, int e) {if (!p) return false;LNode* s = (LNode*)malloc(sizeof(LNode));if (!s) return false;s->next = p->next;p->next = s;s->data = p->data;p->data = e;return true;}//前插操作,在节点p之前插⼊节点sbool InsertPriorNode(LNode* p, LNode* s) {if (!p || !s) return false;s->next = p->next;p->next = s;swap(s->data, p->data);return true;}//删除位序i的节点,e是i节点的值bool ListDelete(LinkList& L, int i, int& e) {if (L == NULL) {e = -1;return false;}if (i < 1) return false;if (i > 1) {LNode* p = GetElem(L, i - 1);if (!p || !(p->next)) return false;LNode* q = p->next;e = q->data;p->next = q->next;free(q);}else {if (L->next == NULL) {e = L->data;L = NULL;}else {e = L->data;L = L->next;L = L->next;}}return true;}//删除指定节点Pbool DeleteNode(LNode* p) {if (p->next == NULL) return false;//下⾯这段代码有bug,不能删除最后⼀个节点,因此要是删除最后⼀个节点的话要重新进⾏操作 LNode* q = p->next;p->data = q->data;p->next = q->next;free(q);return true;}//尾插法,不带头结点LinkList List_TailInsert(LinkList& L) {InitList(L);LNode* s, * r = L ; //r表⽰表尾指针int x;bool is_head = true;while (cin >> x) {s = (LNode*)malloc(sizeof(LNode));if (is_head) {is_head = false;s->data = x;L = s;r = s;}s->data = x;r->next = s;r = s;}r->next = NULL;return L;}//头插法,不带头结点LinkList List_HeadInsert(LinkList& L) {InitList(L);LNode* s;int x;while (cin >> x) {s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = L;L = s;}return L;}void print(LinkList L) {LNode* s = L;while (s!= NULL) {cout << s->data << " ";s = s->next;}cout << endl;}}int main() {LinkList L;List_HeadInsert(L);cout << "头插法的结果" << endl;print(L);//List_TailInsert(L);//cout << "尾插法的结果" << endl;//print(L);cout << "链表的第1个元素:" << GetElem(L, 1)->data << endl; cout << "链表的长度:" << Length(L) << endl;int e;ListDelete(L, 5, e);cout << "删除的第1个元素是:" << e << endl;cout << "当前的链表" << endl;print(L);ListInsert(L, 5, e);cout << "插⼊的第1个元素是:" << e << endl;cout << "当前的链表" << endl;print(L);LNode* s = LocateElem(L, 5);return 0;}3.单链表(带头结点)#include<iostream>#include<algorithm>using namespace std;typedef struct LNode {int data;struct LNode* next;}LNode, *LinkList;//struct LNode* == LinkList//强调节点⽤LNode//强调链表⽤LinkList//按位查找,返回第i个元素(带头节点)LNode* GetElem(LinkList L, int i) {if (i < 0) return NULL;int j = 0;LNode* p = L;while (p && j < i) {p = p->next;j++;}return p;}//按值查找,找到数据域等于e的节点LNode* LocateElem(LinkList L, int e) {LNode* p = L->next;while (p && p->data!=e) {p = p->next;}return p;}//统计单链表的长度//统计单链表的长度int Length(LinkList L) {int len = 0;LNode* p = L;while (p->next) {len++;p = p->next;}return len;}//后插操作,在节点p之后插⼊元素ebool InsertNextNode(LNode *p, int e) {if (!p) return false;LNode* s = (LNode*)malloc(sizeof(LNode));if (!s) return false;s->data = e;s->next = p->next;p->next = s;return true;}//带头节点的插⼊操作,在第i个位置插⼊元素ebool ListInsert(LinkList& L, int i, int e) {if (i < 1) return false;LNode* p = GetElem(L, i - 1);if (!p) return false;return InsertNextNode(p, e);}//不带头节点的插⼊操作,在第i个位置插⼊元素ebool NoHead_ListInsert(LinkList& L, int i, int e) {if (i < 1) return false;if (i == 1) {LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = L;L = s;return true;}LNode* p;p = L;int j = 1; //当前p指向的是第⼏个节点,没有头节点,所以从1开始 while (p && j < i - 1) {p = p->next;j++;}if (!p) return false;return InsertNextNode(p, e);}//前插操作,在p节点前插⼊元素ebool InsertPriorNode(LNode* p, int e) {if (!p) return false;LNode* s = (LNode*)malloc(sizeof(LNode));if (!s) return false;s->next = p->next;p->next = s;s->data = p->data;p->data = e;return true;}//前插操作,在节点p之前插⼊节点sbool InsertPriorNode(LNode* p, LNode* s) {if ( !p || !s ) return false;if ( !p || !s ) return false;s->next = p->next;p->next = s;swap(s->data , p->data);return true;}//删除位序i的节点,e是i节点的值bool ListDelete(LinkList& L, int i, int& e) {if (i < 1) return false;LNode* p = GetElem(L, i - 1);if (!p || !(p->next)) return false;LNode* q = p->next;e = q->data;p->next = q->next;free(q);return true;}//删除指定节点Pbool DeleteNode(LNode* p) {if (p->next == NULL) return false;//下⾯这段代码有bug,不能删除最后⼀个节点,因此要是删除最后⼀个节点的话要重新进⾏操作 LNode* q = p->next;p->data = q->data;p->next = q->next;free(q);return true;}bool InitList(LinkList& L) {L = (LNode* )malloc(sizeof(LNode));//分配⼀个头节点if (!L) return false;L->next = NULL;return true;}//尾插法,带头结点LinkList List_TailInsert(LinkList& L) {L = (LinkList)malloc(sizeof(LNode));L->next = NULL;LNode* s, * r = L; //r表⽰表尾指针int x;while (cin >> x) {s = (LNode*)malloc(sizeof(LNode));s->data = x;r->next = s;r = s;}r->next = NULL;return L;}//头插法,带头结点LinkList List_HeadInsert(LinkList& L) {L = (LinkList)malloc(sizeof(LNode));L->next = NULL;LNode* s;int x;while (cin >> x) {s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = L->next;L->next = s;}return L;return L;}void print(LinkList L) {LNode* s = L;while (s->next!=NULL) {s = s->next;cout << s->data << " ";}cout << endl;}int main() {LinkList L;//List_HeadInsert(L);//cout << "头插法的结果" << endl;//print(L);List_TailInsert(L);cout << "尾插法的结果" << endl;print(L);cout << "链表的第2个元素:"<< GetElem(L, 2)->data << endl; cout << "链表的长度:"<< Length(L) << endl;int e;ListDelete(L, 3, e);cout << "删除的第3个元素是:" << e << endl;cout << "当前的链表" << endl;print(L);ListInsert(L, 3, e);cout << "插⼊的第3个元素是:" << e << endl;cout << "当前的链表" << endl;print(L);LNode* s = LocateElem(L, 5);return 0;}3.双链表(带头结点)#include<iostream>using namespace std;typedef int ElemType;typedef struct DNode {ElemType data;struct DNode* prior, * next;}DNode, * DLinkList;//初始化双链表bool InitDLinkList(DLinkList& L) {L = (DNode*)malloc(sizeof(DNode));if (L == NULL) {return false;}L->prior = NULL;L->next = NULL;return true;}//判断双链表是否为空bool empty(DLinkList L) {if (L->next = NULL) {return true;return true;}return false;}//按位查找:返回第i个结点DNode* GetElem(DLinkList L, int i) {if (i < 0) return NULL;int j = 0;DNode* p = L;while (p != NULL && j < i) {p = p->next;j++;}return p;}//按值查找:找到第⼀个数据域为e的结点DNode* LocateElem(DLinkList L, ElemType e) {DNode* p = L;if (p == NULL) return NULL;p = p->next;while (p != NULL && p->data != e) {p = p->next;}return p;}//在p节点之后插⼊s节点bool InsertNextDNode(DNode* p, DNode* s) {if (p == NULL || s == NULL) {return false;}s->next = p->next;if(p->next != NULL)p->next->prior = s;s->prior = p;p->next = s;}//在p节点后⾯插⼊值是e的节点bool InsertNextDNode(DNode* p, ElemType e) {if (p == NULL) return false;DNode* q = (DNode*)malloc(sizeof(DNode));if (q == NULL) return false;q->data = e;q->next = NULL;q->prior = p;if (p->next != NULL) {p->next->prior = q;q->next = p->next;}p->next = q;return true;}//前插,在p节点前⾯插⼊节点sbool InsertPriorDnode(DNode* p, DNode* s) {return InsertNextDNode(p->prior, s);}//按位插⼊,在第i个位置插⼊值为e的节点(位序i)bool InsertDLinkList(DLinkList& L, int i, ElemType e) { if (i <= 0) return false;DNode* p = GetElem(L, i - 1);return InsertNextDNode(p, e);return InsertNextDNode(p, e);}//删除p节点的后继节点bool DeleteNextNode(DNode* p) {if (p == NULL) return false;DNode* q = p->next;if (q == NULL) return false;p->next = q->next;if (q->next != NULL) q->next->prior = p; free(q);return true;}//销毁双链表bool DestoryList(DLinkList& L) {while (L->next != NULL) {DeleteNextNode(L);}free(L);L = NULL;return true;}//尾插法DLinkList List_TailInsert(DLinkList& L) { InitDLinkList(L);DNode* p = L;ElemType x;while (cin >> x) {InsertNextDNode(p, x);p = p->next;}return L;}//头插法DLinkList List_HeadInsert(DLinkList& L) { InitDLinkList(L);ElemType x;while (cin >> x) {InsertNextDNode(L, x);}return L;}int Length(DLinkList L) {DNode* p = L;int len = 0;while (p->next != NULL) {len++;p = p->next;}return len;}//删除指定节点sbool DeleteNode(DNode* s) {DNode* p;p = s->prior;p->next = s->next;if (s->next != NULL) {s->next->prior = p;}free(s);free(s);return true;}//删除位序i的节点,e是i节点的值bool ListDelete(DLinkList& L, int i, ElemType& e) {if (i <= 0 || i > Length(L)) return false;DNode* s;s = GetElem(L, i);if (s == NULL) return false;e = s->data;return DeleteNode(s);}void print(DLinkList L) {DNode* p = L->next;while (p != NULL) {cout << p->data << " ";p = p->next;}cout << endl;}void testDLinkList() {DLinkList L;//cout << "头插法" << endl;//List_HeadInsert(L);//print(L);cout << "尾插法" << endl;List_TailInsert(L);print(L);cout << "长度:" << Length(L) << endl;cout << "第1个元素为:" << GetElem(L, 1)->data << endl; cout << "第5个元素为:" << GetElem(L, 5)->data << endl; cout << "在第⼀个位置插⼊元素0" << endl;InsertDLinkList(L, 1, 0);print(L);cout << "在最后⼀个位置插⼊元素6" << endl;InsertDLinkList(L, 7, 6);print(L);int e;ListDelete(L, 1, e);cout << "删除第⼀个节点:" << e << endl;cout << "当前链表为" << endl;print(L);ListDelete(L, 6, e);cout << "删除最后⼀个节点:" << e << endl;cout << "当前链表为" << endl;print(L);DestoryList(L);}int main() {testDLinkList();return 0;}4.循环单链表(L指向表头)#include<iostream>#include<algorithm>using namespace std;typedef struct LNode {int data;struct LNode* next;}LNode, * LinkList;//struct LNode* == LinkList//强调节点⽤LNode//强调链表⽤LinkListbool InitList(LinkList& L) {L = (LNode*)malloc(sizeof(LNode));//分配⼀个头节点 if (L == NULL) return false;L->next = L;return true;}//按位查找,返回第i个元素(带头节点)LNode* GetElem(LinkList L, int i) {if (i < 0) return NULL;if (i == 0) return L;int j = 1;LNode* p = L->next;while (p != L && j < i) {p = p->next;j++;}return p;}//按值查找,找到数据域等于e的节点LNode* LocateElem(LinkList L, int e) {LNode* p = L->next;while (p != L && p->data != e) {p = p->next;}if (p->data == e) return p;return NULL;}//统计单链表的长度int Length(LinkList L) {int len = 0;LNode* p = L;while (p->next != L) {len++;p = p->next;}return len;}//后插操作,在节点p之后插⼊元素ebool InsertNextNode(LNode* p, int e) {if (!p) return false;LNode* s = (LNode*)malloc(sizeof(LNode));if (!s) return false;s->data = e;s->next = p->next;p->next = s;return true;}//带头节点的插⼊操作,在第i个位置插⼊元素e bool ListInsert(LinkList& L, int i, int e) {if (i < 1) return false;LNode* p = GetElem(L, i - 1);if (!p) return false;return InsertNextNode(p, e);}//前插操作,在p节点前插⼊元素ebool InsertPriorNode(LNode* p, int e) {if (!p) return false;LNode* s = (LNode*)malloc(sizeof(LNode)); if (!s) return false;s->next = p->next;p->next = s;s->data = p->data;p->data = e;return true;}//前插操作,在节点p之前插⼊节点sbool InsertPriorNode(LNode* p, LNode* s) { if (!p || !s) return false;s->next = p->next;p->next = s;swap(s->data, p->data);return true;}//删除位序i的节点,e是i节点的值bool ListDelete(LinkList& L, int i, int& e) {if (i < 1) return false;LNode* p = GetElem(L, i - 1);if (p == NULL || p->next == L) return false; LNode* q = p->next;e = q->data;p->next = q->next;free(q);return true;}//删除指定节点Pbool DeleteNode(LinkList& L, LNode* p) {LNode* q = p->next;p->data = q->data;p->next = q->next;if (L == q) {L = p;}free(q);return true;}//尾插法,带头结点LinkList List_TailInsert(LinkList& L) {InitList(L);LNode* s, * r = L; //r表⽰表尾指针int x;while (cin >> x) {s = (LNode*)malloc(sizeof(LNode));s->data = x;r->next = s;r = s;r = s;}r->next = L;return L;}//头插法,带头结点LinkList List_HeadInsert(LinkList& L) {InitList(L);LNode* s, * r = L;int x;bool isFirst = true;while (cin >> x) {s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = L->next;L->next = s;if (isFirst) {r = s;isFirst = false;}}r->next = L;return L;}bool Empty(LinkList L) {if (L->next == L) {return true;}return false;}//判断是否为表尾节点bool isTail(LinkList L, LNode* p) {if (p->next == L) return true;return false;}void print(LinkList L) {LNode* s = L->next;while (s != L) {cout << s->data << " ";s = s->next;}cout << endl;}int main() {LinkList L;//List_HeadInsert(L);//cout << "头插法的结果" << endl;//print(L);List_TailInsert(L);cout << "尾插法的结果" << endl;print(L);cout << "链表的第1个元素:" << GetElem(L, 1)->data << endl; cout << "链表的第5个元素:" << GetElem(L, 5)->data << endl; cout << "链表的长度:" << Length(L) << endl;int e;ListDelete(L, 5, e);cout << "删除的第5个元素是:" << e << endl;cout << "当前的链表" << endl;cout << "当前的链表" << endl;print(L);ListInsert(L, 5, e);cout << "插⼊的第5个元素是:" << e << endl;cout << "当前的链表" << endl;print(L);ListDelete(L, 1, e);cout << "删除的第1个元素是:" << e << endl;cout << "当前的链表" << endl;print(L);ListInsert(L, 1, e);cout << "插⼊的第1个元素是:" << e << endl;cout << "当前的链表" << endl;print(L);LNode* s = LocateElem(L, 5);DeleteNode(L, s);print(L);return 0;}/*输⼊样例:1 2 3 4 5*/5.循环单链表(L指向表尾)#include<iostream>#include<algorithm>using namespace std;typedef struct LNode {int data;struct LNode* next;}LNode, * LinkList;//struct LNode* == LinkList//强调节点⽤LNode//强调链表⽤LinkListbool InitList(LinkList& L) {L = (LNode*)malloc(sizeof(LNode));//分配⼀个头节点 if (L == NULL) return false;L->next = L;return true;}//按位查找,返回第i个元素(带头节点)LNode* GetElem(LinkList L, int i) {if (i < 0) return NULL;if (i == 0) return L->next;int j = 1;LNode* p = L->next->next;while (p != L->next && j < i) {p = p->next;j++;}if (p == L->next) return NULL;return p;}//按值查找,找到数据域等于e的节点LNode* LocateElem(LinkList L, int e) {LNode* p = L->next->next;while (p != L->next && p->data != e) {p = p->next;}if (p->data == e) return p;return NULL;}//统计单链表的长度int Length(LinkList L) {int len = 0;LNode* p = L;while (p->next != L) {len++;p = p->next;}return len;}//后插操作,在节点p之后插⼊元素ebool InsertNextNode(LinkList& L, LNode* p, int e) { if (!p) return false;LNode* s = (LNode*)malloc(sizeof(LNode));if (!s) return false;s->data = e;s->next = p->next;p->next = s;if (p == L) L = s;return true;}//带头节点的插⼊操作,在第i个位置插⼊元素e bool ListInsert(LinkList& L, int i, int e) {if (i < 1) return false;LNode* p = GetElem(L, i - 1);if (!p) return false;return InsertNextNode(L, p, e);}//前插操作,在p节点前插⼊元素ebool InsertPriorNode(LNode* p, int e) {if (!p) return false;LNode* s = (LNode*)malloc(sizeof(LNode));if (!s) return false;s->next = p->next;p->next = s;s->data = p->data;p->data = e;return true;}//前插操作,在节点p之前插⼊节点sbool InsertPriorNode(LNode* p, LNode* s) {if (!p || !s) return false;s->next = p->next;p->next = s;swap(s->data, p->data);return true;}//删除位序i的节点,e是i节点的值bool ListDelete(LinkList& L, int i, int& e) {bool ListDelete(LinkList& L, int i, int& e) {if (i < 1) return false;LNode* p = GetElem(L, i - 1);if (p == NULL || p == L) return false;if (p->next == L) {L = p;}LNode* q = p->next;e = q->data;p->next = q->next;free(q);return true;}//删除指定节点Pbool DeleteNode(LinkList& L, LNode* p) {LNode* q = p->next;p->data = q->data;p->next = q->next;if (L == p) { //尾节点q = p;while (q->next != p) {q = q->next;}L = q;}//free(q);不能这样写,因为指针之间的赋值是指向同⼀块区域,就⽐如L和q就是指向相同的区域 return true;}//尾插法,带头结点LinkList List_TailInsert(LinkList& L) {InitList(L);LNode* s, * r = L; //r表⽰表尾指针int x;while (cin >> x) {s = (LNode*)malloc(sizeof(LNode));s->data = x;r->next = s;r = s;}r->next = L;L = r;return L;}//头插法,带头结点LinkList List_HeadInsert(LinkList& L) {InitList(L);LNode* s, * r = L;int x;bool isFirst = true;while (cin >> x) {s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = L->next;L->next = s;if (isFirst) {r = s;isFirst = false;}}r->next = L;L = r;L = r;return r;}bool Empty(LinkList L) {if (L->next == L) {return true;}return false;}//判断是否为表尾节点bool isTail(LinkList L, LNode* p) {if (p == L) return true;return false;}void print(LinkList L) {LNode* s = L->next->next;while (s != L->next) {cout << s->data << " ";s = s->next;}cout << endl;}int main() {LinkList L;//List_HeadInsert(L);//cout << "头插法的结果" << endl;//print(L);List_TailInsert(L);cout << L->data << endl;cout << "尾插法的结果" << endl;print(L);cout << "链表的第1个元素:" << GetElem(L, 1)->data << endl; cout << "链表的第5个元素:" << GetElem(L, 5)->data << endl; cout << "链表的长度:" << Length(L) << endl;int e;ListDelete(L, 5, e);cout << "删除的第5个元素是:" << e << endl;cout << "当前的链表" << endl;print(L);ListInsert(L, 5, e);cout << "插⼊的第5个元素是:" << e << endl;cout << "当前的链表" << endl;print(L);ListDelete(L, 1, e);cout << "删除的第1个元素是:" << e << endl;cout << "当前的链表" << endl;print(L);ListInsert(L, 1, e);cout << "插⼊的第1个元素是:" << e << endl;cout << "当前的链表" << endl;print(L);LNode* s = LocateElem(L, 5);DeleteNode(L, s);print(L);return 0;}}/*输⼊样例:1 2 3 4 5*/6.循环双链表#include<iostream>using namespace std;typedef int ElemType;typedef struct DNode {ElemType data;struct DNode* prior, * next;}DNode, * DLinkList;//初始化双链表bool InitDLinkList(DLinkList& L) {L = (DNode*)malloc(sizeof(DNode));if (L == NULL) {return false;}L->prior = L;L->next = L;return true;}//判断双链表是否为空bool empty(DLinkList L) {if (L->next = L) {return true;}return false;}bool isTail(DLinkList L, DNode* p) {if (p->next == L) return true;return false;}//按位查找:返回第i个结点DNode* GetElem(DLinkList L, int i) {if (i < 0) return NULL;if (i == 0) return L;int j = 1;DNode* p = L->next;while (p != L && j < i) {p = p->next;j++;}if (p == L) return NULL;return p;}//按值查找:找到第⼀个数据域为e的结点DNode* LocateElem(DLinkList L, ElemType e) { DNode* p = L;if (p == NULL) return NULL;p = p->next;while (p != L && p->data != e) {p = p->next;}if (p == L) return NULL;return p;}//在p节点之后插⼊s节点bool InsertNextDNode(DNode* p, DNode* s) {if (p == NULL || s == NULL) {return false;}s->next = p->next;p->next->prior = s;s->prior = p;p->next = s;}//在p节点后⾯插⼊值是e的节点bool InsertNextDNode(DNode* p, ElemType e) {if (p == NULL) return false;DNode* q = (DNode*)malloc(sizeof(DNode));if (q == NULL) return false;q->data = e;q->prior = p;p->next->prior = q;q->next = p->next;p->next = q;return true;}//前插,在p节点前⾯插⼊节点sbool InsertPriorDnode(DNode* p, DNode* s) {return InsertNextDNode(p->prior, s);}//按位插⼊,在第i个位置插⼊值为e的节点(位序i)bool InsertDLinkList(DLinkList& L, int i, ElemType e) { if (i <= 0) return false;DNode* p = GetElem(L, i - 1);return InsertNextDNode(p, e);}//删除p节点的后继节点bool DeleteNextNode(DNode* p) {if (p == NULL) return false;DNode* q = p->next;p->next = q->next;q->next->prior = p;free(q);return true;}//销毁双链表bool DestoryList(DLinkList& L) {while (L->next != L) {DeleteNextNode(L);}free(L);L = NULL;return true;}//尾插法DLinkList List_TailInsert(DLinkList& L) {InitDLinkList(L);ElemType x;while (cin >> x) {InsertNextDNode(p, x);p = p->next;}return L;}//头插法DLinkList List_HeadInsert(DLinkList& L) {InitDLinkList(L);ElemType x;while (cin >> x) {InsertNextDNode(L, x);}return L;}int Length(DLinkList L) {DNode* p = L;int len = 0;while (p->next != L) {len++;p = p->next;}return len;}//删除指定节点sbool DeleteNode(DNode* s) {DNode* p;p = s->prior;p->next = s->next;s->next->prior = p;free(s);return true;}//删除位序i的节点,e是i节点的值bool ListDelete(DLinkList& L, int i, ElemType& e) { if (i <= 0 || i > Length(L)) return false;DNode* s;s = GetElem(L, i);if (s == NULL) return false;e = s->data;return DeleteNode(s);}void print(DLinkList L) {DNode* p = L->next;while (p != L) {cout << p->data << " ";p = p->next;}cout << endl;}void testDLinkList() {DLinkList L;//cout << "头插法" << endl;//List_HeadInsert(L);//print(L);cout << "尾插法" << endl;。

甘肃农业大学849数据结构和计算机网络(“数据结构”部分)2021年考研专业课初试大纲

甘肃农业大学849数据结构和计算机网络(“数据结构”部分)2021年考研专业课初试大纲

共3页
第3页
(1)数据结构及算法基本概念; (2)线性表; (3)栈和队列; (4)串; (5)递归; (6)数组和稀疏矩阵; (7)树和二叉树; (8)图; (9)查找; (10)内排序。 考查学生运用上述知识的综合分析能力,各部分的基本内容如下: (一)基本概念
1.数据结构的基本概念; 2.算法的基本概念; 3.算法描述和基本特性; 4.算法时间复杂度和空间复杂度分析。 (二)线性表 1.线性表的逻辑结构特点和线性表抽象数据类型的描述方法; 2.线性表的两种存储结构(顺序存储结构及链式存储结构)以及各自的优缺点; 3.顺序表增加、删除、插入节点的算法; 4.单链表、双链表和循环链表中增加、删除、插入节点的算法。 (三)栈和队列 1.栈的逻辑结构特性和栈抽象数据类型的描述方法; 2.栈的先进后出特点; 3.栈的基本运算在顺序存储结构和链式存储结构下的实现算法; 4.栈在实际求解问题中的应用方法(求解简单表达式值);
共3页
第2页
8.如何构造哈希表; 9.各种不同查找方法的性能(时空复杂度)比较和分析。 (十)内排序 1.排序的定义和相关概念; 2.插入排序算法,包括直接插入排序、折半插入排序和希尔排序; 3.交换排序算法,包括冒泡排序和快速排序; 4.选择排序算法,包括简单选择排序和堆排序; 5.归并排序算法,包括二路归并排序; 6.基数排序算法,包括最低位优先和最高位优先排序; 7.各种内排序方法的性能(时空复杂度)分析和比较。
甘肃农业大学 2021 年全国硕士研究生招生考试 初试自命题科目考试大纲
科目代码: 849 科目名称:《数据结构和计算机网络》“数据结构”部分
考查目标
“数据结构”部分涵盖了数据逻辑结构、数据存储结构和算法设计与分析三方面的内容。 要求考生熟练掌握基本的线性和非线性数据的逻辑结构特点、常见物理存储实现方法以及各 自的优缺点;基本掌握针对具体问题,分析其数据结构特点,设计算法解决该问题的方法和 流程;初步掌握对算法进行时间复杂度与空间复杂度分析的方法。

火箭军工程大学2019考研大纲:843数据结构

火箭军工程大学2019考研大纲:843数据结构

火箭军工程大学2019考研大纲:843数据结构考研大纲频道为大家提供火箭军工程大学2019考研大纲:843数据结构,一起来了解一下考试内容吧!更多考研资讯请关注我们网站的更新!火箭军工程大学2019考研大纲:843数据结构科目代码:843科目名称:数据结构适用学科:计算机科学与技术、计算机技术(专业学位)一、考试的总体要求主要考查学生对数据结构的基本理论与应用的掌握情况,以便为应用所涉及的数据结构选择适当的逻辑结构、存储结构及其相应的操作算法。

考试时用C语言及C++语言描述算法均可。

二、考试的内容第1章数据结构基础知识(1.2 与数据结构相关的概念;1.3.3 算法效率的衡量方法和准则);第2章线性表(2.1 线性表的类型定义;2.2 线性表的顺序表示和实现;2.3 线性表的链式表示和实现(其中,2.3.5 双向链表不作要求); 2.5 顺序表和链表的综合比较)第3章排序(3.1 排序的基本概念;3.2 简单排序方法;3.3 先进排序方法;3.4 基数排序;3.5 各种排序方法的综合比较)第4章栈和队列(4.1 栈; 4.2 栈的应用举;4.3 队列;4.4 队列应用举例)第5章串和数组(5.1 串的定义和操作;5.2 串的表示和实现;5.3 正文模式匹配)第6章二叉树和树(6.1 二叉树;6.2 二叉树遍历(其中,6.2.4 线索二叉树不作要求);6.3 树和森林;6.4 树的应用)第7章图和广义表(7.1 图的定义和术语;7.2 图的存储结构; 7.3 图的遍历;7.4 连通网的最小生成树;7.5 单源最短路径;7.6 拓扑排序;7.7 关键路径)第8章查找表(8.1 静态查找表;8.2 动态查找表(其中,键树不作要求);8.3 哈希表及其查找)三、试卷类型及比例(1)填空题,约占10%。

(2)选择题,约占30%。

(3)简答题、综合题、设计题,约占60%。

四、考试形式及时间考试形式为笔试,考试时间为3小时,满分150分。

清华严蔚敏《数据结构》的全部代码

清华严蔚敏《数据结构》的全部代码

/*c1、h(程序名) */#include<string、h>#include<ctype、h>#include<malloc、h>/* malloc()等*/#include<limits、h>/*INT_MAX等*/#include<stdio、h>/* EOF(=^Z或F6),NULL */#include<stdlib、h>/* atoi() */#include<io、h>/* eof() */#include<math、h>/* floor(),ceil(),abs() */#include<process、h>/* exit() *//*函数结果状态代码*/#defineTRUE 1#defineFALSE 0#defineOK 1#defineERROR 0#defineINFEASIBLE -1/* #define OVERFLOW -2因为在math、h中已定义OVERFLOW得值为3,故去掉此行*/typedef intStatus;/* Status就是函数得类型,其值就是函数结果状态代码,如OK等*/typedef intBoolean;/* Boolean就是布尔类型,其值就是TRUE或FALSE *//* algo2-1、c 实现算法2、1得程序*/#include"c1、h"typedef intElemType;#include"c2-1、h"/*c2-1、h 线性表得动态分配顺序存储结构*/#defineLIST_INIT_SIZE10/*线性表存储空间得初始分配量*/#defineLISTINCREMENT 2/*线性表存储空间得分配增量*/typedefstruct{ElemType*elem;/*存储空间基址*/intlength;/*当前xx*/intlistsize;/*当前分配得存储容量(以sizeof(ElemType)为单位) */}SqList;#include"bo2-1、c"/* bo2-1、c 顺序表示得线性表(存储结构由c2-1、h定义)得基本操作(12个) */StatusInitList(SqList*L)/*算法2、3 */{/*操作结果:构造一个空得顺序线性表*/(*L)、elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!(*L)、elem)exit(OVERFLOW);/*存储分配失败*/(*L)、length=0;/*空表长度为0 */(*L)、listsize=LIST_INIT_SIZE;/*初始存储容量*/returnOK;}StatusDestroyList(SqList*L){/*初始条件:顺序线性表L已存在。

考研数据结构代码

考研数据结构代码

考研数据结构代码考研数据结构代码一、简介1·1 数据结构概述1·2 考研数据结构重要性1·3 考研数据结构的基本知识点二、线性表2·1 定义与特点2·2 顺序表2·2·1 顺序表的基本操作2·2·2 顺序表的存储结构2·3 链表2·3·1 单链表2·3·2 双链表2·3·3 循环链表三、栈与队列3·1 栈的定义与基本操作3·2 栈的应用举例3·3 队列的定义与基本操作 3·4 队列的应用举例四、树与二叉树4·1 树的基本概念4·2 树的存储结构4·2·1 双亲表示法4·2·2 孩子表示法4·2·3 孩子兄弟表示法 4·3 二叉树的定义与基本性质 4·4 二叉树的遍历4·4·1 先序遍历4·4·2 中序遍历4·4·3 后序遍历4·5 线索二叉树五、图5·1 图的基本概念5·2 图的存储结构5·2·1 邻接矩阵5·2·2 邻接表5·3 图的遍历算法5·3·1 深度优先搜索 5·3·2 广度优先搜索 5·4 最小树5·4·1 Prim算法5·4·2 Kruskal算法 5·5 最短路径5·5·1 Dijkstra算法 5·5·2 Floyd算法六、排序6·1 内部排序与外部排序 6·2 插入排序6·2·1 直接插入排序6·2·2 希尔排序6·3 交换排序6·3·1 冒泡排序6·3·2 快速排序6·4 选择排序6·4·1 简单选择排序 6·4·2 堆排序6·5 归并排序6·6 基数排序七、查找7·1 顺序查找7·2 折半查找7·3 哈希表查找八、附件8·1 相关代码实例8·2 数据结构参考书籍九、法律名词及注释9·1 著作权法:保护文学、艺术作品的权益。

兰州理工大学892数据结构2020年考研专业初试大纲

兰州理工大学892数据结构2020年考研专业初试大纲

《数据结构》科目考试大纲层次:硕士考试科目代码:892适用招生专业:计算机系统结构,计算机科学与技术,软件工程,物联网工程,电子信息一、考试主要内容:1.数据结构基本概念①数据;②数据元素;③数据逻辑结构;④数据存储结构;⑤数据类型;⑥算法;⑦抽象数据类型;⑧算法时间复杂度和空间复杂度的分析。

2.线性表①线性表的基本概念和类型定义;②线性表的顺序存储结构;③线性表的链接存储结构。

3.稀疏矩阵和广义表①稀疏矩阵的定义、存储和运算;②广义表的定义、存储和运算。

4.栈和队列①栈的类型定义;②栈的顺序存储和链接存储的表示;③在栈的顺序存储和链接存储上进行各种栈操作的算法;④栈的应用;⑤队列的类型定义;⑥队列的顺序存储(循环队)和链接存储表示及各种操作的实现算法。

5.树和二叉树①树的定义、性质和表示方法;②二叉树的定义、性质和存储结构;③二叉树的各种遍历方法及实现;④建立二叉树、输出二叉树、求二叉树深度等的操作方法及实现;⑤树的存储结构,进行先根遍历、后根遍历和按层遍历的方法及实现,进行树与二叉树的转换方法。

6.二叉树的应用①二叉搜索树的定义及运算;②堆的定义、存储结构及运算;③哈夫曼树的定义、构造哈夫曼树的方法及哈夫曼编码的方法。

7.图①图的定义和术语;②图的邻接矩阵、邻接表和边集数组表示;③图的深度和广度优先搜索遍历;④图的生成树和最小生成树;⑤拓扑排序。

8.查找①顺序查找和二分查找;②索引查找和分块查找;③散列查找;④B树查找。

9.排序①排序的概念;②直接插入排序;③冒泡排序和快排序;④直接选择排序和堆排序;⑤归并排序;⑥排序的时间复杂度和空间复杂度。

二、建议参考书目:[1]《数据结构》(C语言版),严蔚敏,吴伟民编著,北京:清华大学出版社,2011年7月。

[2]《算法与数据结构》张永,李睿,年福忠等.北京:国防科技出版社,2008。

考研数据结构代码简版

考研数据结构代码简版

考研数据结构代码考研数据结构代码1. Introduction数据结构是计算机科学中的重要概念,它关注如何组织和存储数据以便有效地使用。

在计算机科学的学习和应用中,数据结构常常被用于解决各种复杂的问题。

考研数据结构代码是为了帮助考生更好地理解和掌握数据结构概念而编写的一部分代码。

本文档将介绍考研数据结构代码的相关内容。

2. 考研数据结构代码的主要内容考研数据结构代码主要包含以下几个方面的内容:2.1 基本数据结构基本数据结构是数据结构中最常见和基础的部分,它包括:- 数组(Array):顺序存储结构,可以存储相同类型的数据元素。

- 链表(Linked List):动态存储结构,由一系列节点组成,节点之间通过指针连接。

- 栈(Stack):一种特殊的线性表,只能在表的一端进行插入和删除操作。

- 队列(Queue):一种特殊的线性表,只能在表的一端进行插入操作,在另一端进行删除操作。

- 树(Tree):由节点和边组成的集合,节点之间存在着层次关系。

- 图(Graph):由顶点和边组成的集合,顶点之间可以存在着多种关系。

2.2 常见数据结构算法除了基本数据结构外,考研数据结构代码还包含一些常见的数据结构算法,如:- 排序算法:包括冒泡排序、插入排序、选择排序、快速排序等。

- 查找算法:包括线性查找、二分查找等。

- 图算法:包括深度优先搜索(DFS)、广度优先搜索(BFS)等。

- 树算法:包括二叉树的遍历、平衡二叉树等。

2.3 相关数据结构应用考研数据结构代码还将涉及一些与数据结构相关的实际应用,如:- 图的最短路径算法在地图导航系统中的应用。

- 树的遍历算法在文件系统中的应用。

- 栈和队列在计算机程序调用栈中的应用。

3. 如何使用考研数据结构代码考研数据结构代码可以作为学习和练习数据结构的参考和工具。

考生可以通过以下几个步骤来使用考研数据结构代码:1. 了解基本数据结构的特点和操作。

2. 阅读考研数据结构代码的实现,理解其中的算法和数据结构设计。

数据结构完整代码

数据结构完整代码

(线性表顺序存储)#include"string.h"#include"ctype.h"#include"stdio.h"#include"stdlib.h"#include"io.h"#include"math.h"#include"time.h"#define OK1#define ERROR0#define TRUE1#define FALSE0#define MAXSIZE20/*存储空间初始分配量*/ typedef int Status;/*Status是函数的类型,其值是函数结果状态代码,如OK等*/typedef int ElemType;/*ElemType类型根据实际情况而定,这里假设为int*/Status visit(ElemType c){printf("%d",c);return OK;}typedef struct{ElemType data[MAXSIZE];/*数组,存储数据元素*/int length;/*线性表当前长度*/}SqList;/*初始化顺序线性表*/Status InitList(SqList*L){L->length=0;return OK;}/*初始条件:顺序线性表L已存在。

操作结果:若L为空表,则返回TRUE,否则返回FALSE*/Status ListEmpty(SqList L){if(L.length==0)return TRUE;elsereturn FALSE;}/*初始条件:顺序线性表L已存在。

操作结果:将L重置为空表*/Status ClearList(SqList*L){L->length=0;return OK;}/*初始条件:顺序线性表L已存在。

操作结果:返回L 中数据元素个数*/int ListLength(SqList L){return L.length;}/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)*/ /*操作结果:用e返回L中第i个数据元素的值,注意i 是指位置,第1个位置的数组是从0开始*/Status GetElem(SqList L,int i,ElemType*e){if(L.length==0||i<1||i>L.length)return ERROR;*e=L.data[i-1];return OK;}/*初始条件:顺序线性表L已存在*//*操作结果:返回L中第1个与e满足关系的数据元素的位序。

408计算机考研数据结构代码题

408计算机考研数据结构代码题

408计算机考研数据结构代码题1.前言在计算机考研中,数据结构是一个非常重要的科目,而其中对于代码题的要求更是严格。

本文将为大家介绍一些关于408计算机考研数据结构中的代码题,以帮助大家更好地应对考试。

2.题目一2.1题目描述给定一个长度为n的整数数组nu ms,找到一个最长连续子数组(至少包含一个数字),使得该连续子数组的和最大,返回其和。

2.2解题思路这道题目可以采用动态规划的思想进行解决。

我们可以定义一个数组d p,其中d p[i]表示以第i个元素结尾的最大连续子数组的和。

那么,d p[i]的取值可以由以下两种情况确定:-如果d p[i-1]大于0,说明以第i-1个元素结尾的最大连续子数组的和对dp[i]有贡献,那么dp[i]=dp[i-1]+nu ms[i];-如果d p[i-1]小于等于0,说明以第i-1个元素结尾的最大连续子数组的和对dp[i]无贡献,那么dp[i]=num s[i]。

通过遍历整个数组,我们可以获取到以每个元素结尾的最大连续子数组和,最后再取其中的最大值即可。

2.3代码实现p u bl ic in tm ax Su bAr r ay(i nt[]nu ms){i n tm ax Su m=nu ms[0];//记录最大和i n tc ur Su m=nu ms[0];//记录当前连续子数组的和f o r(in ti=1;i<n ums.le ng th;i++){i f(c ur Su m<=0){c u rS um=n um s[i];}e ls e{c u rS um+=nu ms[i];}m a xS um=M at h.ma x(m a xS um,c ur Su m);}r e tu rn ma xS um;}2.4复杂度分析-时间复杂度:O(n),其中n为数组的长度。

-空间复杂度:O(1),只使用了常数级别的额外空间。

3.题目二3.1题目描述给定两个字符串s和t,判断它们是否是同构的。

数据结构代码汇总

数据结构代码汇总

数据结构代码汇总数据结构代码汇总一、线性结构1.数组(Array):●定义和初始化数组●插入、删除元素●查找元素●数组的遍历●数组排序算法(如冒泡排序、快速排序)2.链表(Linked List):●单链表的定义和初始化●插入、删除节点●链表的遍历●双向链表的定义和初始化●插入、删除节点●双向链表的遍历●栈的定义和初始化●入栈、出栈操作●获取栈顶元素、判断栈是否为空●栈的应用(如括号匹配、逆波兰表达式求值)4.队列(Queue):●队列的定义和初始化●入队、出队操作●获取队头元素、判断队列是否为空●队列的应用(如循环队列、优先级队列)二、非线性结构1.树(Tree):●二叉树的定义和初始化●二叉树的遍历(前序、中序、后序)●二叉搜索树的实现和应用●平衡二叉树(AVL树)的实现和应用●哈夫曼树的实现和应用●图的存储结构(邻接矩阵、邻接表)●深度优先搜索(DFS)●广度优先搜索(BFS)●最小树算法(如Prim算法、Kruskal算法)●最短路径算法(如Dijkstra算法、Floyd算法)附件:本文档中所涉及的代码示例可以在附件中找到,包括各种数据结构的实现和相关算法。

法律名词及注释:1.数组:计算机科学中的一种数据结构,用于存储一系列相同类型的元素。

2.链表:一种动态数据结构,由一系列节点组成,每个节点包含一个数据元素和指向下一个节点的指针。

3.栈:一种特殊的线性数据结构,遵循先进后出(Last In First Out,LIFO)的原则。

4.队列:一种特殊的线性数据结构,遵循先进先出(First In First Out,FIFO)的原则。

5.二叉树:一种特殊的树形结构,每个节点最多有两个子节点。

6.图:由节点(顶点)和连接节点的边构成的数据结构,用于描述事物之间的关系。

考研《数据结构》考试大纲

考研《数据结构》考试大纲

理工大学2020年硕士学位研究生招生考试业务课考试大纲考试科目:数据结构代码:991考试的总体要求考查学生对数据的逻辑结构和物理结构的基本概念的掌握,对基本的数据结构和算法的掌握;考查学生利用基本数据结构和算法,使用C语言来解决实际科学和理论问题的思想和能力。

基本内容一、线性表1.线性表的概念及特点2.线性表的逻辑结构3.线性表的顺序及链式存储结构4.相关的各种基本运算二、栈和队列1.栈的概念、特点及存储结构2.栈的基本运算3.栈的应用4.队列的概念、特点及存储结构5.链队列、循环队列6.队列的应用及基本运算三、数组和广义表1.数组的顺序存储结构(二维及三维数组的元素地址计算)2.稀疏矩阵的压缩存储结构(三元组表、十字链表)四、树和二叉树1.二叉树的定义、性质及存储结构2.遍历二叉树和线索二叉树3.二叉树的应用五、图1.图的定义及存储结构(邻接矩阵表示和邻接表表示。

)2.图的遍历3.最小生成树4.拓扑排序六、查找1.静态表查找2.动态表查找(二叉排序树、平衡二叉树、B-树和B+树)3.哈希表的构造、哈希表的查找及分析、处理哈希冲突的方法七、内部排序1.插入排序、快速排序、选择排序、归并排序、基数排序等内部排序的特点与算法,各类排序方法的比较,时、空复杂度分析2.相关排序的应用考试题型:选择题(15%)、填空题(20%)、判断题(10%)、应用题(35%)、算法设计题(20%);其中算法设计题将着重考查学生使用C语言编程解决实际问题的能力,需要有一定的实际编程基础,而不是只会解书上的习题。

沈阳理工大学812数据结构2020年考研专业课初试大纲

沈阳理工大学812数据结构2020年考研专业课初试大纲

沈阳理工大学硕士研究生入学考试自命题考试大纲科目代码:812科目名称:数据结构适用专业:081200计算机科学与技术
一、考试基本内容
(一)绪论
(1)数据结构的基本概念和相关术语。

(2)数据的逻辑结构、存储结构。

(3)算法、算法的基本特性以及算法分析。

(二)线性表
(1)线性结构、线性表的定义,线性表的基本操作。

(2)线性表的顺序存储结构与链式存储结构(单链表、循环链表和双向链表)。

在两种存储结构上主要的操作算法(包括建立、插入和删除等)的实现。

(3)线性表的应用。

(三)栈与队列
(1)栈与队列的基本概念、基本操作。

(2)栈和队列的两种存储结构及基本操作算法的实现。

(3)栈和队列的应用。

(四)串
(1)串的基本概念、串的基本操作和存储结构。

(2)串的模式匹配算法的实现。

(五)数组和广义表
(1)数组的概念、多维数组的实现。

(2)特殊矩阵和稀疏矩阵的压缩存储
(3)广义表的基本概念
(六)树与二叉树
(1)树的概念、术语,树的存储结构。

(2)二叉树的概念、性质,二叉树的存储结构。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录线性表一、顺序存储1.顺序存储的静态分配2.顺序存储的动态分配3.顺序存储线性表的插入4.顺序存储线性表的删除二、链式存储5.链式存储线性表的结构6.头插法建立单链表7.尾插法建立单链表8.链式存储按序号查找结点9.链式存储按值查找结点10.链式存储插入结点11.链式存储删除结点12.双链表的结构13.双链表的插入14.双链表的删除15.静态链表的结构栈和队列一、顺序栈16.栈的结构17.判断栈空18.进栈19.出栈20.读取栈顶元素21.共享栈的结构22.共享栈的进栈二、链式栈23.链式栈的存储结构24.链式栈的进栈25.链式栈的出栈三、顺序队列26.队列的存储结构27.队列的入队28.队列的出队四、链式队列29.链式队列的存储结构30.链式队列的入队31.链式队列的出队五、栈的应用32.栈的应用:括号匹配34.栈的应用:求斐波那契数列的第n项树和二叉树一、树的存储结构35.树的双亲表示法36.树的孩子表示法37.孩子兄弟表示法38.二叉树的链式存储二、树的遍历39.二叉树的递归先序遍历40.二叉树的递归中序遍历41.二叉树的递归后序遍历42.二叉树的非递归先序遍历43.二叉树的非递归中序遍历44.二叉树的非递归后序遍历45.二叉树的层序遍历三、线索二叉树46.线索二叉树的结构47.中序遍历对二叉树线索化的递归算法48.遍历线索二叉树图一、图的存储结构49.图的邻接矩阵存储50.图的邻接表存储二、图的遍历51.图的广度优先搜索遍历(BFS)52.BFS应用:单源非带权图最短路径53.图的深度优先遍历(DFS)三、图的最小生成树54.求图的最小生成树(Prim算法)55.并查集:查找某个集合的根结点(Kruskal 算法用到)56.并查集:合并两个集合(Kruskal算法用到)57.求图的最小生成树:(Kruskal算法)克鲁斯卡尔四、图的最短路径58.图的最短路径算法(Dijkstra算法)迪杰斯特拉59.图的最短路径算法(Floyd算法)弗洛伊德查找60.折半查找61.二叉排序树查找关键字(递归)62.二叉排序树查找关键字(非递归)63.二叉排序树插入关键字64.二叉排序树构造代码排序65.直接插入排序66.希尔排序67.冒泡排序68.快速排序69.选择排序70.堆排序71.归并排序73.拓扑排序线性表一、顺序存储1.顺序存储的静态分配#define MaxSize 50//定义线性表的最大长度typedef int Elemtype//假定表中元素类型是inttypedef struct{ElemType data[MaxSize];//顺序表的元素(数组)int length ;//顺序表的当前长度2.顺序存储的动态分配typedef int Elemtypetypedef struct{ElemType *data ;//指示动态分配数组的指针int MaxSize , length ;//数组的最大容量和当前个数};/* c语言的动态分配语句*/#define InitSize 100SeqList L;L.data=(ElemType*)malloc(sizeof(ElemType) *InitSzie);3.顺序存储线性表的插入bool ListInset(Sqlist &L, int i , ElemType e){ if(i<1 || i>L.length+1) return false ;//判断i的范围是否有效if(L.length >= MaxSize) return false ;//当前存储空间已满,不能插入for(int j=L.length ; j>=i ; j--){//将第i个元素及之后的元素后移L.data[j]=L.data[j-1];}L.data[i-1] = e ;//在位置i处放入eL.length++ ; //线性表长度加1return true ;}4.顺序存储线性表的删除bool ListDelete(SqList &L , int i ,Elemtype &e){if(i<1 || i>=L.length) return false;//判断i的范围是否有效e = L.data[i];//将被删除的元素赋值给efor(int j=i ; j<=L.length ; j++){//将第i个位置之后的元素前移L.data[j]=L.data[j+1] ;}L.length--; //线性表长度减1return true ;}二、链式存储5.链式存储线性表的结构typedef struct LNode //定义单链表结点类型{ElemType data ;//数据域struct LNode *next; //指针域}LNode, *LinkList;6.头插法建立单链表LinkList CreatLinkList(LinkList &L){LNode *s ; //辅助指针int x ;L=(LinkList)malloc(sizeof(LNode)) ; //创建头结点L->next = NULL ;//初始为空链表scanf("%d" , &x) ;//输入结点的值while(x != 9999){//输入9999表示结束s= (LNode*)malloc(sizeof(LNode)); //创建新结点s->data = x ;s->next = L->next ;L->next = s ;//将新结点插入表中,L为头指针scanf("%d" , &x) ;//读入下一个结点值}return L;}7.尾插法建立单链表LinkList CreatLinkList(LinkList &L){int x ;L=(LinkList)malloc(sizeof(LNode));LNode *s , *r = L; //r为表尾指针指向表尾scanf("%d" , x) ; //输入结点的值while(x != 9999){//输入9999表示结束s=(LNode*)malloc(sizeof(LNode)) ;s->data = x ;r->next = s ;r= s ;//r指向新的表尾结点scanf("%d" , x) ;}r->next = NULL ;//尾结点指针置空return L;}8.链式存储按序号查找结点LNode * GetElem(LInkList L , int i){int j = 1;//计数,初始为1LNode *p = L->next ;//第一个结点指针赋给pif(i==0) return L ;//若i等于0,则返回头结点if(i<1) return NULL; //若i无效,则返回NULLwhile (p && j<i){ //从第1个结点开始找,查找第i个结点p=p->next ;j++;}return p; //返回第i个结点的指针,如果i大于表长,直接返回p即可}9.链式存储按值查找结点LNode * LocateElem(LinkList L, ElemType e){LNode *p = L->next;while(p!=NULL && p->data!=e){//从第1个结点开始查找data域为e的结点p = p->next ;}return p;//找到后返回该结点指针,否则返回NULL}10.链式存储插入结点算法思路: 1.取指向插入位置的前驱结点的指针① p=GetElem(L,i-1);2.令新结点*s的指针域指向*p的后继结点② s->next=p->next;3.令结点*p的指针域指向新插入的结点*s ③ p->next=s;bool LinkListInsert(LInkList &L , int i ,ElemType e){if( i<1 || i>=L.length) return false ;int j = 1;LNode *p = L->next , *s;s = (LNode*)malloc(sizeof(LNode));while (p && j<i-1){p=p->next ;j++;}s->next = p->next;p->next = s ;return true ;}11.链式存储删除结点算法思路: 1.取指向删除位置的前驱结点的指针p=GetElem(L,i-1);2.取指向删除位置的指针q=p->next;3.p指向结点的后继指向被删除结点的后继p->next=q->next4.释放删除结点free(q);bool LinkListDelete(LInkList &L , int i ,ElemType &e){if( i<1 || i>=L.length) return false ;int j = 1;LNode *p = L->next ,*q ;while (p && j<i-1){p=p->next ;j++;}q = p->next ;p->next = q->next;e = q->data;free(q) ;return true ;}12.双链表的结构typedef struct DNode //定义单链表结点类型{ElemType data ; //数据域struct DNode *prior ,*next ;//前驱和后继指针}DNode ,*DLinkList;13.双链表的插入bool DLinListInsert(DLInkList &L , int i ,ElemType e){if( i<1 || i>=L.length) return false ;int j = 1;DNode *p = L->next , *s;s = (DNode*)malloc(sizeof(DNode));while (p && j<i-1){p=p->next ;j++;}s->next = p->next;p->next->prior = s ;s->prior = p ;p->next = s;return true ;}14.双链表的删除bool DLinkListDelete(DLinkList &L , int i ,ElemType &e){if( i<1 || i>=L.length) return false ;int j = 1;DNode *p = L->next ,*q ;while (p && j<i-1){p=p->next ;j++;}q = p->next ;p ->next = q->next ;q ->next->prior = p;e = q->data;free(q) ;return true ;}15.静态链表的结构#define MaxSize 50 //静态链表的最大长度typedef int ElemType //静态链表的数据类型假定为inttypedef struct //静态链表结构类型的定义{ElemType data ; //数据域:存储数据元素int next ;//指针域:下一个元素的数组下标}SLinkList[MaxSize];栈和队列一、顺序栈16.栈的结构#define MaxSize 50 //定义栈中元素的最大个数typedef struct{ElemType data[MaxSize] ;//存放栈中元素int top ;//栈顶指针}SqStack; //顺序栈的简写17.判断栈空bool StackEmpty(SqStack S){if(s.top == -1) return true ;else return false ;}18.进栈bool Push(SqStack &S , ElemType x){if(S.top == MaxSize-1) return false ;S.data[++top] = x ;return true ;}19.出栈bool Pop(SqStack &S,ElemType &x) {if(S.top == -1) return false ;x = S.data[top--] ;return true ;}20.读取栈顶元素bool GetTop (SqStack &S,ElemType &x) { if(S.top == -1) return false ;x = S.data[top] ;return true ;}21.共享栈的结构#define MaxSize 100 //定义栈中元素的最大个数typedef struct{ElemType data[MaxSize] ;//存放栈中元素int top1 ;//栈1栈顶指针int top2 ;//栈2栈顶指针}SqDoubleStack; //顺序共享栈的简写22.共享栈的进栈bool Push(SqDoubleStack &S , ElemType x , int stackNum){if(S.top1+1 == S.top2) return false ; //栈满if(stackNum == 1) //栈1有元素进栈S.data[++top1] = x;else(stackNum == 2)//栈2有元素进栈S.data[--top2] = x;return true ;}二、链式栈23.链式栈的存储结构typedef struct SNode{ElemType data ;//存放栈中元素struct SNode *next ; //栈顶指针}SNode , *SLink; //链栈的结点typedef struct LinkStack{Slink top ; //栈顶指针int count ; //链栈结点数}LinkStack; //链栈24.链式栈的进栈bool Push(LinkStck &S, ElemType x){SLink p = (Slink)malloc(sizeof(SNode)) ; //给新元素分配空间p->data = x ;//新元素的值p->next = S->top ; //p的后继指向栈顶元素S->top = p ; //栈顶指针指向新的元素S->count++ ; //栈中元素个数加1return true ;}25.链式栈的出栈bool Pop(LinkStack *S , ElemType &x) { if(S->top == NULL) return false ;x = S->top->data ; //栈顶元素值Slink p = S->top ; //辅助指针S->top = S->top->next ; //栈顶指针后移free(p); //释放被删除数据的存储空间S->count-- ;//栈中元素个数减一return true ;}三、顺序队列26.队列的存储结构#define MaxSize 50//定义队列中元素的最大个数typedef struct{ElemType data[MaxSize] ;//存放队列元素int front ,rear ;//队头指针和队尾指针}SqQueue;27.队列的入队bool EnQueue(SqQueue &Q , ElemType x){ if((Q.rear+1)%MaxSize == Q.front ) return false ;//队满Q.data[Q.rear] = x;Q.rear = (Q.rear+1)%MaxSize ;return true ;}28.队列的出队bool DeQueue(SqQueue &Q ,ElemType &x){if(Q.front == Q.rear) return false ; //队空,报错x = Q.data[Q.front] ;Q.front = (Q.front+1)%MaxSize ;return true ;}四、链式队列29.链式队列的存储结构typedef struct //链式队列结点{ElemType data ;struct LinkNode *next ;}LinkNode;typedef struct //链式队列{LinkNode *front,*rear ; //队头和队尾指针}LinkQueue;30.链式队列的入队void EnQueue(LinkQueue &Q, ElemType x){ s=(LinkNode*)malloc(sizeof(LinkNode)) ;s->data = x ;s->next = NULL ;Q.rear->next = s ;Q.rear = s ;}31.链式队列的出队bool DeQueue(LinkQueue &Q , ElemType &x){if(Q.rear == Q.front ) return false ; //空队p = Q.front->next ;x = p->data ;Q.front->next = p->next ;if(Q.rear == p) //若原队列中只有一个结点,删除后变空Q.rear = Q.front ;free(p) ;return true ;}五、栈的应用32.栈的应用:括号匹配bool Check(char *str){Stack s ;InitStck(s) ;int len = strlen(str) ; //字符串长度为lenfor (int i = 0; i<len ; i++){char a = str[i] ;swith(a){case '(':case '[':case '{'Push(s,a) ;break ;case ')':if(Pop(s) != '(' ) return false ; //出栈顶。

相关文档
最新文档