小熊孩 发表于 2020-9-23 23:50

[数据结构]【笔记】学习之路

本帖最后由 小熊孩 于 2020-9-24 21:55 编辑

待标题有朝一日变为成神之路,hhhh~嗝~~
https://static.52pojie.cn/static/image/hrline/1.gif
当回首往事的时候,不因虚度年华而悔恨.
https://static.52pojie.cn/static/image/hrline/1.gif

   本帖为数据结构笔记,持续更新,不再开新帖.

https://static.52pojie.cn/static/image/hrline/4.gif
时间 : 2020年9月23日
单链表的算法
1.单链表的算法
//定义节点
typedef struct LNdode
{
      ElemType data; //数据域
      struct LNode *next; //指向下一个节点的指针
}LinkList;
1) 才用头插法建立单链表
   void CreateListF(LinkList *&L, ElemType a[], int n){
    LinkList *s; int i;
    L = (LinkList *)malloc(sizeof(LinkList));
    L->next = null;
    for(i=0; i<n; i++)
    {
      s = (LinkList *)malloc(sizeof(LinkList));
      s->data = a;
      s->next = L->next;
      L->next = s;
    }
}//时间复杂对为O(n) 2) 采用尾插法建立单链表void CreateListF(LinkList *&L, ElemType a[], int n)
{
    LinkList *s, *r; int i;
    L = (LinkList *)malloc(sizeof(LinkList));
         r = L;
    for(i=0; i<n; i++)
    {
      s = (LinkList *)malloc(sizeof(LinkList));
      s->data = a;
      r->next= s;
      r = s;
    }
    r->next = null;
}//时间复杂对为O(n)2.单链表的基本运算算法 1) 暗元素查找算法int LocateElem(LinkList *L, ElemType e)
{
    LinkList *p = L->next;
    int n = 1;
    while(p!=null && p->data !=e)
    {
      p = p->next;
      n++;
    }
    if(p==null)
      return 0;
    else
      return n;
} 2)插入节点操作s->next = p->next;
p->next = s; 3) 删除节点操作 p->next = p->next->next;3.有序但你链表的归并算法 1) 方法一void Merge(LinkList *L1, LinkList *L2, LinkList *&L3)
{
    LinkList *p = L1->next, *q = L2->next, *r, *s;
    L3 = (LinkList *)malloc(sizeof(LinkList));
    while(p!=null && q!null)
    {
      if(p->data < q->data)
      {
            s = (LinkList *)malloc(sizeof(LinkList));
            s->data = p->data;
            p = p->next;
            r->next = s;
            r = s;
      }
      else
      {
            s = (LinkList *)malloc(sizeof(LinkList));
            s->data = q->data;
            q = q->next;
            r->next = s;
            r = s;
      }
    }
    if(q != null)
      p = q;
    while(p != null)
    {
      s = (LinkList *)malloc(sizeof(LinkList));
            s->data = p->data;
            p = p->next;
            r->next = s;
            r = s;
    }
    r->next = null;
}//时间复杂度/空间复杂度 O(m+n) 2) 方法二/*自我感觉这个地方我写的可能不对,希望大佬们帮我审阅并指正一下,谢谢哦.*/
void Merge(LinkList *L1, LinkList *L2, LinkList *&L3)
{
   LinkList *p = L1->next, *q = L2->next, *r;
    L3 = L1;
    free(L2);
    r = L3;
    while(p!=null && q!null)
    {
      if(p->data < q->data)
      {
            r->next = p;
            p = p->next;
      }
      else
      {
            r->next = q->next;
            q = q->next;
      }
      r = r->next;
    }
    if(q != null)
            p =q;
    r->next = null;
}//时间复杂度O(m+n) 空间复杂度O(1)
https://static.52pojie.cn/static/image/hrline/4.gif
时间:2020年9月24日双链表的算法 1.双链表节点定义//定义节点
typedef struct LNdode
{
        ElemType data; //数据域
        struct DLNode *prior; //指向前驱节点
        struct DLNode *next; //指向下一个节点的指针
}DLinkList; 1)采用头插法建立双链表void CreateDListF(LinkList *&L, ElemType a[], int n)
{
    DLinkList *s; int i;
    L = (DLinkList *)malloc(sizeof(DLinkList));
    L->next = L->prior = null;
    for(i=0; i<n; i++)
    {
      s = (DLinkList *)malloc(sizeof(DLinkList));
      s->data = a;
      s->next = L->next;
      if(L->next != null)
      {
            L->next->prior = s;
      }
      L->next = s;
      s->prior = L;
    }
}//时间复杂对为O(n) 2)采用尾插法建立双链表void CreateDListR(LinkList *&L, ElemType a[], int n)
{
    DLinkList *s, *r; int i;
    L = (DLinkList *)malloc(sizeof(DLinkList));
    r = L;
    for(i=0; i<n; i++)
    {
      s = (DLinkList *)malloc(sizeof(DLinkList));
      s->data = a;
      r->next = s;
      s->prior = r;
      r = s;
    }
}//时间复杂对为O(n)2.双链表的基本运算算法 1)查找元素值的节点int Finfnode(DLinkList *L, ElemType e)
{
    DLinkList *p = L->next;
    int n = 1;
    while(p!=null && p->data !=e)
    {
      p = p->next;
      n++;
    }
    if(p==null)
      return 0;
    else
      return n;
}//时间复杂对为O(n) 2)插入节点/*** 核心代码* s->next = p->next;* p->next->prior = s;* s->prior = p;* p->next = s;*/int ListInsert(DLinkList *&L, int i, ElemType e)
{
    int j = 0;
    DLinkList *p = L, *s;
    while(j<i-1 && p!=null)
    {
      p = p->next;
      j++;
    }
    if(p == null)
    {
      return 0;
    }
    else
    {
      s = (DLinkList *)malloc(sizeof(DLinkList));
      s->data = e;
      s->next = p->next;
      if(p->next != null)
      {
            p->next->prior = s;
      }
      s->prior = p;
      p->next = s;
      return 1;
    }
} 3)删除节点操作/**
* 核心代码
* p->next = q->next;
* q->next->prior = p;
*/
int ListDelete(DLinkList *&L, int i, ElemType &e)
{
    int j = 0;
    DLinkList *p = L, *q;
    while(j<i-1 && p!=null)
    {
      p = p->next;
      j++;
    }
    if(p == null)
    {
      return 0;
    }
    else
    {
       q = p->next;
       if(q==null)
       {
         renturn 0;
       }
      p->next = q->next;
      if(p->next != null)
      {
            p-next->prior = p;
      }
      free(q);
      return 1;
    }
}
https://static.52pojie.cn/static/image/hrline/3.gif
不知道以后这边会写啥,先圈起来留个地.

