常考基础必知必会
A. 排序: 排序有几种,各种排序的比较,哪些排序是稳定的,快排的算法;
B. 查找:哈希查找、二叉树查找、折半查找的对比,哈希映射和哈希表的区别?
C. 链表和数组的区别,在什么情况下用链表什么情况下用数组?
D. 栈和队列的区别?
E. 多态,举例说明;overload 和 override 的区别?
F. 字符串有关的函数,比如让你写一个拷贝字符串的函数啊,或者字符串反转啊什么
的。strcpy 和 memcpy?
G. 继承、多继承?
H. 面向对象有什么好处?
I. 说说 static 的与众不同之处,如果一个变量被声明为 static,它会被分配在哪里?在什
么时候分配空间等?
J. 什么是虚函数、纯虚函数、虚的析构函数,用途?
K. 内存泄漏及解决方法?
网络部分:
OSI 模型 7 层结构,TCP/IP 模型结构?
B. TCP/UDP 区别?
C. TCP 建立连接的步骤?
D. 香农定理?
二叉树三种遍历的非递归算法(背诵版)
1.先序遍历非递归算法
#define maxsize 100
typedef struct
{
Bitree Elem[maxsize];
int top;
}SqStack;
void PreOrderUnrec(Bitree t)
{
SqStack s;
StackInit(s);
p=t;
while (p!=null || !StackEmpty(s))
{
while (p!=null)
//遍历左子树
{
visite(p->data);
push(s,p);
p=p->lchild;
}//endwhile
if (!StackEmpty(s))
//通过下一次循环中的内嵌 while 实现右子树遍历
{
p=pop(s);
p=p->rchild;
}//endif
}//endwhile
}//PreOrderUnrec
2.中序遍历非递归算法
#define maxsize 100
typedef struct
{
Bitree Elem[maxsize];
int top;
}SqStack;
void InOrderUnrec(Bitree t)
{
SqStack s;
StackInit(s);
p=t;
while (p!=null || !StackEmpty(s))
{
while (p!=null)
//遍历左子树
{
push(s,p);
p=p->lchild;
}//endwhile
if (!StackEmpty(s))
{
p=pop(s);
visite(p->data);
//访问根结点
p=p->rchild;
//通过下一次循环实现右子树遍历
}//endif
}//endwhile
}//InOrderUnrec
3.后序遍历非递归算法
#define maxsize 100
typedef enum{L,R} tagtype;
typedef struct
{
Bitree ptr;
tagtype tag;
}stacknode;
typedef struct
{
stacknode Elem[maxsize];
int top;
}SqStack;
//后序遍历
void PostOrderUnrec(Bitree t)
{
SqStack s;
stacknode x;
StackInit(s);
p=t;
do
{
while (p!=null)
//遍历左子树
{
}
x.ptr = p;
x.tag = L;
//标记为左子树
push(s,x);
p=p->lchild;
while (!StackEmpty(s) &&s.Elem[s.top].tag==R)
{
}
x = pop(s);
p = x.ptr;
visite(p->data);
//tag 为 R,表示右子树访问完毕,故访问根结点
if (!StackEmpty(s))
{
}
s.Elem[s.top].tag =R;
//遍历右子树
p=s.Elem[s.top].ptr->rchild;
}while (!StackEmpty(s));
}//PostOrderUnrec
3.后序遍历非递归算法
#define maxsize 100
typedef enum{L,R} tagtype;
typedef struct
{
Bitree ptr;
tagtype tag;
}stacknode;
typedef struct
{
stacknode Elem[maxsize];
int top;
}SqStack;
//后序遍历
void PostOrderUnrec(Bitree t)
{
SqStack s;
stacknode x;
StackInit(s);
p=t;
do
{
while (p!=null)
//遍历左子树
{
}
x.ptr = p;
x.tag = L;
//标记为左子树
push(s,x);
p=p->lchild;
while (!StackEmpty(s) &&s.Elem[s.top].tag==R)
{
}
x = pop(s);
p = x.ptr;
visite(p->data);
//tag 为 R,表示右子树访问完毕,故访问根结点
if (!StackEmpty(s))
{
}
s.Elem[s.top].tag =R;
//遍历右子树
p=s.Elem[s.top].ptr->rchild;
}while (!StackEmpty(s));
}//PostOrderUnrec
2、线性表
(1) 性表的链式存储方式及以下几种常用链表的特点和运算:单链表、循环链表,双向
链表,双向循环链表。
(2)单链表的归并算法、循环链表的归并算法、双向链表及双向循环链表的插入和删除
算法等都是较为常见的考查方式。
(3)单链表中设置头指针、循环链表中设置尾指针而不设置头指针以及索引存储结构的
各自好处。
3、栈与队列