c++ List(双向链表)

c++ List(双向链表)

List(双向链表)介绍:   

     
List是一个线性链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指针将有序的元素链接起来。

     由于其结构的原因,list 随机检索的性能非常的不好,因为它不像vector 那样直接找到元素的地址,而是要从头一个一个的顺序查找,这样目标元素越靠后,它的检索时间就越长。检索时间与目标元素的位置成正比。

   虽然随机检索的速度不够快,但是它可以迅速地在任何节点进行插入和删除操作。因为list 的每个节点保存着它在链表中的位置,插入或删除一个元素仅对最多三个元素有所影响,不像vector 会对操作点之后的所有元素的存储地址都有所影响,这一点是vector 不可比拟的。

List 的特点:

(1) 不使用连续的内存空间这样可以随意地进行动态操作;

(2) 可以在内部任何位置快速地插入或删除,当然也可以在两端进行pushpop 

(3) 不能进行内部的随机访问,即不支持[ ] 操作符和vector.at() 

Lists将元素按顺序储存在链表中,与向量(vectors)相比,它允许快速的插入和删除,但是随机访问却比较慢.

1.assign() list赋值

   语法:

     void assign( input_iterator start, input_iterator end );

     //以迭代器startend指示的范围为list赋值

     void assign( size_type num, const TYPE &val );

     //赋值num个以val为值的元素。

2.back() 返回最后一个元素的引用

3.begin() 返回指向第一个元素的迭代器

4.clear() 删除所有元素

5.empty() 如果list是空的则返回true

6.end() 返回末尾的迭代器

7.erase() 删除一个元素

   语法:

     iterator erase( iterator loc );//删除loc处的元素

     iterator erase( iterator start, iterator end ); //删除startend之间的元素

8.front() 返回第一个元素的引用

9.get_allocator() 返回list的配置器

10.insert() 插入一个元素到list

   语法:

     iterator insert( iterator loc, const TYPE &val );

     //在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,

     void insert( iterator loc, size_type num, const TYPE &val );

     //定位置loc前插入num个值为val的元素

     void insert( iterator loc, input_iterator start, input_iterator end );

     //在指定位置loc前插入区间[start, end)的所有元素

11.max_size() 返回list能容纳的最大元素数量

12.merge() 合并两个list

   语法:

     void merge( list &lst );//把自己和lst链表连接在一起

     void merge( list &lst, Comp compfunction );

     //指定compfunction,则将指定函数作为比较的依据。

13.pop_back() 删除最后一个元素

14.pop_front() 删除第一个元素

15.push_back() list的末尾添加一个元素

16.push_front() list的头部添加一个元素

17.rbegin() 返回指向第一个元素的逆向迭代器

18.remove() list删除元素

   语法:

     void remove( const TYPE &val );

     //删除链表中所有值为val的元素

19.remove_if() 按指定条件删除元素

20.rend() 指向list末尾的逆向迭代器

21.resize() 改变list的大小

   语法:

     void resize( size_type num, TYPE val );

     //list的大小改变到num。被加入的多余的元素都被赋值为val22.

22.reverse() list的元素倒转

23.size() 返回list中的元素个数

24.sort() list排序

   语法:

     void sort();//为链表排序,默认是升序

     void sort( Comp compfunction );//采用指定函数compfunction来判定两个元素的大小。

25.splice() 合并两个list

   语法:

     void splice( iterator pos, list &lst );//lst连接到pos的位置

     void splice( iterator pos, list &lst, iterator del );//插入lstdel所指元素到现链表的pos

     void splice( iterator pos, list &lst, iterator start, iterator end );//startend指定范围。

26.swap() 交换两个list

   语法:

     void swap( list &lst );// 交换lst和现链表中的元素

27.unique() 删除list中重复的元素

   语法:

     void unique();//删除链表中所有重复的元素

     void unique( BinPred pr );// 指定pr,则使用pr来判定是否删除。


