电子科大计算机考研免费提供  群号:367060756                          ——by HarvestWu 
 
数据结构算法汇总 
目录 
专题一 线性表 ..............................................................................................................................................1 
1.线性表基本操作 ..............................................................................................................................1 
2.顺序表 ................................................................................................................................................2 
3.链表 ....................................................................................................................................................2 
4.线性表应用 .......................................................................................................................................2 
专题二 栈 ......................................................................................................................................................6 
1.栈基本操作 .......................................................................................................................................6 
2.顺序栈 ................................................................................................................................................6 
3.链栈 ....................................................................................................................................................6 
专题三 队列 ..................................................................................................................................................7 
1.队列基本操作 ...................................................................................................................................7 
2.顺序队列 ...........................................................................................................................................7 
3.链式队列 ...........................................................................................................................................7 
专题四 树 ......................................................................................................................................................7 
1.树.........................................................................................................................................................7 
2.二叉树 ................................................................................................................................................8 
3.线索二叉树 .................................................................................................................................... 10 
4.二叉排序树 .................................................................................................................................... 13 
5.二叉树应用 .................................................................................................................................... 14 
专题五 广义表 ........................................................................................................................................... 25 
专题六 图 ................................................................................................................................................... 26 
1.图的存储结构 ................................................................................................................................ 26 
2.邻接表相关 .................................................................................................................................... 26 
专题七 排序与查找 .................................................................................................................................. 27 
 
 
专题一 线性表 
1.线性表基本操作 
 
 
InitList(&L) 
 
Length(L)   
 
 
LocateElem(L, e) 
 
GetElem(L, i) 
 
ListInsert(&L, i, e) 
ListDelete(&L, i, &e) 
 
 
 
 
 
 
//初始化表 
//求表长 
//按值查找操作 
//按位查找操作 
//插入操作 
//删除操作 
 
电子科大计算机考研免费提供  群号:367060756                          ——by HarvestWu 
 
 
PrintList(L) 
Empty(L) 
 
 
DestroyList(&L)  
 
 
 
 
 
 
//输出操作 
//判空操作 
//销毁操作 
2.顺序表 
ElemType data[MaxSize]; 
int length; 
//静态分配 
#define MaxSize 50 
typedef struct{ 
 
 
}SqList; 
//动态分配 
#define InitSize 100 
typedef struct{ 
 
 
}SeqList; 
//动态分配语句: 
L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize); 
ElemType *data; 
int MaxSize, length; 
3.链表 
ElemType data; 
struct LNode *next; 
ElemType data; 
struct DNode *prior, *next; 
//单链表: 
typedef struct LNode{ 
 
 
}LNode, *LinkList; 
//双链表: 
typedef struct DNode{ 
 
 
}DNode, *DLinklist; 
//静态链表: 
#define MaxSize 50 
typedef struct{ 
 
 
}SLinkList[MaxSize]; 
ElemType data; 
int next; 
4.线性表应用 
1.删除不带头结点单链表 L 中所有值为 x 结点  
 
电子科大计算机考研免费提供  群号:367060756                          ——by HarvestWu 
 
 
 
//用于指向待删除结点 
//递归出口 
//若L所指结点值为x 
//L指向下一结点 
 
 
return; 
void Delete_x(LinkList &L, int x){ 
 
 
 
 
 
 
 
 
 
 
} 
LinkList p;  
 
if (L == NULL)   
 
