数据结构(五)

一、复习

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
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

磁铁的朋友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值