以下转自:http://www.cnblogs.com/fangyukuan/archive/2010/09/21/1832364.html
例子:

 

  1 // ------------------------------------------------------------------------- 
  2 //    文件名        :     list1.cpp
  3 //    创建者        :    方煜宽
  4 //   邮箱        :  fangyukuan@gmail.com
  5 //    创建时间    :    2010-9-19 15:58
  6 //    功能描述    :    STL中的list就是一双向链表,可高效地进行插入删除元素。
  7 //                
  8 // -------------------------------------------------------------------------
  9 #include "stdafx.h"
 10 #include <iostream>
 11 #include <list>
 12 using namespace std;
 13 
 14 list<int> g_list1;
 15 list<int> g_list2;
 16 
 17 //
 18 
 19 // 初始化全局链表
 20 void InitList()
 21 {
 22     //  push_back()增加一元素到链表尾
 23     g_list1.push_back(1);
 24     g_list1.push_back(2);
 25     g_list1.push_back(3);
 26 
 27     // push_front()增加一元素到链表头
 28     g_list2.push_front(6);
 29     g_list2.push_front(5);
 30     g_list2.push_front(4);
 31 }
 32 
 33 // 输出一个链表
 34 void ShowList(list<int>& listTemp)
 35 {
 36     //  size()返回链表中元素个数
 37     cout << listTemp.size() << endl;
 38 
 39     for (list<int>::iterator it = listTemp.begin(); it != listTemp.end(); ++it)
 40     {
 41         cout << *it << ' ';
 42     }
 43     cout << endl;
 44 }
 45 
 46 //
 47 
 48 // 构造函数,空链表
 49 void constructor_test0()
 50 {
 51     list<int> listTemp;
 52     cout << listTemp.size() << endl;
 53 }
 54 
 55 // 构造函数,建一个含三个默认值是0的元素的链表
 56 void constructor_test1()
 57 {
 58     list<int> listTemp(3);
 59     ShowList(listTemp);
 60 }
 61 
 62 // 构造函数,建一个含五个元素的链表,值都是1
 63 void constructor_test2()
 64 {
 65     list<int> listTemp(51);
 66     ShowList(listTemp);
 67 }
 68 
 69 // 构造函数,建一个g_list1的copy链表
 70 void constructor_test3()
 71 {
 72     list<int> listTemp(g_list1);
 73     ShowList(listTemp);
 74 }
 75 
 76 // 构造函数,listTemp含g_list1一个区域的元素[_First, _Last)
 77 void constructor_test4()
 78 {
 79     list<int> listTemp(g_list1.begin(), g_list1.end());
 80     ShowList(listTemp);
 81 }
 82 
 83 // assign()分配值,有两个重载
 84 // template <class InputIterator>
 85 // void assign ( InputIterator first, InputIterator last );
 86 // void assign ( size_type n, const T& u );
 87 void assign_test()
 88 {
 89     list<int> listTemp(51);
 90     ShowList(listTemp);
 91 
 92     listTemp.assign(43);
 93     ShowList(listTemp);
 94 
 95     listTemp.assign(++g_list1.begin(), g_list1.end());
 96     ShowList(listTemp);
 97 }
 98 
 99 // operator=
