• 《C++数据结构-快速拾遗》 手写链表



    注释:吕鑫老师C++对于找工作真的是很好的教程,基本什么方面都讲的很细致,但是对于大多数人只有快进快进再快进~~

    注释:基本链表信息自己百度,这里只是一个快速拾遗过程。

    1.链表定义

    1 typedef int DATA;//int的别名,为了便于管理
    2 
    3 //定义链表一个链节点
    4 typedef struct SNode
    5 {
    6     DATA data;//数据,可以是结构体和类等,4字节
    7     SNode *pNext;//指针,指向下一个节点,4字节
    8 }; 

    2.插入一个节点

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 //#define DATA int
     6 typedef int DATA;//int的别名,为了便于管理
     7 
     8 //定义链表一个链节点
     9 typedef struct SNode
    10 {
    11     DATA data;//数据,可以是结构体和类等,4字节
    12     SNode *pNext;//指针,指向下一个节点,4字节
    13 }; 
    14 SNode* g_pHead = NULL;//第一个链表是空链表
    15 //从头插入一个数据
    16 void AddHead(DATA data)
    17 {
    18     SNode* p = new SNode;//申请一个堆空间,8字节
    19     p->data  = data;
    20     p->pNext = g_pHead;
    21     g_pHead  = p;//把新插入的节点当做头
    22 }
    23 int main(int argc, char**argv[])
    24 {
    25     AddHead(1);
    26     AddHead(2);
    27     AddHead(3);
    28     cout<<g_pHead->data<<endl<<g_pHead->pNext->data<<endl<<g_pHead->pNext->pNext->data<<endl;
    29     return 0;
    30 }

    3.从尾部插入一个节点

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 //#define DATA int
     6 typedef int DATA;//int的别名,为了便于管理
     7 
     8 //定义链表一个链节点
     9 typedef struct SNode
    10 {
    11     DATA data;//数据,可以是结构体和类等,4字节
    12     SNode *pNext;//指针,指向下一个节点,4字节
    13 }; 
    14 SNode* g_pHead = NULL;//第一个链表是空链表
    15 //从尾插入一个数据
    16 void AddTail(DATA data)
    17 {
    18     SNode* p = g_pHead;//防止改变头结点的指针
    19     //建立新的节点
    20     SNode* p1 = new SNode;
    21     p1->data = data;
    22     p1->pNext = NULL;
    23     if(!p)//如果一开始就是空链表
    24     {
    25         g_pHead = p1;
    26         return;
    27     }
    28     while(p->pNext)//找到最尾部的节点
    29     {
    30         p = p->pNext;
    31     }
    32     p->pNext = p1;
    33 }
    34 int main(int argc, char**argv[])
    35 {
    36 /*     AddHead(1);
    37     AddHead(2);
    38     AddHead(3); */
    39     AddTail(11);
    40     AddTail(12);
    41     AddTail(13);
    42     while(g_pHead)
    43     {
    44         cout<<g_pHead->data<<endl;
    45         g_pHead = g_pHead->pNext;
    46     }
    47     //cout<<g_pHead->data<<endl<<g_pHead->pNext->data<<endl<<g_pHead->pNext->pNext->data<<endl;
    48     return 0;
    49 }

    4.修改节点数据

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 //#define DATA int
     6 typedef int DATA;//int的别名,为了便于管理
     7 
     8 //定义链表一个链节点
     9 typedef struct SNode
    10 {
    11     DATA data;//数据,可以是结构体和类等,4字节
    12     SNode *pNext;//指针,指向下一个节点,4字节
    13 }; 
    14 SNode* g_pHead = NULL;//第一个链表是空链表
    15 //从尾插入一个数据
    16 void AddTail(DATA data)
    17 {
    18     SNode* p = g_pHead;//防止改变头结点的指针
    19     //建立新的节点
    20     SNode* p1 = new SNode;
    21     p1->data = data;
    22     p1->pNext = NULL;
    23     if(!p)//如果一开始就是空链表
    24     {
    25         g_pHead = p1;
    26         return;
    27     }
    28     while(p->pNext)//找到最尾部的节点
    29     {
    30         p = p->pNext;
    31     }
    32     p->pNext = p1;
    33 }
    34 void Modify(DATA data, DATA newData)
    35 {
    36     SNode* p = g_pHead;
    37     SNode* p1 = new SNode;
    38     if (!p)
    39     {
    40         p1->data = newData;
    41         p1->pNext = NULL;
    42         g_pHead = p1;
    43         return;
    44     }
    45     while(p)
    46     {
    47         if (p->data==data)
    48         {
    49             p->data = newData;
    50         }
    51         p = p->pNext; 
    52     }
    53 }
    54 int main(int argc, char**argv[])
    55 {
    56 /*     AddHead(1);
    57     AddHead(2);
    58     AddHead(3); */
    59     AddTail(11);
    60     AddTail(12);
    61     AddTail(13);
    62     Modify(13,16);
    63     while(g_pHead)
    64     {
    65         cout<<g_pHead->data<<endl;
    66         g_pHead = g_pHead->pNext;
    67     }
    68     cout<<"hell2";
    69     return 0;
    70 }

    5.查找和打印链表

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 //#define DATA int
     6 typedef int DATA;//int的别名,为了便于管理
     7 
     8 //定义链表一个链节点
     9 typedef struct SNode
    10 {
    11     DATA data;//数据,可以是结构体和类等,4字节
    12     SNode *pNext;//指针,指向下一个节点,4字节
    13 }; 
    14 SNode* g_pHead = NULL;//第一个链表是空链表
    15 //从尾插入一个数据
    16 void AddTail(DATA data)
    17 {
    18     SNode* p = g_pHead;//防止改变头结点的指针
    19     //建立新的节点
    20     SNode* p1 = new SNode;
    21     p1->data = data;
    22     p1->pNext = NULL;
    23     if(!p)//如果一开始就是空链表
    24     {
    25         g_pHead = p1;
    26         return;
    27     }
    28     while(p->pNext)//找到最尾部的节点
    29     {
    30         p = p->pNext;
    31     }
    32     p->pNext = p1;
    33 }
    34 //查找某个数据
    35 bool Find(DATA data)
    36 {
    37     SNode* p = g_pHead;
    38     while(p)
    39     {
    40         if(p->data == data) return true;
    41         p = p->pNext;    
    42     }
    43     return false;
    44 }
    45 void print()
    46 {
    47     SNode* p = g_pHead;
    48     while(p)
    49     {
    50         cout<<p->data<<endl;
    51         p = p->pNext;
    52     }
    53 }
    54 int main(int argc, char**argv[])
    55 {
    56 /*     AddHead(1);
    57     AddHead(2);
    58     AddHead(3); */
    59     AddTail(11);
    60     AddTail(12);
    61     AddTail(13);
    62     //Modify(13,16);
    63     print();
    64     cout<<"shifou : "<<Find(10);
    65     return 0;
    66 }

    6.删除链表节点

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 //#define DATA int
     6 typedef int DATA;//int的别名,为了便于管理
     7 
     8 //定义链表一个链节点
     9 typedef struct SNode
    10 {
    11     DATA data;//数据,可以是结构体和类等,4字节
    12     SNode *pNext;//指针,指向下一个节点,4字节
    13 }; 
    14 SNode* g_pHead = NULL;//第一个链表是空链表
    15 //从尾插入一个数据
    16 void AddTail(DATA data)
    17 {
    18     SNode* p = g_pHead;//防止改变头结点的指针
    19     //建立新的节点
    20     SNode* p1 = new SNode;
    21     p1->data = data;
    22     p1->pNext = NULL;
    23     if(!p)//如果一开始就是空链表
    24     {
    25         g_pHead = p1;
    26         return;
    27     }
    28     while(p->pNext)//找到最尾部的节点
    29     {
    30         p = p->pNext;
    31     }
    32     p->pNext = p1;
    33 }
    34 //删除某个节点
    35 bool Delete(DATA data)
    36 {
    37     SNode* p = g_pHead;//当前节点
    38     SNode* p1 = NULL;//下一个节点
    39     if(!p) return false;//空链表直接返回
    40     if(p->data == data )//删除第一个节点
    41     {
    42         g_pHead = p->pNext;
    43         delete p;
    44         return true;
    45     }        
    46     while(p)//删除中间和结尾节点
    47     {
    48         if(p->data == data)
    49         {
    50             p1->pNext = p->pNext;
    51             delete p;
    52             return true;
    53         }
    54         p1 = p;
    55         p = p->pNext;
    56     }
    57     return false;
    58 }
    59 void print()
    60 {
    61     SNode* p = g_pHead;
    62     while(p)
    63     {
    64         cout<<p->data<<endl;
    65         p = p->pNext;
    66     }
    67 }
    68 int main(int argc, char**argv[])
    69 {
    70 /*     AddHead(1);
    71     AddHead(2);
    72     AddHead(3); */
    73     AddTail(11);
    74     AddTail(12);
    75     AddTail(13);
    76     //Modify(13,16);
    77     Delete(13);
    78     print();
    79     cout<<"shifou : "<<Find(10);
    80     return 0;
    81 }

    7.排序链表

      以后面试再看链表外排和内排:https://chuanke.baidu.com/v1760453-135963-545032.html

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 //#define DATA int
     6 typedef int DATA;//int的别名,为了便于管理
     7 //定义一个结构体当做数据
     8 /* typedef struct DATA
     9 {
    10     int nNumb;
    11     char sName[20];
    12     float fMath;
    13 }; */
    14 //定义链表一个链节点
    15 typedef struct SNode
    16 {
    17     DATA data;//数据,可以是结构体和类等,4字节
    18     SNode *pNext;//指针,指向下一个节点,4字节
    19 }SNode; 
    20 SNode* g_pHead = NULL;//第一个链表是空链表
    21 //从尾插入一个数据
    22 void AddTail(DATA data)
    23 {
    24     SNode* p = g_pHead;//防止改变头结点的指针
    25     //建立新的节点
    26     SNode* p1 = new SNode;
    27     p1->data = data;
    28     p1->pNext = NULL;
    29     if(!p)//如果一开始就是空链表
    30     {
    31         g_pHead = p1;
    32         return;
    33     }
    34     while(p->pNext)//找到最尾部的节点
    35     {
    36         p = p->pNext;
    37     }
    38     p->pNext = p1;
    39 }
    40 //打印全部节点数据
    41 void print()
    42 {
    43     SNode* p = g_pHead;
    44     while(p)
    45     {
    46         cout<<p->data<<endl;
    47         p = p->pNext;
    48     }
    49 }
    50 //交换数据的排序
    51 void sortByNum(bool reverse = true)
    52 {
    53     SNode* p = g_pHead;
    54     SNode* m = NULL;
    55     while(p)
    56     {
    57         m = p->pNext;
    58         while(m)
    59         {
    60             if(p->data > m->data && reverse)
    61             {
    62                 DATA midData;
    63                 midData = p->data;
    64                 p->data = m->data;
    65                 m->data = midData;
    66             }
    67             else if(p->data < m->data && !reverse)
    68             {
    69                 DATA midData;
    70                 midData = p->data;
    71                 p->data = m->data;
    72                 m->data = midData;
    73             }
    74             m = m->pNext;
    75         }
    76         p=p->pNext;
    77     }
    78 }
    79 int main(int argc, char*argv[])
    80 {
    81 /*     AddHead(1);
    82     AddHead(2);
    83     AddHead(3); */
    84     AddTail(11);
    85     AddTail(2);
    86     AddTail(13);
    87     AddTail(10);
    88     AddTail(14);
    89     AddTail(1);
    90     //Modify(13,16);
    91     //Delete(13);
    92     print();
    93     sortByNum(false);
    94     print();
    95     return 0;
    96 }

    8.总链表(结构体版)

      1 #include <iostream>
      2 
      3 using namespace std;
      4 
      5 //#define DATA int
      6 typedef int DATA;//int的别名,为了便于管理
      7 //定义一个结构体当做数据
      8 /* typedef struct DATA
      9 {
     10     int nNumb;
     11     char sName[20];
     12     float fMath;
     13 }; */
     14 //定义链表一个链节点
     15 typedef struct SNode
     16 {
     17     DATA data;//数据,可以是结构体和类等,4字节
     18     SNode *pNext;//指针,指向下一个节点,4字节
     19 }SNode; 
     20 SNode* g_pHead = NULL;//第一个链表是空链表
     21 //从尾插入一个数据
     22 void AddTail(DATA data)
     23 {
     24     SNode* p = g_pHead;//防止改变头结点的指针
     25     //建立新的节点
     26     SNode* p1 = new SNode;
     27     p1->data = data;
     28     p1->pNext = NULL;
     29     if(!p)//如果一开始就是空链表
     30     {
     31         g_pHead = p1;
     32         return;
     33     }
     34     while(p->pNext)//找到最尾部的节点
     35     {
     36         p = p->pNext;
     37     }
     38     p->pNext = p1;
     39 }
     40 //从头插入一个数据
     41 void AddHead(DATA data)
     42 {
     43     SNode* p = new SNode;//申请一个堆空间,8字节
     44     p->data  = data;
     45     p->pNext = g_pHead;
     46     g_pHead  = p;//把新插入的节点当做头
     47 }
     48 //修改链表节点数据
     49 void Modify(DATA data, DATA newData)
     50 {
     51     SNode* p = g_pHead;
     52     SNode* p1 = new SNode;
     53     if (!p)
     54     {
     55         p1->data = newData;
     56         p1->pNext = NULL;
     57         g_pHead = p1;
     58         return;
     59     }
     60     while(p)
     61     {
     62         if (p->data==data)
     63         {
     64             p->data = newData;
     65         }
     66         p = p->pNext; 
     67     }
     68 }
     69 //查找某个数据
     70 bool Find(DATA data)
     71 {
     72     SNode* p = g_pHead;
     73     while(p)
     74     {
     75         if(p->data == data) return true;
     76         p = p->pNext;    
     77     }
     78     return false;
     79 }
     80 //删除某个节点
     81 bool Delete(DATA data)
     82 {
     83     SNode* p = g_pHead;//当前节点
     84     SNode* p1 = NULL;//下一个节点
     85     if(!p) return false;//空链表直接返回
     86     if(p->data == data )//删除第一个节点
     87     {
     88         g_pHead = p->pNext;
     89         delete p;
     90         return true;
     91     }        
     92     while(p)//删除中间和结尾节点
     93     {
     94         if(p->data == data)
     95         {
     96             p1->pNext = p->pNext;
     97             delete p;
     98             return true;
     99         }
    100         p1 = p;
    101         p = p->pNext;
    102     }
    103     return false;
    104 }
    105 //打印全部节点数据
    106 void print()
    107 {
    108     SNode* p = g_pHead;
    109     while(p)
    110     {
    111         cout<<p->data<<endl;
    112         p = p->pNext;
    113     }
    114 }
    115 //交换数据的排序
    116 void sortByNum(bool reverse = true)
    117 {
    118     SNode* p = g_pHead;
    119     SNode* m = NULL;
    120     while(p)
    121     {
    122         m = p->pNext;
    123         while(m)
    124         {
    125             if(p->data > m->data && reverse)
    126             {
    127                 DATA midData;
    128                 midData = p->data;
    129                 p->data = m->data;
    130                 m->data = midData;
    131             }
    132             else if(p->data < m->data && !reverse)
    133             {
    134                 DATA midData;
    135                 midData = p->data;
    136                 p->data = m->data;
    137                 m->data = midData;
    138             }
    139             m = m->pNext;
    140         }
    141         p=p->pNext;
    142     }
    143 }
    144 int main(int argc, char*argv[])
    145 {
    146 /*     AddHead(1);
    147     AddHead(2);
    148     AddHead(3); */
    149     AddTail(11);
    150     AddTail(2);
    151     AddTail(13);
    152     AddTail(10);
    153     AddTail(14);
    154     AddTail(1);
    155     //Modify(13,16);
    156     //Delete(13);
    157     print();
    158     sortByNum(false);
    159     print();
    160     return 0;
    161 }

    9.总链表(类版本)

      1 #include <iostream>
      2 
      3 using namespace std;
      4 /*
      5 typedef struct DATA
      6 {
      7     int sNum;
      8     char sName[20];
      9 }DATA;
     10 */
     11 typedef int DATA;
     12 typedef struct SNode
     13 {
     14     DATA data;
     15     SNode* pNext;
     16 }SNode;
     17 class CList
     18 {
     19 public:
     20     CList();
     21     ~CList();
     22     CList(CList&p);
     23     void AddTail(DATA data);
     24     void AddHead(DATA data);
     25     void Modify(DATA data, DATA newData);
     26     bool Find(DATA data);
     27     bool Delete(DATA data);
     28     void print();
     29     void sortByNum(bool reverse = true);
     30 private:
     31     SNode* m_pHead;
     32 };
     33 
     34 int main(int argc,char*argv[])
     35 {
     36     CList list1, list2;
     37     list1.AddHead(10);
     38     list1.AddHead(6);
     39     list1.AddHead(11);
     40     list1.AddHead(8);
     41     list1.AddHead(10);
     42     list1.AddHead(1);
     43     list1.print();
     44 
     45     list1.sortByNum();
     46     list1.print();
     47     list2 = list1;
     48     list2.print();
     49     return 0;
     50 }
     51 
     52 CList::CList()
     53 {
     54     m_pHead = NULL;//
     55 }
     56 
     57 CList::~CList()
     58 {//析构函数,C++自动清除堆空间数据
     59 }
     60 CList::CList(CList& p)
     61 {
     62     memcpy(this,&p,sizeof(p));//拷贝构造函数
     63 }
     64 //从尾插入一个数据
     65 void CList::AddTail(DATA data)
     66 {
     67     SNode* p = m_pHead;//防止改变头结点的指针
     68                        //建立新的节点
     69     SNode* p1 = new SNode;
     70     p1->data = data;
     71     p1->pNext = NULL;
     72     if (!p)//如果一开始就是空链表
     73     {
     74         m_pHead = p1;
     75         return;
     76     }
     77     while (p->pNext)//找到最尾部的节点
     78     {
     79         p = p->pNext;
     80     }
     81     p->pNext = p1;
     82 }
     83 //从头插入一个数据
     84 void CList::AddHead(DATA data)
     85 {
     86     SNode* p = new SNode;//申请一个堆空间,8字节
     87     p->data = data;
     88     p->pNext = m_pHead;
     89     m_pHead = p;//把新插入的节点当做头
     90 }
     91 //修改链表节点数据
     92 void CList::Modify(DATA data, DATA newData)
     93 {
     94     SNode* p = m_pHead;
     95     SNode* p1 = new SNode;
     96     if (!p)
     97     {
     98         p1->data = newData;
     99         p1->pNext = NULL;
    100         m_pHead = p1;
    101         return;
    102     }
    103     while (p)
    104     {
    105         if (p->data == data)
    106         {
    107             p->data = newData;
    108         }
    109         p = p->pNext;
    110     }
    111 }
    112 //查找某个数据
    113 bool CList::Find(DATA data)
    114 {
    115     SNode* p = m_pHead;
    116     while (p)
    117     {
    118         if (p->data == data) return true;
    119         p = p->pNext;
    120     }
    121     return false;
    122 }
    123 //删除某个节点
    124 bool CList::Delete(DATA data)
    125 {
    126     SNode* p = m_pHead;//当前节点
    127     SNode* p1 = NULL;//下一个节点
    128     if (!p) return false;//空链表直接返回
    129     if (p->data == data)//删除第一个节点
    130     {
    131         m_pHead = p->pNext;
    132         delete p;
    133         return true;
    134     }
    135     while (p)//删除中间和结尾节点
    136     {
    137         if (p->data == data)
    138         {
    139             p1->pNext = p->pNext;
    140             delete p;
    141             return true;
    142         }
    143         p1 = p;
    144         p = p->pNext;
    145     }
    146     return false;
    147 }
    148 //打印全部节点数据
    149 void CList::print()
    150 {
    151     SNode* p = m_pHead;
    152     while (p)
    153     {
    154         cout << p->data << endl;
    155         p = p->pNext;
    156     }
    157 }
    158 //交换数据的排序
    159 void CList::sortByNum(bool reverse)
    160 {
    161     SNode* p = m_pHead;
    162     SNode* m = NULL;
    163     while (p)
    164     {
    165         m = p->pNext;
    166         while (m)
    167         {
    168             if (p->data > m->data && reverse)
    169             {
    170                 DATA midData;
    171                 midData = p->data;
    172                 p->data = m->data;
    173                 m->data = midData;
    174             }
    175             else if (p->data < m->data && !reverse)
    176             {
    177                 DATA midData;
    178                 midData = p->data;
    179                 p->data = m->data;
    180                 m->data = midData;
    181             }
    182             m = m->pNext;
    183         }
    184         p = p->pNext;
    185     }
    186 }

    9.改进版

  • 相关阅读:
    禁止微信内置浏览器调整字体大小
    常用EXE文件反编译工具【转】
    C++发送HTTP请求---亲测可行(转)
    Cesium简介 [转]
    WebGL可视化地球和地图引擎:Cesium.js
    HTML5 canvas图形库 RGraph【转】
    [GitHub开源]基于HTML5实现的轻量级Google Earth三维地图引擎,带你畅游世界 【转】
    OpenGL实现多层绘制(Layered Rendering) [转]
    深度剖析OpenGL ES中的多线程和多窗口渲染技术
    OOP几大原则【转】
  • 原文地址:https://www.cnblogs.com/wjy-lulu/p/8281031.html
Copyright © 2020-2023  润新知