https://static.52pojie.cn/static/image/hrline/2.gif



https://static.52pojie.cn/static/image/hrline/4.gif
附件为MD格式的笔记,内容与帖子内容完全一致,跟随更新,根据需要下载.
附件为MD格式的笔记,内容与帖子内容完全一致,跟随更新,根据需要下载.
附件为MD格式的笔记,内容与帖子内容完全一致,跟随更新,根据需要下载.




EnterpriseSolu 发表于 2020-9-24 07:23

现在的编程语言提供的API/BCL 已经封装了足够优秀的这类常用算法,我认为第一是要会用,灵活应用这些算法,
第二,如果能发现现有算法的不足,能优化,或是找到一个问题的最优化解决算法,也是一种很强的能力,至于从头开始学习算法,要经历很多弯路才能明白别人的算法为什么优秀,也是一种提高编程能力的体现

EnterpriseSolu 发表于 2020-9-24 07:26

基础类库
BCLbasic clas library
FCLfoundation class library

alex1998 发表于 2020-9-24 08:32

学习了学习了

hyh15552464072 发表于 2020-9-24 08:38

来自严蔚敏版《数据结构》给的源码

15126819695 发表于 2020-9-24 09:21

没毛病   找工作啥的都是手撕压力山大

wu_zhi33 发表于 2020-9-24 09:38

最近也在学数据结构   学到了链表   一起努力呀

桥段 发表于 2020-9-24 09:52

掉头发呀

吾爱丶加油 发表于 2020-9-24 13:09

每天学习一点点

zjlzhok 发表于 2020-9-25 09:42

学无止境,谢谢。
页: [1]
查看完整版本: [数据结构]【笔记】学习之路