100 void operator_equality_test()
101 {
102     g_list1 = g_list2;
103     ShowList(g_list1);
104     ShowList(g_list2);
105 }
106 
107 // front()返回第一个元素的引用
108 void front_test7()
109 {
110     cout << g_list1.front() << endl;
111 }
112 
113 // back()返回最后一元素的引用
114 void back_test()
115 {
116     cout << g_list1.back() << endl;
117 }
118 
119 // begin()返回第一个元素的指针(iterator)
120 void begin_test()
121 {
122     list<int>::iterator it1 = g_list1.begin();
123     cout << *++it1 << endl;
124 
125     list<int>::const_iterator it2 = g_list1.begin();
126     it2++;
127     // (*it2)++;    //     *it2 为const 不用修改
128     cout << *it2 << endl;    
129 
130 }
131 
132 // end()返回 [最后一个元素的下一位置的指针] (list为空时end()= begin())
133 void end_test()
134 {
135     list<int>::iterator it  = g_list1.end();    // 注意是:最后一个元素的下一位置的指针
136     --it;
137     cout << *it << endl;
138 }
139 
140 //  rbegin()返回链表最后一元素的后向指针
141 void rbegin_test()
142 {
143     list<int>::reverse_iterator it = g_list1.rbegin();
144     for (; it != g_list1.rend(); ++it)
145     {
146         cout << *it << ' ';
147     }
148     cout << endl;
149 }
150 
151 //  rend()返回链表第一元素的下一位置的后向指针
152 void rend_test()
153 {
154     list<int>::reverse_iterator it = g_list1.rend();
155     --it;
156     cout << *it << endl;
157 }
158 
159 // push_back()增加一元素到链表尾
160 void push_back_test()
161 {
162     ShowList(g_list1);
163     g_list1.push_back(4);
164     ShowList(g_list1);
165 }
166 
167 // push_front()增加一元素到链表头 
168 void push_front_test()
169 {
170     ShowList(g_list1);
171     g_list1.push_front(4);
172     ShowList(g_list1);
173 }
174 
175 // pop_back()删除链表尾的一个元素
176 void pop_back_test()
177 {
178     ShowList(g_list1);
179     cout << endl;
180 
181     g_list1.pop_back();
182     ShowList(g_list1);
183 
184 }
185 
186 // pop_front()删除链表头的一元素
187 void pop_front_test()
188 {
189     ShowList(g_list1);
190     cout << endl;
191 
192     g_list1.pop_front();
193     ShowList(g_list1);
194 }
195 
196 // clear()删除所有元素
197 void clear_test()
198 {
199     ShowList(g_list1);
200     g_list1.clear();
201     ShowList(g_list1);
202 }
203 
204 // erase()删除一个元素或一个区域的元素(两个重载函数)
205 void erase_test()
206 {
207     ShowList(g_list1);
208     g_list1.erase(g_list1.begin());
209     ShowList(g_list1);
210 
211     cout << endl;
212 
213     ShowList(g_list2);
214     g_list2.erase(++g_list2.begin(), g_list2.end());
215     ShowList(g_list2);
216 }
217 
218 // remove()删除链表中匹配值的元素(匹配元素全部删除)
219 void remove_test()
220 {
221     ShowList(g_list1);
222     g_list1.push_back(1);
223     ShowList(g_list1);
224 
225     g_list1.remove(1);
226     ShowList(g_list1);
227 }
228 
229 bool myFun(const int& value) { return (value < 2); }
230 // remove_if()删除条件满足的元素(会遍历一次链表)
231 void remove_if_test()
232 {
233     ShowList(g_list1);
234     g_list1.remove_if(myFun);
235     ShowList(g_list1);
236 }
237 
238 
239 // empty()判断是否链表为空
240 void empty_test()
241 {
242     list<int> listTemp;
243     if (listTemp.empty())
244         cout << "listTemp为空" << endl;
245     else
246         cout << "listTemp不为空" << endl;
247 }
248 
249 
250 //  max_size()返回链表最大可能长度:1073741823
251 void max_size_test()
252 {
253     list<int>::size_type nMax = g_list1.max_size();
254     cout << nMax << endl;
255 }
256 
257 
258 // resize()重新定义链表长度(两重载函数):
259 void resize_test()
260 {
261     ShowList(g_list1);
262     g_list1.resize(9);        // 用默认值填补
263     ShowList(g_list1);
264     cout << endl;
265 
266     ShowList(g_list2);
267     g_list2.resize(951);    // 用指定值填补
268     ShowList(g_list2);
269 }
270 
271 // reverse()反转链表
272 void reverse_test()
273 {
274     ShowList(g_list1);
275     g_list1.reverse();
276     ShowList(g_list1);
277 }
278 
279 
280 // sort()对链表排序,默认升序(两个重载函数)
281 void sort_test()
282 {
283     list<int> listTemp;
284     listTemp.push_back(9);
285     listTemp.push_back(3);
286     listTemp.push_back(5);
287     listTemp.push_back(1);
288     listTemp.push_back(4);
289     listTemp.push_back(3);
290 
291     ShowList(listTemp);
292     listTemp.sort();
293     ShowList(listTemp);
294 
295     listTemp.sort(greater<int>());
296     ShowList(listTemp);
297 }
298 
299 // merge()合并两个升序序链表并使之成为另一个升序.
300 void merge_test1()
301 {
302     list<int> listTemp2;
303     listTemp2.push_back(3);
304     listTemp2.push_back(4);
305 
306     list<int> listTemp3;
307     listTemp3.push_back(9);
308     listTemp3.push_back(10);
309 
310     ShowList(listTemp2);
311     cout << endl;
312     ShowList(listTemp3);
313     cout << endl;
314 
315     listTemp2.merge(listTemp3);
316     ShowList(listTemp2);
317 }
318 
319 
320 bool myCmp (int first, int second)
321 return ( int(first)>int(second) ); }
322 
323 // merge()合并两个降序链表并使之成为另一个降序.
324 void merge_test2()
325 {
326     list<int> listTemp2;
327     listTemp2.push_back(4);
328     listTemp2.push_back(3);
329 
330     list<int> listTemp3;
331     listTemp3.push_back(10);
332     listTemp3.push_back(9);
333 
334     ShowList(listTemp2);
335     cout << endl;
336     ShowList(listTemp3);
337     cout << endl;
338 
339     // listTemp2.merge(listTemp3, greater<int>());    // 第二个参数可以是自己定义的函数如下
340     listTemp2.merge(listTemp3, myCmp);
341     ShowList(listTemp2);
342 }
343 
344 // splice()对两个链表进行结合(三个重载函数),结合后第二个链表清空
345 // void splice ( iterator position, list<T,Allocator>& x );
346 // void splice ( iterator position, list<T,Allocator>& x, iterator i );
347 // void splice ( iterator position, list<T,Allocator>& x, iterator first, iterator last );
348 void splice_test()
349 {
350     list<int> listTemp1(g_list1);
351     list<int> listTemp2(g_list2);
352 
353     ShowList(listTemp1);
354     ShowList(listTemp2);
355     cout << endl;
356     
357     // 
358     listTemp1.splice(++listTemp1.begin(), listTemp2);
359     ShowList(listTemp1);
360     ShowList(listTemp2);
361 
362     // 
363     listTemp1.assign(g_list1.begin(), g_list1.end());
364     listTemp2.assign(g_list2.begin(), g_list2.end());
365     listTemp1.splice(++listTemp1.begin(), listTemp2, ++listTemp2.begin());
366     ShowList(listTemp1);
367     ShowList(listTemp2);
368 
369     // 
370     listTemp1.assign(g_list1.begin(), g_list1.end());
371     listTemp2.assign(g_list2.begin(), g_list2.end());
372     listTemp1.splice(++listTemp1.begin(), listTemp2, ++listTemp2.begin(), listTemp2.end());
373     ShowList(listTemp1);
374     ShowList(listTemp2);
375 
376 }
377 
378 //  insert()在指定位置插入一个或多个元素(三个重载函数)
379 // iterator insert ( iterator position, const T& x );
380 // void insert ( iterator position, size_type n, const T& x );
381 // template <class InputIterator>
382 // void insert ( iterator position, InputIterator first, InputIterator last );
383 void insert_test()
384 {
385     list<int> listTemp1(g_list1);
386     ShowList(listTemp1);
387     listTemp1.insert(listTemp1.begin(), 51);
388     ShowList(listTemp1);
389     cout << endl;
390 
391     list<int> listTemp2(g_list1);
392     ShowList(listTemp2);
393     listTemp2.insert(listTemp2.begin(), 951);
394     ShowList(listTemp2);
395     cout << endl;
396 
397     list<int> listTemp3(g_list1);
398     ShowList(listTemp3);
399     listTemp3.insert(listTemp3.begin(), g_list2.begin(), g_list2.end());
400     ShowList(listTemp3);
401 
402 }
403 
404 // swap()交换两个链表(两个重载)
405 void swap_test()
406 {
407     ShowList(g_list1);
408     ShowList(g_list2);
409     cout << endl;
410 
411     g_list1.swap(g_list2);
412     ShowList(g_list1);
413     ShowList(g_list2);
414 }
415 
416 bool same_integral_part (double first, double second)
417 return ( int(first)==int(second) ); }
418 
419 // unique()删除相邻重复元素
420 void unique_test()
421 {
422     list<int> listTemp;
423     listTemp.push_back(1);
424     listTemp.push_back(1);
425     listTemp.push_back(4);
426     listTemp.push_back(3);
427     listTemp.push_back(5);
428     listTemp.push_back(1);
429     list<int> listTemp2(listTemp);
430     
431     ShowList(listTemp);
432     listTemp.unique();    // 不会删除不相邻的相同元素
433     ShowList(listTemp);
434     cout << endl;
435 
436     listTemp.sort();
437     ShowList(listTemp);
438     listTemp.unique();
439     ShowList(listTemp);
440     cout << endl;
441 
442     listTemp2.sort();
443     ShowList(listTemp2);
444     listTemp2.unique(same_integral_part);
445     ShowList(listTemp2);
446 
447 }
448 
449 // 主函数,下面要测试哪个就把那个注释去掉即可
450 int _tmain(int argc, _TCHAR* argv[])
451 {
452     InitList();
453 //     ShowList(g_list1);
454 //     ShowList(g_list2);
455 
456 //     constructor_test0();
457 //     constructor_test1();
458 //     constructor_test2();
459 //     constructor_test3();
460 //     constructor_test4();
461 //     assign_test();
462 //     operator_equality_test();
463 //     front_test7();
464 //     back_test();
465 //     begin_test();
466 //     end_test();
467 //     rbegin_test();
468 //     rend_test();
469 //     push_back_test();
470 //     push_front_test();
471 //     pop_back_test();
472 //     pop_front_test();
473 //     clear_test();
474 //     erase_test();
475 //      remove_test();
476 //     remove_if_test();
477 //     empty_test();
478 //     max_size_test();
479 //     resize_test();
480 //     reverse_test();
481 //     sort_test();
482 //     merge_test1();
483 //     merge_test2();
484 //     splice_test();
485 //     insert_test();
486 //     swap_test();
487 //     unique_test();
488     return 0;
489 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arrays.deepToString的使用

今天看别人的代码引用了这个函数&#xff0c;发现原来遍历数组(非List&#xff0c;例如&#xff1a;int [][] 类型等)可以直接调用Arrays.deepToString(数组名)可以直接输出结果&#xff0c;以前还傻不啦叽的的转换成List数组或者是for循环遍历。 Integer[][] allMovieComment…

C++ Vector(向量容器)

Vector介绍C Vector&#xff08;向量容器&#xff09; 是一个线性顺序结构。相当于数组&#xff0c;但其大小可以不预先指定&#xff0c;并且自动扩展。它可以像数组一样被操作&#xff0c;由于它的特性我们完全可以将vector 看作动态数组。 在创建一个vector 后&#xff0c;它…

出现特殊分隔符无法分隔解决方案

今天处理文本数据时候遇到这种文本用空格和tab正则匹配没有作用&#xff0c;后来问了同事发现可以用“\\uf8f5”去匹配。 待处理文本&#xff1a; A abbr.安  A-10IInone.美空军主力近距离空中支援攻击机&#xff0c;无愧为“坦克杀手”。 A-12none.夭折的美海…

java英文单词单复数转换

package steam;import java.util.*; import java.util.regex.*; /*** * 单复数转换类* 2018年12月30日*/public class Inflector {private static final Pattern UNDERSCORE_PATTERN_1 Pattern.compile("([A-Z])([A-Z][a-z])");private static final Pattern UNDERS…

最全英语单词下载地址

这两天搜集英文单词做词干化处理&#xff0c;虽说standford-NLP可以处理&#xff0c;但是效率不高&#xff0c;自己动手找单词做映射表&#xff0c;找单词真的痛苦&#xff01;&#xff01;&#xff01;放出以下地址最为保存和分享 github&#xff1a; https://github.com/dw…

NLP英文缩写词性含义

1. CC Coordinating conjunction 连接词 2. CD Cardinal number 基数词 3. DT Determiner 限定词&#xff08;如this,that,these,those,such&#xff0c;不定限定词&#xff1a;no,some,any,each,every,enough,either,neither,all,both,half,sever…

redis通过expire设置存活期注意问题

今天老大检查之前所做的项目发现项目过期数据仍然残留并没有删除&#xff0c;本以为自己设置了存活期就不用管数据了会自动删除掉&#xff0c;啊&#xff0c;果然自己太马虎了&#xff0c;如果是传统的kv类型&#xff0c;通过expire(key&#xff0c;alive_time)没有错误&#x…

次幂函数取模算法

次幂函数取模算法 高次幂函数取模算法 在平常的工作学习中&#xff0c;我们经常需要用到求取一个数字或者幂运算的余数&#xff0c;尤其在密码学中最为常用的RSA算法就经常要用到这种运算&#xff0c;我们称之为高次幂函数的取模运算。 在本篇文章中&#xff0c;将会首先介绍运…

【转载保存】接口压力测试安装与使用

https://blog.csdn.net/qq_26525215/article/details/79182674

mysql日期格式转换

select * from news where DATE_FORMAT(news_time, %Y-%m-%d %k:%i:%s) < " "" curDate "

java单例模式双重检查

public class Singleton {private static volatile Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton null) {synchronized (Singleton.class) {if (singleton null) {singleton new Singleton();}}}return singleton;} }