if (L->data==x){ 
 
 
 
 
} 
else Delete_x(L->next, x); 
p = L; 
L = L->next; 
free(p); 
Delete_x(L, x); 
 
 
 
 
2.删除带头结点单链表 L 中所有值为 x 结点  
法一:设置前驱指针,扫描 
q = p; 
p = p->next; 
pre->next = p; 
free(q); 
void Delete_x(LinkList &L, int x){ 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
} 
LinkList pre, p, q; 
pre = L;p = L->next; 
while (p!=NULL){ 
 
 
 
 
 
 
 
 
 
 
} 
if (p->data == x){ 
 
 
 
 
} 
else {  
 
 
} 
pre = p;  
p = p->next; 
法二:尾插法建立单链表 
void Delete_x1(LinkList &L, int x){ 
 
 
 
 
 
 
 
 
 
 
 
 
LinkList p, r, q; 
p = L->next;r = L;  
while (p != NULL){ 
 
 
 
 
 
 
 
 
 
if (p->data != x){ 
 
 
 
} 
else { 
 
 
 
r->next = p; 
r = p; 
p = p->next; 
q = p; 
p = p->next; 
free(q); 
 
电子科大计算机考研免费提供  群号:367060756                          ——by HarvestWu 
 
} 
 
} 
r->next = NULL; 
 
 
 
} 
3.反向输出带头结点单链表 L 中所有结点值 
void R_Print(LinkList L){ 
 
if (L->next != NULL){ 
R_Print(L->next); 
 
 
 
 
cout << L->next->data << " "; 
 
} 
} 
4.删除带头结点单链表 L 中最小值结点 
 
//p为工作指针,pre指向其前驱 
void Delete_min(LinkList &L){ 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
} 
LinkList p, pre; 
LinkList minP, minPre;  //minP指向候选最小值,minPre指向其前驱 
p = minP = L->next; 
pre = minPre = L; 
while (p!=NULL){ 
 
 
 
 
 
 
} 
minPre->next = minP->next;//删除最小值结点   
free(minP); 
if (p->datadata){ 
 
 
} 
pre = p; 
p = p->next; 
minP = p; 
minPre = pre; 
5.就地逆置带头结点单链表 L 
法一:头插法 
void Reverse_L(LinkList &L){ 
 
 
 
 
 
 
 
 
 
} 
LinkList p, q; 
p = L->next; 
L->next = NULL; 
while (p!=NULL){ 
 
 
 
 
} 
q = p; 
p = p->next; 
q->next = L->next; 
L->next = q; 
法二:指针反转 
void Reverse_L(LinkList L){ 
 
LinkList pre, p, r; 
 
电子科大计算机考研免费提供  群号:367060756                          ——by HarvestWu 
 
p = L->next; 
r = p->next; 
p->next = NULL; 
while (r != NULL){ 
 
 
 
 
} 
L->next = p; 
 
pre = p; 
p = r; 
r = r->next; 
p->next = pre;  //指针反转 
//表头指向最后结点 
 
 
 
 
 
 
 
 
 
 
} 
6.带头结点单链表 L 升序排列 
//开始插入排序 
//r指向p后继结点,保证不断链 
//构造只含一个结点的链表 
直接插入排序 
void sort(LinkList &L){ 
LinkList pre, p, r; 
 
p = L->next; 
 
 
 
r = p->next; 
p->next = NULL;  
 
p = r; 
 
 
while (p!=NULL){ 
r = p->next; 
 
 
pre = L; 
 
 
 
 
//从表头开始扫描p的插入位置 
while (pre->next != NULL&&pre->next->data < p->data) 
 
 
 
 
 
p->next = pre->next;//将p结点插入pre后 
 
 
 
 
pre->next = p; 
 
 
p = r; 
 
} 
} 
pre = pre->next; 
7.删除带头结点单链表 L 中介于给定的两个值之间元素 
//p为工作指针,pre指向其前驱 
void RangeDelete(LinkList &L,int min,int max){ 
 
 
 
 
 
 
 
 
 
 
 
 
if (min < p->data&&p->data < max){ 
 
 
 
} 
else{ 
 
 
} 
LinkList p, pre; 
p = L->next;pre = L; 
while (p!=NULL){ 
 
 
 
 
 
 
 
 
 
pre->next = p->next; 
free(p); 
p = pre->next; 
pre = p; 
p = p->next; 
 
电子科大计算机考研免费提供  群号:367060756                          ——by HarvestWu 
 
} 
 
} 
专题二 栈 
1.栈基本操作 
 
InitStack(&S) 
 
StackEmpty(S) 
 
Push(&S, x)  
 
