《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.改进版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值