mysql 常用操作

mysql 常用操作&#xff08;整理&#xff09; 标签&#xff1a; MYSQL常用操作 2013-07-22 16:37 10846人阅读 评论(0) 收藏 举报 本文章已收录于&#xff1a; 分类&#xff1a; MYSQL 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 目录(?)[]…

协同过滤算法UserCF和ItemCF优缺点对比

UserCF&#xff1a; 性能&#xff1a;适用于用户较少的场合&#xff0c;如果用户很多&#xff0c;计算用户相似度矩阵代价很大。领域&#xff1a;时效性较强&#xff0c;用户个性化兴趣不太明显的领域。实时性&#xff1a;用户有新行为&#xff0c;不一定造成推荐结果的立即变…

deque

STL之deque容器详解Deque 容器 deque容器是C标准模版库(STL,Standard Template Library)中的部分内容。deque容器类与vector类似&#xff0c;支持随机访问和快速插入删除&#xff0c;它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是&#xff0c;deque还支持从…

【转载保存】MySQL时间、字符串、时间戳互相转换

时间转字符串 select date_format(now(), ‘%Y-%m-%d %H:%i:%s’); 结果&#xff1a;2018-05-02 20:24:10 时间转时间戳 select unix_timestamp(now()); 结果&#xff1a;1525263383 字符串转时间 select str_to_date(‘2018-05-02’, ‘%Y-%m-%d %H’); 结果&#xff1a;20…