Pop(&S, &x)  
 
GetTop(S, &x) 
ClearStack(&S)   
 
 
 
 
 
 
 
 
 
 
 
 
//初始化操作 
//判空操作 
//进栈操作 
//出栈操作 
//读栈顶元素 
//销毁操作 
2.顺序栈 
ElemType data[MaxSize]; 
int top; 
#define MaxSize 50 
typedef struct{ 
 
 
}SqStack; 
//栈顶指针:初始时设置S.top = -1 
//栈顶元素:S.data[S.top] 
//进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素 
//出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针减1 
//栈空条件:S.top == -1 
//栈满条件:S.top == MaxSize – 1 
//栈长:S.top + 1 
3.链栈 
typedef struct SNode{ 
 
 
}SNode, *LiStack; 
ElemType data; 
struct SNode *next; 
 
电子科大计算机考研免费提供  群号:367060756                          ——by HarvestWu 
 
专题三 队列 
1.队列基本操作 
InitQueue(&Q) 
 
QueueEmpty(Q) 
 
EnQueue(&Q, x)   
DeQueue(&Q, &x)  
GetHead(Q, &x)   
 
 
 
 
 
 
 
 
 
 
//初始化操作 
//判空操作 
//入队操作 
//出队操作 
//读队头元素 
2.顺序队列 
ElemType data[MaxSize]; 
int front, rear; 
#define MaxSize 50 
typedef struct{ 
 
 
}SqQueue; 
//初始条件:Q.front = Q.rear = 0 
//队空条件:Q.front == Q.rear 
//进队操作:队不满时,++Q.rear;Q.data[Q.rear] = x; 
//出队操作:队不空时,++Q.front;x = Q.data[Q.front]; 
3.链式队列 
ElemType data; 
struct QNode *next; 
typedef struct QNode{//链式队列结点 
 
 
}QNode; 
typedef struct{ //链式队列 
 
}LiQueue; 
//当 Q.front == NULL 且 Q.rear == NULL 时,链式队列为空。 
QNode *front, *rear; 
专题四 树 
1.树 
1.树存储结构 
1.树双亲存储结构   
#define MAX_TREE_SIZE 100 
 
电子科大计算机考研免费提供  群号:367060756                          ——by HarvestWu 
 
ElemType data; 
int parent; 
typedef struct{ 
 
 
}PTNode; 
typedef struct{ 
 
 
}PTree; 
PTNode nodes[MAX_TREE_SIZE]; 
int n; 
2.树孩子兄弟存储结构   
typedef struct CSNode{ 
 
 
}CSNode,*CSTree; 
ElemType data; 
struct CSNode *firstchild,*nextsibling; 
2.二叉树 
1.二叉树链式存储结构  
#define ElemType int 
#define MaxSize 1000 
typedef struct BiTNode{ 
 
 
}BiTNode,*BiTree; 
ElemType data;   
 
struct BiTNode *lchild, *rchild; 
 
 
 
//数据域 
//左、右孩子指针 
2.二叉树的遍历  
1.递归先序遍历  
void PreOrder(BiTree T){ 
 
 
 
 
 
} 
if (T != NULL){ 
 
 
 
} 
visit(T);   
 
PreOrder(T->lchild); 
PreOrder(T->rchild); 
 
2.非递归先序遍历 
//访问结点 
//递归遍历左子树 
//递归遍历右子树 
 
 
void PreOrder(BiTree T){ 
 
 
 
 
 
 
 
 
 
 
InitStack(S); BiTree p = T;  
if (p != NULL)   
 
{ 
 
 
 
 
 
 
 
Push(S, p);  
 
while (!IsEmpty(S))  
{ 
 
 
 
 
 
 
 
 
 
//初始化栈;p是遍历指针 
//p不空继续执行 
//指针进栈 
//栈不空时循环 
 
 
Pop(S, p);   
visit(p); 
 
if (p->rchild != NULL)  //右子树不为空 
 
Push(S,p->rchild);  //右子树进栈 
//指针退栈 
//访问结点