一、复习
1、顺序队列
#define N 64
struct sequeue
{
int data[N];
int front;
int rear;
};
判空:front == rear
判满:(rear+1)%N == front
2、链式队列
typedef struct node
{
int data;
struct node *next;
}Node;
typedef struct linkqueue
{
struct node *front;
struct node *rear;
}Linkqueue;
二、栈
特点:先进后出(FILO)
栈的出栈和入栈操作只在固定的一端进行,一般将其称为栈顶
1、顺序栈
逻辑结构:线性结构
存储结构:顺序存储
#define N 64
struct seqstack
{
int data[N];
int top; //栈顶指针,用于记录栈中最后一个元素的下标
}
2、链式栈
链式栈的出栈和入栈都在头节点后面进行; 入栈 == 头插 出栈 == 头删(每一次删除头节点后面的节点)
链式栈的节点表示
typedef int data_t;
typedef struct node
{
data_t data;
struct node *next;
}Node;
三、树
1、概念
树是m(>=0)个节点的有限结合
(1)有且仅有一个称之为叫根的节点
(2)其余节点可以看作是根节点的子节点
2、二叉树
二叉树:
二叉树中任意一个节点的子节点个数最大为2
二叉树严格区分左右孩子
满二叉树:深度为k的一颗二叉树,节点个数满足等于 2^k-1,则该树就成为满二叉树
完全二叉树:只有最后两层有度数小于2的节点,最后一层的节点按照从左到右的顺序依次排列
3、二叉树的存储
(1)顺序存储
二叉树的顺序存储,需要将一个二叉树补充成完全二叉树,将补充完成的完全二叉树,所有元素从上到下,
从左到右依次排序,将数据存放在一片连续存储空间中。补充的元素一般用一些特殊数据来描述,表示该元素 为补充的元素
缺点:补充元素和创建连续存储空间时,会浪费大量的资源空间,所以二叉树的存储一般都用链式存储方式
(2) 链式存储
节点的结构体表示:
typedef char data_t;
typedef struct node
{
data_t data; //数据域,用于存储数据
struct node *l_child; //指针域 记录当前节点的左孩子的地址
struct node *r_child; //记录当前节点的右孩子的地址
}Node;
4、二叉树的遍历
先序遍历:根节点 – 左孩子 – 右孩子
中序遍历:左孩子 – 根节点 – 右孩子
后序遍历:左孩子 – 右孩子 – 根节点
作业:
1、实现二叉树的存储和遍历(先序、中序、后序)
2、实现二叉树的层次遍历(不使用递归、使用队列完成) (需要提交)
seqstack
/*===============================================
* 文件名称:main.c
* 创 建 者:
* 创建日期:2024年03月21日
* 描 述:
================================================*/
#include "seqstack.h"
int main(int argc, char *argv[])
{
Seqstack *s = Seqstack_Create();
for(int i = 0; i < 10; i++)
{
En_Stack(s, i);
}
data_t data;
for(int i = 0; i < 10; i++)
{
De_Stack(s, &data);
printf("%d ", data);
}
printf("\n");
return 0;
}
/*===============================================
* 文件名称:seqstack.c
* 创 建 者:
* 创建日期:2024年03月21日
* 描 述:
================================================*/
#include "seqstack.h"
//创建顺序栈
Seqstack *Seqstack_Create()
{
Seqstack *s = (Seqstack *)malloc(sizeof(Seqstack));
if(NULL == s)
{
printf("seqstack malloc failed!\n");
return NULL;
}
s->top = -1;
return s;
}
//入栈
void En_Stack(Seqstack *s, data_t data)
{
if(s->top == N-1)
{
printf("seqstack is full!\n");
return;
}
s->data[s->top+1] = data;
s->top++;
return;
}
//出栈
void De_Stack(Seqstack *s, data_t *data)
{
if(s->top == -1)
{
printf("seqstack is empty!\n");
return;
}
*data = s->data[s->top];
s->top--;
return;
}
/*===============================================
* 文件名称:seqstack.h
* 创 建 者:
* 创建日期:2024年03月21日
* 描 述:
================================================*/
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define N 50
typedef int data_t;
typedef struct seqstack
{
data_t data[N];
int top;
}Seqstack;
//创建顺序栈
Seqstack *Seqstack_Create();
//入栈
void En_Stack(Seqstack *s, data_t data);
//出栈
void De_Stack(Seqstack *s, data_t *data);
#endif
linktree
/*===============================================
* 文件名称:main.c
* 创 建 者:
* 创建日期:2024年03月26日
* 描 述:
================================================*/
#include "linktree.h"
int main(int argc, char *argv[])
{
Node *root = Tree_Create();
Front_Print(root);
return 0;
}
/*===============================================
* 文件名称:linktree.c
* 创 建 者:
* 创建日期:2024年03月26日
* 描 述:
================================================*/
#include "linktree.h"
//创建二叉树
Node *Tree_Create()
{
char ch;
scanf("%c", &ch);
if(ch == '#')
{
return NULL;
}
Node *root = (Node *)malloc(sizeof(Node));
if(root == NULL)
{
printf("malloc failed!\n");
return NULL;
}
root->data = ch;
root->l_child = Tree_Create();
root->r_child = Tree_Create();
return root;
}
//先序遍历
void Front_Print(Node *root)
{
if(NULL == root)
{
return;
}
printf("%c", root->data); //打印根节点数据
Front_Print(root->l_child); //打印左孩子
Front_Print(root->r_child); //打印右孩子
}
/*===============================================
* 文件名称:linktree.h
* 创 建 者:
* 创建日期:2024年03月26日
* 描 述:
================================================*/
#ifndef __LINKTREE_H__
#define __LINKTREE_H__
#include <stdio.h>
#include <stdlib.h>
typedef char data_t;
typedef struct node
{
data_t data;
struct node *l_child;
struct node *r_child;
}Node;
Node *Tree_Create(); //创建二叉树
void Front_Print(Node *root); //先序遍历
#endif
linkstack
/*===============================================
* 文件名称:main.c
* 创 建 者:
* 创建日期:2024年03月22日
* 描 述:
================================================*/
#include "linkstack.h"
int main(int argc, char *argv[])
{
//创建链式栈
Node *head = Linkstack_Create();
//入栈
int n = 10;
while(n--)
{
En_Stack(head, n);
}
//栈
data_t data;
for(int i = 0; i < 10; i++)
{
De_Stack(head, &data);
printf("%d ", data);
}
printf("\n");
return 0;
}
/*===============================================
* 文件名称:linkstack.c
* 创 建 者:
* 创建日期:2024年03月22日
* 描 述:
================================================*/
#include "linkstack.h"
//创建链式栈
Node *Linkstack_Create()
{
Node *head = (Node *)malloc(sizeof(Node));
if(NULL == head)
{
printf("head malloc failed!\n");
return NULL;
}
head->data = -1;
head->next = NULL;
return head;
}
//入栈
void En_Stack(Node *head, data_t data)
{
Node *new = (Node *)malloc(sizeof(Node));
if(NULL == new)
{
printf("new_node malloc failed!\n");
return ;
}
new->data = data;
new->next = NULL;
new->next = head->next;
head->next = new;
return;
}
//出栈
void De_Stack(Node *head, data_t *data)
{
Node *q = head->next;
*data = q->data;
head->next = q->next;
free(q);
q = NULL;
return;
}
/*===============================================
* 文件名称:linkstack.h
* 创 建 者:
* 创建日期:2024年03月22日
* 描 述:
================================================*/
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
typedef int data_t;
typedef struct node //定义一个节点的结构体类型
{
data_t data; //数据域,用于存放数据
struct node *next; //指针域,用于存放下一个节点的地址
}Node;
//创建链式栈
Node *Linkstack_Create();
//入栈
void En_Stack(Node *head, data_t data);
//栈
void De_Stack(Node *head, data_t *data);
#endif
linkqueue
/*===============================================
* 文件名称:main.c
* 创 建 者:
* 创建日期:2024年03月25日
* 描 述:
================================================*/
#include "linkqueue.h"
int main(int argc, char *argv[])
{
int data;
Point *p = Linkqueue_Create(); //创建
for(int i = 0; i < 10; i++)
{
Linkqueue_Enqueue(p, i); //入列
}
for(int i = 0; i < 10; i++)
{
Linkqueue_Dequeue(p, &data); //出列
printf("%d ",data);
}
puts("");
return 0;
}
/*===============================================
* 文件名称:linkqueue.c
* 创 建 者:
* 创建日期:2024年03月25日
* 描 述:
================================================*/
#include "linkqueue.h"
Point *Linkqueue_Create()
{
Linkqueue *head = (Linkqueue *)malloc(sizeof(Linkqueue));
if(!head)
{
puts("head malloc failed");
return NULL;
}
head->next = NULL;
Point *p = (Point *)malloc(sizeof(Point));
if(!p)
{
puts("p malloc failed");
return NULL;
}
p->front = head;
p->rear = head;
return p;
}
void Linkqueue_Enqueue(Point *p, int data)
{
Linkqueue *new = (Linkqueue *)malloc(sizeof(Linkqueue));
if(!new)
{
puts("new malloc failed");
return;
}
new->data = data;
new->next = p->rear->next;
p->rear->next = new;
p->rear = new;
return;
}
void Linkqueue_Dequeue(Point *p, int *data)
{
if(p->front == p->rear)
{
puts("list is full");
return;
}
Linkqueue *q = p->front->next;
*data = q->data;
p->front->next = q->next;
if(p->front->next == NULL)
{
p->rear = p->front;
}
free(q);
q = NULL;
}
/*===============================================
* 文件名称:linkqueue.h
* 创 建 者:
* 创建日期:2024年03月25日
* 描 述:
================================================*/
#ifndef __LINKQUEUE_H__
#define __LINKQUEUE_H__
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
typedef struct linkqueue
{
int data;
struct linkqueue *next;
}Linkqueue;
typedef struct point
{
struct linkqueue *front;
struct linkqueue *rear;
}Point;
Point *Linkqueue_Create();
void Linkqueue_Enqueue(Point *p, int data);
void Linkqueue_Dequeue(Point *p, int *data);
#endif