本文为目录性质的导航页面,按照一定的话题组织
C语言「抄作业」之数据结构篇
- 数据结构(Data structure)
- 列表(List)
- 顺序表(Sequential list)
- 单向链表(Singly linked list)
- 循环单链表(Circular Singly linked list)
- 约瑟夫环(Josephus problem)
- 循环双链表(Circular doubly linked list)
- 栈(Stack)
- 链栈(Linked stack)
- 队列(Queue)
- 单链队列(Linked queue)
- 树(Tree)
- 二叉树(Binary tree)
- 二叉链表(Binary Linked List)
- 二叉树(Binary tree)
- 列表(List)
顺序表(Sequential list)
typedef struct {
lElemType *elem; /* 存储空间基址 */
int length; /* 当前长度 */
int listSize; /* 当前分配的存储容量,以sizeof(lElemType)为单位 */
} *seqList;
/*********************************** 顺序表基本操作(12个) ***********************************/
void initList (seqList L); /* 初始化 */
void destroyList (seqList L); /* 销毁 */
void clearList (seqList L); /* 清空 */
status listIsEmpty (seqList L); /* 判断顺序表是否为空 */
int listLength (seqList L); /* 获取顺序表的长度 */
status getElem (seqList L, int i, lElemType *e); /* 获取顺序表指定位序元素值 */
/* 寻找符合特征(compare)元素的位序 */
int locateElem (seqList L, lElemType e, status (*compare)(lElemType, lElemType));
status priorElem (seqList L, lElemType cur_e, lElemType *pre_e); /* 获取指定元素的前驱 */
status nextElem (seqList L, lElemType cur_e, lElemType *next_e); /* 获取指定元素的后继 */
status listInsertNode (seqList L, int i, lElemType e); /* 顺序表指定位置前插入新元素 */
status listDeleteNode (seqList L, int i, lElemType *e); /* 删除顺序表指定位置元素 */
void listTraverse (seqList L, void (*vi)(lElemType)); /* 依次对顺序表的每个元素调用函数vi() */
/********************************************************************************************/
status compare (lElemType des, lElemType src); /* compare函数,数据元素特征判定 */
void vi (lElemType e); /* visit函数,定义为打印元素值 */
/********************************************************************************************/
单向链表(Singly linked list)
/* 单向链表数据结构 */
typedef struct lNode {
lElemType data;
struct lNode *next;
} lNode, *linkList;
/***************************** 带头结点的单向链表基本操作(12个) *****************************/
void initList (linkList *L); /* 初始化 */
void destroyList (linkList L); /* 销毁 */
void clearList (linkList L); /* 清空 */
status listIsEmpty (linkList L); /* 判断单向链表是否为空 */
int listLength (linkList L); /* 获取单向链表的长度 */
status getElem (linkList L, int i, lElemType *e); /* 获取单向链表指定位序元素值 */
/* 寻找符合特征(compare)元素的位序 */
int locateElem (linkList L, lElemType e, status (*compare)(lElemType, lElemType));
status priorElem (linkList L, lElemType cur_e, lElemType *pre_e); /* 获取指定元素的前驱 */
status nextElem (linkList L, lElemType cur_e, lElemType *next_e); /* 获取指定元素的后继 */
status listInsertNode (linkList L, int i, lElemType e); /* 单向链表指定位置前插入新元素 */
status listDeleteNode (linkList L, int i, lElemType *e); /* 删除单向链表指定位置元素 */
void listTraverse (linkList L, void (*vi)(lElemType)); /* 依次对单向链表的每个元素调用函数vi() */
/********************************************************************************************/
status compare (lElemType des, lElemType src); /* compare函数,数据元素特征判定 */
void vi (lElemType e); /* visit函数,定义为打印元素值 */
/********************************************************************************************/
循环单链表(Circular Singly linked list)
/* 循环单链表数据结构 */
typedef struct lNode {
lElemType data;
struct lNode *next;
} lNode, *cirLinkList;
/**************************** 带头结点的循环单链表基本操作(12个) ****************************/
void initList (cirLinkList *L); /* 初始化 */
void destroyList (cirLinkList L); /* 销毁 */
void clearList (cirLinkList L); /* 清空 */
status listIsEmpty (cirLinkList L); /* 判断循环单链表是否为空 */
int listLength (cirLinkList L); /* 获取循环单链表的长度 */
status getElem (cirLinkList L, int i, lElemType *e); /* 获取循环单链表指定元素值 */
/* 寻找符合特征(compare)元素的位序 */
int locateElem (cirLinkList L, lElemType e, status (*compare)(lElemType, lElemType));
status priorElem (cirLinkList L, lElemType cur_e, lElemType *pre_e); /* 获取指定元素的前驱 */
status nextElem (cirLinkList L, lElemType cur_e, lElemType *next_e); /* 获取指定元素的后继 */
status listInsertNode (cirLinkList L, int i, lElemType e); /* 循环单链表指定位置前插入新元素 */
status listDeleteNode (cirLinkList L, int i, lElemType *e); /* 删除循环单链表指定位置元素 */
void listTraverse (cirLinkList L, void (*vi)(lElemType)); /* 依次对循环单链表的每个元素调用函数vi() */
/********************************************************************************************/
status compare (lElemType des, lElemType src); /* compare函数,数据元素特征判定 */
void vi (lElemType e); /* visit函数,定义为打印元素值 */
/********************************************************************************************/
循环双链表(Circular doubly linked list)
/* 循环双链表数据结构 */
typedef struct douLNode {
lElemType data;
struct douLNode *prior, *next;
} douLNode, *cirDouLinkList;
/**************************** 带头结点的循环双链表基本操作(12个) ****************************/
void initList (cirDouLinkList *L); /* 初始化 */
void destroyList (cirDouLinkList L); /* 销毁 */
void clearList (cirDouLinkList L); /* 清空 */
status listIsEmpty (cirDouLinkList L); /* 判断循环双链表是否为空 */
int listLength (cirDouLinkList L); /* 获取循环双链表的长度 */
status getElem (cirDouLinkList L, int i, lElemType *e); /* 获取循环双链表指定元素值 */
/* 寻找符合特征(compare)元素的位序 */
int locateElem (cirDouLinkList L, lElemType e, status (*compare)(lElemType, lElemType));
status priorElem (cirDouLinkList L, lElemType cur_e, lElemType *pre_e); /* 获取指定元素的前驱 */
status nextElem (cirDouLinkList L, lElemType cur_e, lElemType *next_e); /* 获取指定元素的后继 */
status listInsertNode (cirDouLinkList L, int i, lElemType e); /* 循环双链表指定位置前插入新元素 */
status listDeleteNode (cirDouLinkList L, int i, lElemType *e); /* 删除循环双链表指定位置元素 */
void listTraverse (cirDouLinkList L, void (*vi)(lElemType)); /* 依次对循环双链表的每个元素调用函数vi() */
/********************************************************************************************/
status compare (lElemType des, lElemType src); /* compare函数,数据元素特征判定 */
void vi (lElemType e); /* visit函数,定义为打印元素值 */
/********************************************************************************************/
链栈(Linked stack)
/* 链栈结点数据结构 */
typedef struct sNode {
sElemType data;
struct sNode *next;
} sNode, *sNodePtr;
/* 链栈数据结构 */
typedef struct linkStk{
sNodePtr top; /* 栈顶指针 */
} linkStk, *linkStack;
/******************************* 带头结点的链栈基本操作(9个) ********************************/
void initStack (linkStack *S); /* 初始化 */
void destroyStack (linkStack S); /* 销毁 */
void clearStack (linkStack S); /* 清空 */
status stackIsEmpty (linkStack S); /* 判断链栈是否为空 */
int stackLength (linkStack S); /* 获取链栈的长度 */
status getTopElem (linkStack S, sElemType *e); /* 获取栈顶元素值 */
status push (linkStack S, sElemType e); /* 入栈 */
status pop (linkStack S, sElemType *e); /* 出栈 */
void stackTraverse (linkStack S, void (*vi)(sElemType)); /* 依次对链栈的每个元素调用函数vi() */
/********************************************************************************************/
void vi (sElemType e); /* visit函数,定义为打印元素值 */
/********************************************************************************************/
单链队列(Linked queue)
/* 单链队列结点数据结构 */
typedef struct qNode {
qElemType data;
struct qNode *next;
} qNode, *qNodePtr;
/* 单链队列数据结构 */
typedef struct linkQue {
qNodePtr front; /* 队首指针 */
qNodePtr rear; /* 队尾指针 */
} linkQue, *linkQueue;
/****************************** 带头结点的单链队列基本操作(9个) *****************************/
void initQueue (linkQueue *Q); /* 初始化 */
void destroyQueue (linkQueue Q); /* 销毁 */
void clearQueue (linkQueue Q); /* 清空 */
status queueIsEmpty (linkQueue Q); /* 判断单链队列是否为空 */
int queueLength (linkQueue Q); /* 获取单链队列的长度 */
status getHeadElem (linkQueue Q, qElemType *e); /* 获取队首元素值 */
status enQueue (linkQueue Q, qElemType e); /* 入队 */
status deQueue (linkQueue Q, qElemType *e); /* 出队 */
void queueTraverse (linkQueue Q, void (*vi)(qElemType)); /* 依次对单链队列的每个元素调用函数vi() */
/********************************************************************************************/
void vi (qElemType e); /* visit函数,定义为打印元素值 */
/********************************************************************************************/
二叉链表(Binary Linked List)
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define biTElemType char /* 二叉链表元素数据类型 */
#define BITNODE_SIZE sizeof (struct biTNode) /* 二叉链表结点空间大小 */
#define status int /* 状态型变量 */
#define OVERFLOW -1 /* 内存溢出状态码 */
#define ERROR 0 /* 错误状态码 */
#define OK 1 /* 正确状态码 */
#define Nil '#' /* 空结点 */
/* 二叉树的二叉链表数据结构 */
typedef struct biTNode {
biTElemType data;
struct biTNode *lchild, *rchild;
} biTNode, *linkBiTree;
/****************************** 二叉树的二叉链表基本操作(22个) ******************************/
void initBiTree (linkBiTree *T); /* 初始化二叉树 */
void destroyBiTree (linkBiTree *T); /* 销毁二叉树 */
void clearBiTree (linkBiTree *T); /* 清空二叉树 */
void createBiTree (linkBiTree *T); /* 先序构造二叉树 */
status biTreeIsEmpty (linkBiTree T); /* 判断二叉树是否为空 */
int biTreeDepth (linkBiTree T); /* 获取二叉树的深度 */
status getRootElem (linkBiTree T, biTElemType *e); /* 获取二叉树根元素值 */
linkBiTree pointElem (linkBiTree T, biTElemType e); /* 寻找指定元素的地址 */
status parentElem (linkBiTree T, biTElemType cur_e, biTElemType *parent_e); /* 获取指定元素的父结点元素值 */
status leftChildElem (linkBiTree T, biTElemType cur_e, biTElemType *lchild_e); /* 获取指定元素的左孩子元素值 */
status rightChildElem (linkBiTree T, biTElemType cur_e, biTElemType *rchild_e); /* 获取指定元素的右孩子元素值 */
status leftSiblingElem (linkBiTree T, biTElemType cur_e, biTElemType *lsibling_e); /* 获取指定元素的左兄弟元素值 */
status rightSiblingElem (linkBiTree T, biTElemType cur_e, biTElemType *rsibling_e); /* 获取指定元素的右兄弟元素值 */
status biTreeInsertChild (linkBiTree p, int LR, linkBiTree s); /* 二叉树指定结点插入新子树 */
status biTreeDeleteChild (linkBiTree p, int LR); /* 删除二叉树指定结点子树 */
void preOrderTraverse (linkBiTree T, void (*vi)(biTElemType)); /* 先序遍历二叉树的每个元素调用函数vi() */
void inOrderTraverse (linkBiTree T, void (*vi)(biTElemType)); /* 中序遍历二叉树的每个元素调用函数vi() */
void postOrderTraverse (linkBiTree T, void (*vi)(biTElemType)); /* 后序遍历二叉树的每个元素调用函数vi() */
void levelOrderTraverse (linkBiTree T, void (*vi)(biTElemType)); /* 层次遍历(利用队列)二叉树的每个元素调用函数vi() */
void iterativePreOrderTraverse (linkBiTree T, void (*vi)(biTElemType)); /* 前序遍历(利用栈)二叉树的每个元素调用函数vi() */
void iterativeInOrderTraverse (linkBiTree T, void (*vi)(biTElemType)); /* 中序遍历(利用栈)二叉树的每个元素调用函数vi() */
void iterativePostOrderTraverse (linkBiTree T, void (*vi)(biTElemType));/* 后序遍历(利用栈)二叉树的每个元素调用函数vi() */
/********************************************************************************************/
void vi (biTElemType e); /* visit函数,定义为打印元素值 */
/********************************************************************************************/
C语言抄作业系列,只有答案,没有讲解!
计算机科学专业毕业多年的一个啥也没学会而转行做了产品经理的家伙,从当年的各种作业里搬运来的一些乱七八糟的东西。
C语言「抄作业」www.zhihu.com