数据结构课程概览
==================
1.顺序表
2.链表:单链表,单向循环链表,双链表,双向循环链表,内核链表(重点)
3.栈,队列(重点)
4.二叉树
引入数据结构
===================
1.讨论数据用哪种方式存放,执行效率最高
顺序表
==============
1.本质就是前面学习的数组,将数组作了二次封装
2.#include <strings.h>
void bzero(void *s, size_t n);
参数:s --》你要清零的地址
n --》地址长度,字节
char buf[10];
bzero(buf,10);
int a[10]
bzero(a,sizeof(a));
#include <string.h>
void *memset(void *s, int c, size_t n);
参数:c --》你要填充的值
memset(buf,0,10);//将buf中10个字节全部填充0
memset(buf,1,10);//将buf中10个字节全部填充1
3.总结顺序表
struct 顺序表的名字
{
一个存放真实数据的数组;
一个存放最后一个有效成员下标的整数;
};
单向循环链表的操作
====================
1.对比跟单链表的区别
第一个区别:单向循环链表首尾相接
第二个区别:循环遍历的写法不一样
while(p->next!=NULL) 单链表
while(p->next!=head)
双向循环链表
=================
对齐双向链表和双向循环链表:
区别一:while(p->next!=NULL)
while(p->next!=head)
区别二:首尾必须相接(两层意思)
尾部节点的next指向head
头节点的prev指向尾部
内核链表
====================
本质就是一个双向循环链表,linux系统内核中专门用来存放各种数据的一种链表
特点:将链表中的指针操作封装成了函数或者宏定义
1.内核链表常用的宏函数,普通函数
第一个:初始化指针的
INIT_LIST_HEAD(ptr)
参数:ptr --》struct list_head指针
第二个函数:尾部插入数据
list_add_tail(struct list_head *new, struct list_head *head)
参数:new --》你要插入到尾部的新节点
head --》链表的头
两种使用方式:
方式一:list_add_tail(new,head);//new插入到head代表的链表尾部
方式二:list_add_tail(new,other); //new插入到other的前面
中间插入
list_add(struct list_head *new, struct list_head *head)
两种使用方式:
方式一:list_add(new,head);//new插入到head和第一个有效节点之间
方式二:list_add(new,other); //new插入到other的后面
第三个:本质是个for循环,遍历内核链表
list_for_each_entry(pos, head, member)
参数:pos --》大结构体指针,用来遍历内核链表的
head --》头结点里面的小结构体指针
member --》小结构体在大结构体里面的名字
第四个:删除节点
list_del(struct list_head *entry)
参数:entry --》你要删除的那个节点里面的小结构体指针
第五个:移动数据
list_move(new,other); //将new节点移动到other的后面
栈,队列和二叉树
====================
1.栈 --》先进后出
单链表实现栈的逻辑(进栈,出栈)--》链式栈
struct stack
{
int num;
struct stack *next;
struct stack *top;
};
2.队列 --》先进先出
typedef struct queue //封装一个结构体来表示队列
{
int num;
struct queue *next; //指向下一个节点
struct queue *queuehead; //指向队首的指针 辅助你操作入队和出队
struct queue *queuetail; //指向队尾的指针 辅助你操作入队和出队
}q,*qq; //简化了名字书写
3.树和二叉树
二叉树的三种遍历方式:
前序遍历(先序遍历):根左右
中序遍历:左根右
后序遍历:左右根
网友评论