数据结构的基本框架及基础操作
索引:
1、线性表
2、堆栈
3、队列
4、堆栈与队列的联合运用
5、树
一、线性表
线性表
(一)顺序存储(从下标0开始储存)
(一)顺序存储
1、结构定义:
结构定义
typedef struct lnode *ptrl; // 定义指向结构体lnode的指针类型ptrl |
2、基础操作集
基础操作集
①初始化函数(list init()):
list init() // 初始化列表 |
②查找(element find(list l, element x)):
element find(list l, element x) // 查找元素 x 在列表中的位置 |
③插入(int insert(list l, element x, int i)):
int insert(list l, element x, int i) // 在位置 i 插入元素 x |
④删除(element deletel(list l, int i)):
element deletel(list l, int i) // 删除位置 i 的元素 |
3、示例代码:
示例代码
|
(二)链式存储(带头结点)
(二)链式存储
1、结构定义:
结构定义
typedef struct lnode *ptrl; // 定义指向 lnode 结构体的指针类型 ptrl |
2、基础操作集
基础操作集
①初始化函数(list init()):
list init() |
②判断列表是否为空(int isempty(list l)):
int isempty(list l) |
③获取列表长度(int length(list l)):
int length(list l) |
④按值查找节点(list findx(list l, element x)):
list findx(list l, element x) |
⑤按序号查找节点值(element findp(list l, int k)):
element findp(list l, int k) |
⑥在位置 i 插入元素 x(int insert(list l, element x, int i)):
int insert(list l, element x, int i) |
⑦删除位置 i 的元素(int deletel(list l, int i)):
int deletel(list l, int i) |
3、示例代码:
示例代码
|
(三)题目运用示例(非PTA):
题目运用示例
作者 幻梦
单位 无
有两组按升序排序的数据,请将这两组数据按升序合并成一组
输入格式:
输入第1行为n,m,分别表示两组数据的个数;
第2行给出n个整数,以升序排列;
第2行给出m个整数,以升序排列;
输出格式:
按升序输出合并后的一组数据
输入样例:
5 6 |
输出样例:
0 1 2 3 4 5 6 7 8 9 10 |
答案示例:
|
二、堆栈(顺式)
堆栈
1、结构定义:
结构定义
typedef struct snode *ptrs; // 定义指向 snode 结构体的指针类型 ptrs |
2、基础操作集
基础操作集
①创建栈(stack creats(int max)):
stack creatS(int max) // 创建一个新的顺序栈,参数为栈的最大容量 |
②入栈操作(void push(stack s, element x)):
void push(stack s, element x) // 入栈操作 |
③出栈操作(element pop(stack s)):
element pop(stack s) // 出栈操作 |
④检查栈是否为空(int isempty(stack s)):
int isempty(stack s) // 检查栈是否为空 |
⑤检查栈是否已满(int isfull(stack s)):
int isfull(stack s) // 检查栈是否已满 |
3、示例代码:
示例代码
|
4、题目运用示例(PTA):
题目运用示例
7-3 有趣的括号
作者 Drizzle
单位 山东科技大学
括号()的组合千奇百怪,Drizzle 想知道各种组合的括号可以是否合法
合法要求:每个同类型的左括号必须有与之对应的同类的右括号以正确的顺序闭合
要求:
输入:输入一个括号字符串
输出:输出是否合法,是则True,否则False
示例:
输入:
(){}[] |
输出:
True |
范围:
对于 100% 的数据:括号字符串长度 ≤ 100
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
栈限制:8192 KB
答案示例:
|
三、队列(顺式&循环队列):
队列
1、结构定义:
结构定义
typedef struct qnode *ptrq; // 定义指向 qnode 结构体的指针类型 ptrq |
2、基础操作集:
基础操作集
①创建队列(queue creat(int max)):
queue creatQ(int max) // 创建一个新的队列,参数为队列的最大容量 |
②入队操作(void add(queue q, element x)):
void add(queue q, element x) // 将元素 x 入队 |
③出队操作(element deleteq(queue q)):
element deleteq(queue q) // 从队列中删除一个元素 |
④检查队列是否已满(int isfull(queue q)):
int isfull(queue q) // 检查队列是否已满 |
⑤检查队列是否为空(int isempty(queue q)):
int isempty(queue q) // 检查队列是否为空 |
3、示例代码:
示例代码
|
4、题目运用示例(PTA):
题目运用示例
7-2 队的基本操作
作者 唐艳琴
单位 中国人民解放军陆军工程大学
给定一个初始为空的队(队存储空间长度为10)和一系列进队、出队操作,请编写程序输出经过这些操作后队中的元素。队中元素值均为整数。(采用循环队列完成,禁用一个空间方法)
输入格式:
输入第1行为1个正整数n,表示操作个数;
第2行为给出的n个整数,非0元素表示进队,且此非0值即为进队元素,0元素表示出队。
输出格式:
第一行按出队顺序输出所有出队元素,以一个空格隔开;如果队空时做出队操作会输出”EMPTY”,如果队满时做进队操作会输出”FULL”。
第二行中输出队中所有元素,以一个空格隔开。
末尾均有一个空格。
输入样例:
12 |
输出样例:
3 1 2 -1 EMPTY 4 |
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
栈限制:8192 KB
答案示例:
|
四、堆栈与队列的联合运用
堆栈与队列的联合运用
作者 幻梦
单位 无
题目:
给定一个递增数列,利用堆栈和队列,分别将其中的奇数按降序输出,其中的偶数按增序输出。
输入格式:
输入第1行为1个正整数n,表示数列长度;
第2行为给出的长度为n个整数的递增数列。
输出格式:
第1行按降序输出数列中的所有奇数;
第2行按增序输出数列中的所有偶数;
输入样例:
11 |
输出样例:
17 13 7 5 3 |
答案示例:
|
五、二叉树
二叉树
(一)普通二叉树的创建
5.1普通二叉树的创建
1、结构定义:
5.1.1结构定义
typedef struct tnode *ptrt; |
2、三种创建方法
三种创建方法
(1)先序遍历+数组创建
先序遍历+数组创建
①函数定义:
void creatT(bintree &T) |
②示例代码(输出所有节点):
输入样例:
1 3 5 0 0 8 0 0 2 0 0 |
输出样例:
1 3 5 8 2 |
代码:
// 先序遍历创建树 |
(2)先序遍历+中序遍历
先序遍历+中序遍历
①函数定义:
// 创建二叉树函数,参数为前序遍历数组、中序遍历数组和数组大小 |
②示例代码(输出其后序遍历):
输入样例:
9 |
输出样例:
FHIGDEBCA |
代码
|
(3)层序遍历
层序遍历
①函数定义:
创建节点(bintree creatT(element x) ):
// 创建二叉树节点 |
创建二叉树(bintree buildTree(element arr[], int size)):
// 根据层序遍历序列构建完全二叉树 |
②示例代码
输入样例:
8 |
输出样例:
91 71 34 18 10 2 15 55 |
代码
|
(二)平衡二叉树
平衡二叉树
(1)基础操作集:
基础操作集
①创建新节点(avlt newNode(int val)):
avlt newNode(int val){ |
②获取树的高度(int getHeight(avlt node)):
int getHeight(avlt node) { |
③辅助函数(int max(int a, int b)):
int max(int a, int b) { |
④获取平衡因子(int getBalance(avlt node)):
int getBalance(avlt node) { |
⑤先序遍历(void preOrder(avlt root)):
void preOrder(avlt root){ |
⑥中序遍历(void midOrder(avlt root)):
void midOrder(avlt root) { |
⑦查找(avlt find(avlt root, int key, int* counter)):
avlt find(avlt root, int key, int* counter){ |
⑧左旋函数(void preOrder(avlt root)):
avlt leftRoate(avlt root){ |
⑨右旋函数(void preOrder(avlt root)):
avlt rightRotate(avlt root){ |
⑩插入结点(avlt insertNode(avlt node, int key)):
avlt insertNode(avlt node, int key){ |
⑪删除结点(avlt deleteNode(avlt node,int key)):
avlt deleteNode(avlt node,int key) |
(2)完整代码示例:
完整代码示例
代码:
|
(三)哈夫曼树
哈夫曼树
(1)基础操作集:
基础操作集
①查找最小的权重(void select(htree ht,int x,int m1,int m2)):
// 选择赫夫曼树中权重最小的两个节点 |
②创建哈夫曼树(void creath(htree ht,int n)):
// 创建赫夫曼树 |
③编码(void hcode(htree ht,char hc,int n)):**
// 生成赫夫曼编码 |
④先序打印(void printh(htree ht,char hc,int index)):**
// 打印赫夫曼树 |
⑤破译编码内容(void search(htree ht,int n,char *pwd)):
// 解析输入的赫夫曼编码并打印出对应的字符 |
(2)完整代码示例:
完整代码示例
输入样例:
5 |
输出样例:
a:0 |
代码:
|





