考研数据结构
https://blog.csdn.net/HB15458755/article/details/102726035
https://blog.csdn.net/out_of_memory_error/article/details/102332332
第一部分《线性表》
全文中使用的线性表和链表都是基于以下两种定义方式:
不过个人习惯用数组表示线性表,写出来再将每一部分换成线性表更快
#define MaxSize 100
//定义线性表
typedef int ElemType;
typedef struct SqList{
ElemType data[MaxSize];
int length;
}SqList;
//建立一个线性表
void Creat(SqList* &L,ElemType a[],int n){
int i=0,j=0;
L=(SqList*)malloc(sizeof(SqList));//这句话记住就行
while(i<n){
L->data[j++]=a[i++];
}
L->length=n;
}
//定义单链表
typedef int ElemType;
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode;
//头插法
void CreatListF(LNode* &L,ElemType a[],int n){
LNode *s;
L = (LNode*)malloc(sizeof(LNode));
L->next=NULL;
for(int i=0;i<n;i++){
s=(LNode*)malloc(sizeof(LNode));
s->data=a[i]; //先给s节点赋值
s->next=L->next; //s的next指针指向L的next节点
L->next=s; //L的next指针指向s
//上面三行务必记住,头插法的核心代码
}
}
//尾插法
void CreatListF(LNode* &L,ElemType a[],int n){
LNode *s,*r;
L = (LNode*)malloc(sizeof(LNode));
r = L;//r相当于尾指针
for(int i=0;i<n;i++){
s=(LNode*)malloc(sizeof(LNode));
s->data=a[i]; //先给s节点赋值
r->next=s; //r的next指针指向s
r=s; //r指针后移
//上面三行为尾插法的核心代码
}
r->next = NULL; //这一行不要忘记
}
//定义双链表:
typedef struct DNode{
Elemtype data;
struct DNode *pre;
struct DNode *next;
}DLinkNode;
//实现两个有序的顺序表a和b合并为一个顺序表a,同时要求不产生新的空间
//算法实现的文字描述:首先从a和b的最后一个元素逐个向前进行比较,将较大的元素定位在a的末尾中,直到合并结束
int comb(int a[],int &na,int b[],int nb){
if(na + nb > maxSize)
return -1;//如果a数组的最大长度小于a和b的数字个数和,则失败
int i=na,j=nb;
while(j>0){
if(i==0||a[i-1]<b[j-1]){ //说明此时b[j-1]是第i+j大的元素
a[j+i-1]=b[j-1];
j--;
}else{ //说明此时a[j-1]是第i+j大的元素
a[j+i-1]=a[i-1];
i--;
}
}
na=na+nb;
return na;
}
//合并m个有序表
//做法和实现两个有序表基本相同,同样要求不产生新的空间
//先将一个和第二个合并,然后再和第三个合并,直到和第m个合并完成
void combm(int list[][maxSize],int len[],int m){
int i,flag;
for(i=1;i<m;i++){
flag = comb(list[0],len[0],list[i],len[i]);
if(flag==-1)
break ;
}
return flag ;
}
//链表翻转
LNode Reverse(LNode &L)
{
if(L==NULL) return ; //链表为空,直接返回空链表
LNode *p=L->next,*q; //p为工作指针,q为p的后继
L->next=NULL; //先将头节点L的next置为NULL
while(p!=NULL)
{
q=p->next; //暂存p的后继
p->next=L->next; //将p节点插入到头节点后
L->next=p;
p=q;
}
return L;
}
//定义二叉树
typedef struct BTNode{
char data;
struct BTNode *lchild;
struct BTNode *Rchild;
}BTNode;
//定义线索二叉树
typedef struct TBTNode{
char data;
int ltag,rtag;
struct TBTNode *lchild;
struct TBTNode *Rchild;
}TBTNode;
//先序递归遍历
void Preorder(BTNode *p){
if(p != NULL){
printf("%c ",p->data);
Preorder(p->lchild);
Preorder(p->rchild);
}
}
//中序递归遍历
void Inorder(BTNode *p) {
if (p != NULL) {
Inorder(p->lchild);
printf("%c ", p->data);
Inorder(p->rchild);
}
}
//后续递归遍历
void Postorder(BTNode *p) {
if (p != NULL) {
postorder(p->lchild);
postorder(p->rchild);
printf("%c ", p->data);
}
}
//层序遍历(借助循环队列)
void Levelorder(BTNode *p) {
BTNode *que[maxSize];
BTNode *q = NULL;
int front = 0, rear = 0; // 定义一个循环队列
if (p != NULL) {
rear = (rear+1)%maxSize;
que[rear] = p; // 让根节点入队
while (front != rear) { // 只要队列不空,则进行循环
front = (front+1)%maxSize;
q = que[front]; // 队头元素出队
printf("%c\n", q->data); // 访问队头元素
if(q->lchild){ // 左子树存在,则左子树根节点入队
rear = (rear+1) % maxSize;
que[rear] = q->lchild;
}
if(q->rchild){ // 右子树存在,则右子树根节点入队
rear = (rear+1)%maxSize;
que[rear] = q->rchild;
}
}
}
}
//先序非递归遍历
void Preorder(BTNode *p){
if(p !== NULL){
BTNode *stack[maxSize];
int top = -1;
stack[++top] = p;
BTNode *q;
while(top != -1){
q = stack[top--];
printf("%c ",q->data);
if(q->lchild != NULL)
stack[++top] = p->lchild;
if(p->rchild != NULL)
stack[++top] = p->rchild;
}
}
}
//中序非递归遍历
void Inorder(BTNode *bt){
BTBode *stack[maxSize];
int top = -1;
BTNode *p = bt;
if(bt != NULL){
while(top != -1 || p != NULL){
while(p != NULL){
stack[++top] = p;
p = p->lchild;
}
if(top != -1){
p = stack[top--];
printf("%c ",p->data);
p = p->rchild;
}
}
}
}
//后续非递归遍历
void PostOrder(BTNode *bt){
if(bt != NULL){
BTNode *stack1[maxSize]; int top1 = -1;
BTNode *stack2[maxSize]; int top2 = -1;
BTNode *p;
stack1[++top1] = bt;
while(top1 != -1){
p = stack1[top1--];
stack2[++top2] = p;// 注意这里与先序的区别,放入栈2中即可
if(p->lchild)
stack1[++top1] = p->lchild;
if(p->rchild)
stack1[++top1] = p->rchild;
}
// 这时候循环结束,则会将逆后序遍历的结果都存放到了栈2中
// 所以对栈2进行输出即可得到后序遍历的结果
while(top2 != -1){
p = stack2[top2--];
printf("%c ",p-data);
}
}
}