RMQ算法,求区间最值

poj 3264 Balanced Lineup 2016-07-27 11:15 49人阅读 评论(0) 收藏 举报分类&#xff1a;RMQ(Range MinimumMaximum Quer)&#xff08;4&#xff09; Balanced LineupTime Limit: 5000MS Memory Limit: 65536KTotal Submissions: 45854 Accepted: 21536Case Time Limit: 2000M…

【转载】向量空间模型VSM及余弦计算

向量空间模型VSM及余弦计算 向量空间模型的基本思想是把文档简化为以特征项&#xff08;关键词&#xff09;的权重为分量的N维向量表示。 这个模型假设词与词间不相关&#xff08;这个前提造成这个模型无法进行语义相关的判断&#xff0c;向量空间模型的缺点在于关键词之间的…

机器学习入门学习视频和书籍(笔记保存)

我娜姐推荐的资料和我要看的资料记录下&#xff1a; 吴恩达151课时:https://study.163.com/course/courseLearn.htm?courseId1004570029#/learn/video?lessonId1049052745&courseId1004570029机器学习书籍&#xff1a;《Machine Learning in Action》,Peter Harington&a…

【美文保存】nosql数据库对比以及如何巧妙利用redis来提高效率?

1. MySqlMemcached架构的问题 实际MySQL是适合进行海量数据存储的&#xff0c;通过Memcached将热点数据加载到cache&#xff0c;加速访问&#xff0c;很多公司都曾经使用过这样的架构&#xff0c;但随着业务数据量的不断增加&#xff0c;和访问量的持续增长&#xff0c;我们遇…

嵌入式开发——DMA外设到内存

学习目标 加强理解DMA数据传输过程加强掌握DMA的初始化流程掌握DMA数据表查询理解源和目标的配置理解数据传输特点能够动态配置源数据学习内容 需求 uint8_t data; 串口接收(&data);data有数据了 实现串口的数据接收,要求采用dma的方式。 数据交互流程 CPU配置好DMA外…