美文网首页
数据结构笔记

数据结构笔记

作者: stalker丨 | 来源:发表于2019-03-21 19:21 被阅读0次

    数据结构课程概览

    ==================

        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.树和二叉树

                二叉树的三种遍历方式:

                      前序遍历(先序遍历):根左右

                      中序遍历:左根右

                      后序遍历:左右根

    相关文章

      网友评论

          本文标题:数据结构笔记

          本文链接:https://www.haomeiwen.com/subject/btizyqtx.html