• 【数据结构】链表的十三种操作


    菜单 

    1. //0、显示菜单
    2. void menu()
    3. {
    4. cout << "菜单:" << endl;
    5. cout << "1.初始化或重置链表" << endl;
    6. cout << "2.销毁链表" << endl;
    7. cout << "3.清空链表" << endl;
    8. cout << "4.链表长度" << endl;
    9. cout << "5.指定位置的元素值" << endl;
    10. cout << "6.链表已存在元素的位序" << endl;
    11. cout << "7.求输入元素的直接前驱" << endl;
    12. cout << "8.求输入元素的直接后继" << endl;
    13. cout << "9.在第i个位置插入一个元素" << endl;
    14. cout << "10.删除第i个元素" << endl;
    15. cout << "11.输出有的链表元素" << endl;
    16. cout << "12.初始化并用头插法(或尾插法)输入元素" << endl;
    17. cout << "13.实现单链表的逆序存放" << endl;
    18. cout << "-1.退出程序" << endl;
    19. }

    定义结构体 

    1. // 定义结构体
    2. typedef struct DNode
    3. {
    4. EleType data;
    5. struct DNode *prior,*next;
    6. }Dnode,*DLinkList;

    1.初始化或重置链表

    1. // 1、初始化双向链表
    2. bool Init_linkList(DLinkList& L)
    3. {
    4. L = (DNode*) malloc(sizeof(DNode));
    5. if(L == nullptr)
    6. return false;
    7. else
    8. {
    9. L->prior = nullptr;
    10. L->next = nullptr;
    11. return true;
    12. }
    13. }

    2.销毁链表

    注:销毁链表时需要循环释放每个结点所占用的空间。

    1. // 2、销毁链表
    2. void DestroyLink(DNode *L){//为了避免内存泄露,每次创建链表运行完程序应将创建的链表销毁,避免内存泄露
    3. DNode *temp;
    4. DNode *pre;
    5. temp= L->next;
    6. while(temp != nullptr){
    7. pre = temp;
    8. temp = temp->next;
    9. free(pre);
    10. }
    11. free(L);
    12. }

    3.清空链表

    1. // 3、清空双链表
    2. bool ClearDLink(DNode* L)
    3. {
    4. DNode *temp;
    5. DNode *pre;
    6. temp= L->next;
    7. while(temp != nullptr){
    8. pre = temp;
    9. temp = temp->next;
    10. free(pre);
    11. }
    12. L->next = nullptr;
    13. L->prior = nullptr;
    14. if(L->next == nullptr)
    15. return true;
    16. else
    17. return false;
    18. }

    4.链表长度

    1. // 4、求双链表长度
    2. int LengthLink(Dnode*L)
    3. {
    4. int cnt = 0;
    5. DNode *temp;
    6. temp= L->next;
    7. while(temp != nullptr){
    8. temp = temp->next;
    9. cnt ++;
    10. }
    11. return cnt;
    12. }

    5.指定位置的元素值

    1. // 5、指定位置元素
    2. int elem_check(Dnode*L,int address)// 判断这个位置是否合法
    3. {
    4. int cnt = LengthLink(L);
    5. if(address <= 0 || address > cnt) return false;
    6. return true;
    7. }
    8. EleType ElemLink(Dnode *L,int address)// 如果这个位置合法,则进行查找
    9. {
    10. int cnt = 0;
    11. EleType flag;
    12. DNode *temp;
    13. DNode *pre;
    14. temp= L->next;
    15. while(temp != nullptr){
    16. pre = temp;
    17. temp = temp->next;
    18. if(++ cnt == address) flag = pre->data;
    19. }
    20. return flag;
    21. }

    6.链表已存在元素的位序

    1. // 6.链表已存在元素的位序
    2. bool judge_address(Dnode *L,EleType elem)
    3. {
    4. DNode *temp;
    5. temp= L->next;
    6. while(temp != nullptr){
    7. if(temp->data == elem) return true;
    8. temp = temp->next;
    9. }
    10. return false;
    11. }
    12. int AddressLink(Dnode *L,EleType elem)
    13. {
    14. int address = 0;
    15. int cnt = 0;
    16. DNode *temp;
    17. temp= L->next;
    18. while(temp != nullptr){
    19. cnt ++;
    20. if(temp->data == elem) address = cnt;
    21. temp = temp->next;
    22. }
    23. return address;
    24. }

    7.求输入元素的直接前驱

    1. // 7.求输入元素的直接前驱
    2. bool judge_before(Dnode *L,EleType elem)
    3. {
    4. DNode *temp;
    5. temp= L->next;
    6. while(temp != nullptr){
    7. if(temp->data == elem)
    8. {
    9. if(temp->prior == L) return false;
    10. else return true;
    11. }
    12. temp = temp->next;
    13. }
    14. return false;
    15. }
    16. EleType BeforeLink(Dnode *L,EleType elem)
    17. {
    18. EleType flag;
    19. DNode *temp;
    20. temp= L->next;
    21. while(temp != nullptr){
    22. if(temp->data == elem)
    23. {
    24. flag = temp->prior->data;
    25. }
    26. temp = temp->next;
    27. }
    28. return flag;
    29. }

    求前驱是指,输入一个元素值(而不是位置),求该元素在顺序表中的直接前驱元素值。

    8.求输入元素的直接后继

    1. // 8.求输入元素的直接后继
    2. bool judge_after(Dnode *L,EleType elem)
    3. {
    4. DNode *temp;
    5. temp= L->next;
    6. while(temp != nullptr){
    7. if(temp->data == elem)
    8. {
    9. if(temp->next == nullptr) return false;
    10. else return true;
    11. }
    12. temp = temp->next;
    13. }
    14. return false;
    15. }
    16. EleType AfterLink(Dnode *L,EleType elem)
    17. {
    18. EleType flag;
    19. DNode *temp;
    20. temp= L->next;
    21. while(true){
    22. if(temp->data == elem)
    23. {
    24. flag = temp->next->data;
    25. break;
    26. }
    27. temp = temp->next;
    28. }
    29. return flag;
    30. }

    求后继是指:输入一个元素值(而不是位置),求该元素在顺序表中的直接后继元素值。

    9.在第i个位置插入一个元素

    1. // 9.在第i个位置插入一个元素
    2. void LinkListInit(Dnode* L,int address,EleType elem)
    3. {
    4. Dnode* l;
    5. l = (DNode*) malloc(sizeof(DNode));
    6. l->data = elem;
    7. int cnt = 0;
    8. DNode *temp;
    9. temp= L->next;
    10. int len = LengthLink(L);
    11. if(address == len + 1)
    12. {
    13. temp = L;
    14. while(true)
    15. {
    16. if(temp->next == nullptr)
    17. {
    18. l->next = nullptr;
    19. l->prior = temp;
    20. temp->next = l;
    21. return;
    22. }
    23. temp = temp->next;
    24. }
    25. }
    26. else
    27. {
    28. while(temp != nullptr){
    29. cnt ++;
    30. if(cnt == address)
    31. {
    32. l->next = temp;
    33. l->prior = temp->prior;
    34. temp->prior->next = l;
    35. temp->prior = l;
    36. return;
    37. }
    38. temp = temp->next;
    39. }
    40. }
    41. }

    10.删除第i个元素

    1. // 10.删除第i个元素
    2. void drop(Dnode* L,int address)
    3. {
    4. int cnt = 0;
    5. DNode *temp;
    6. temp= L->next;
    7. int len = LengthLink(L);
    8. if(len == address)
    9. {
    10. while(true)
    11. {
    12. if(temp->next == nullptr)
    13. {
    14. temp->prior->next = nullptr;
    15. free(temp);
    16. return;
    17. }
    18. temp = temp->next;
    19. }
    20. }
    21. while(temp != nullptr){
    22. cnt ++;
    23. if(cnt == address)
    24. {
    25. temp->prior->next = temp->next;
    26. temp->next->prior = temp->prior;
    27. free(temp);
    28. return;
    29. }
    30. temp = temp->next;
    31. }
    32. }

    11.输出有的链表元素

    1. // 11.输出有的链表元素
    2. void show(Dnode* L)
    3. {
    4. DNode *temp;
    5. temp= L->next;
    6. while(temp != nullptr){
    7. cout << temp->data << " ";
    8. temp = temp->next;
    9. }
    10. cout << endl;
    11. }

    12.清空链表并用头插法(或尾插法)输入元素

    1. // 12.清空并用头插法(或尾插法)输入元素
    2. void show12(Dnode* L,int sum)
    3. {
    4. ClearDLink(L);
    5. for(int i = 0; i < sum; i ++)
    6. {
    7. Dnode* l;
    8. l = (DNode*) malloc(sizeof(DNode));
    9. EleType num;
    10. cin >> num;
    11. l->data = num;
    12. l->next = L->next;
    13. l->prior = L;
    14. if(L->next != nullptr)
    15. {
    16. L->next->prior = l;
    17. }
    18. L->next = l;
    19. }
    20. show(L);
    21. }

    13.实现单链表的逆序存放

    1. void show13(Dnode* L)
    2. {
    3. queue q;
    4. DNode *temp;
    5. DNode *p;
    6. temp= L->next;
    7. while(temp != nullptr){
    8. q.push(temp->data);
    9. p = temp;
    10. temp = temp->next;
    11. free(p);
    12. }
    13. L->next = nullptr;
    14. L->prior = nullptr;
    15. while(!q.empty())
    16. {
    17. EleType s;
    18. s = q.front();
    19. q.pop();
    20. DNode* l;
    21. l = (Dnode*) malloc(sizeof(DNode));
    22. l->data = s;
    23. l->next = L->next;
    24. l->prior = L;
    25. if(L->next != nullptr)
    26. {
    27. L->next->prior = l;
    28. }
    29. L->next = l;
    30. }
    31. }

    要求:所有的提示语和输出语句不允许出现在自定义的函数中(输出函数除外),只能在main函数中出现提示语。

    注意,每个功能模块一定要考虑非法的情况,并作出相应的提示,例如:求前驱,要分别能够测试第一个元素的前驱、其他正常的元素的前驱、输入一个在表中不存在的元素求其前驱,这三种情况应给出相应的提示语和结果值;插入和删除时要考虑插入或删除的位置是否合法等。

    代码 

    1. #include
    2. using namespace std;
    3. typedef int EleType;
    4. // 定义结构体
    5. typedef struct DNode
    6. {
    7. EleType data;
    8. struct DNode *prior,*next;
    9. }Dnode,*DLinkList;
    10. //0、显示菜单
    11. void menu()
    12. {
    13. cout << "菜单:" << endl;
    14. cout << "1.初始化或重置链表" << endl;
    15. cout << "2.销毁链表" << endl;
    16. cout << "3.清空链表" << endl;
    17. cout << "4.链表长度" << endl;
    18. cout << "5.指定位置的元素值" << endl;
    19. cout << "6.链表已存在元素的位序" << endl;
    20. cout << "7.求输入元素的直接前驱" << endl;
    21. cout << "8.求输入元素的直接后继" << endl;
    22. cout << "9.在第i个位置插入一个元素" << endl;
    23. cout << "10.删除第i个元素" << endl;
    24. cout << "11.输出有的链表元素" << endl;
    25. cout << "12.初始化并用头插法(或尾插法)输入元素" << endl;
    26. cout << "13.实现单链表的逆序存放" << endl;
    27. cout << "-1.退出程序" << endl;
    28. }
    29. // 1、初始化双向链表
    30. bool Init_linkList(DLinkList& L)
    31. {
    32. L = (DNode*) malloc(sizeof(DNode));
    33. if(L == nullptr)
    34. return false;
    35. else
    36. {
    37. L->prior = nullptr;
    38. L->next = nullptr;
    39. return true;
    40. }
    41. }
    42. // 2、销毁链表
    43. void DestroyLink(DNode *L){//为了避免内存泄露,每次创建链表运行完程序应将创建的链表销毁,避免内存泄露
    44. DNode *temp;
    45. DNode *pre;
    46. temp= L->next;
    47. while(temp != nullptr){
    48. pre = temp;
    49. temp = temp->next;
    50. free(pre);
    51. }
    52. free(L);
    53. }
    54. // 3、清空双链表
    55. bool ClearDLink(DNode* L)
    56. {
    57. DNode *temp;
    58. DNode *pre;
    59. temp= L->next;
    60. while(temp != nullptr){
    61. pre = temp;
    62. temp = temp->next;
    63. free(pre);
    64. }
    65. L->next = nullptr;
    66. L->prior = nullptr;
    67. if(L->next == nullptr)
    68. return true;
    69. else
    70. return false;
    71. }
    72. // 4、求双链表长度
    73. int LengthLink(Dnode*L)
    74. {
    75. int cnt = 0;
    76. DNode *temp;
    77. temp= L->next;
    78. while(temp != nullptr){
    79. temp = temp->next;
    80. cnt ++;
    81. }
    82. return cnt;
    83. }
    84. // 5、指定位置元素
    85. int elem_check(Dnode*L,int address)
    86. {
    87. int cnt = LengthLink(L);
    88. if(address <= 0 || address > cnt) return false;
    89. return true;
    90. }
    91. EleType ElemLink(Dnode *L,int address)
    92. {
    93. int cnt = 0;
    94. EleType flag;
    95. DNode *temp;
    96. DNode *pre;
    97. temp= L->next;
    98. while(temp != nullptr){
    99. pre = temp;
    100. temp = temp->next;
    101. if(++ cnt == address) flag = pre->data;
    102. }
    103. return flag;
    104. }
    105. // 6.链表已存在元素的位序
    106. bool judge_address(Dnode *L,EleType elem)
    107. {
    108. DNode *temp;
    109. temp= L->next;
    110. while(temp != nullptr){
    111. if(temp->data == elem) return true;
    112. temp = temp->next;
    113. }
    114. return false;
    115. }
    116. int AddressLink(Dnode *L,EleType elem)
    117. {
    118. int address = 0;
    119. int cnt = 0;
    120. DNode *temp;
    121. temp= L->next;
    122. while(temp != nullptr){
    123. cnt ++;
    124. if(temp->data == elem) address = cnt;
    125. temp = temp->next;
    126. }
    127. return address;
    128. }
    129. // 7.求输入元素的直接前驱
    130. bool judge_before(Dnode *L,EleType elem)
    131. {
    132. DNode *temp;
    133. temp= L->next;
    134. while(temp != nullptr){
    135. if(temp->data == elem)
    136. {
    137. if(temp->prior == L) return false;
    138. else return true;
    139. }
    140. temp = temp->next;
    141. }
    142. return false;
    143. }
    144. EleType BeforeLink(Dnode *L,EleType elem)
    145. {
    146. EleType flag;
    147. DNode *temp;
    148. temp= L->next;
    149. while(temp != nullptr){
    150. if(temp->data == elem)
    151. {
    152. flag = temp->prior->data;
    153. }
    154. temp = temp->next;
    155. }
    156. return flag;
    157. }
    158. // 8.求输入元素的直接后继
    159. bool judge_after(Dnode *L,EleType elem)
    160. {
    161. DNode *temp;
    162. temp= L->next;
    163. while(temp != nullptr){
    164. if(temp->data == elem)
    165. {
    166. if(temp->next == nullptr) return false;
    167. else return true;
    168. }
    169. temp = temp->next;
    170. }
    171. return false;
    172. }
    173. EleType AfterLink(Dnode *L,EleType elem)
    174. {
    175. EleType flag;
    176. DNode *temp;
    177. temp= L->next;
    178. while(true){
    179. if(temp->data == elem)
    180. {
    181. flag = temp->next->data;
    182. break;
    183. }
    184. temp = temp->next;
    185. }
    186. return flag;
    187. }
    188. // 9.在第i个位置插入一个元素
    189. void LinkListInit(Dnode* L,int address,EleType elem)
    190. {
    191. Dnode* l;
    192. l = (DNode*) malloc(sizeof(DNode));
    193. l->data = elem;
    194. int cnt = 0;
    195. DNode *temp;
    196. temp= L->next;
    197. int len = LengthLink(L);
    198. if(address == len + 1)
    199. {
    200. temp = L;
    201. while(true)
    202. {
    203. if(temp->next == nullptr)
    204. {
    205. l->next = nullptr;
    206. l->prior = temp;
    207. temp->next = l;
    208. return;
    209. }
    210. temp = temp->next;
    211. }
    212. }
    213. else
    214. {
    215. while(temp != nullptr){
    216. cnt ++;
    217. if(cnt == address)
    218. {
    219. l->next = temp;
    220. l->prior = temp->prior;
    221. temp->prior->next = l;
    222. temp->prior = l;
    223. return;
    224. }
    225. temp = temp->next;
    226. }
    227. }
    228. }
    229. // 10.删除第i个元素
    230. void drop(Dnode* L,int address)
    231. {
    232. int cnt = 0;
    233. DNode *temp;
    234. temp= L->next;
    235. int len = LengthLink(L);
    236. if(len == address)
    237. {
    238. while(true)
    239. {
    240. if(temp->next == nullptr)
    241. {
    242. temp->prior->next = nullptr;
    243. free(temp);
    244. return;
    245. }
    246. temp = temp->next;
    247. }
    248. }
    249. while(temp != nullptr){
    250. cnt ++;
    251. if(cnt == address)
    252. {
    253. temp->prior->next = temp->next;
    254. temp->next->prior = temp->prior;
    255. free(temp);
    256. return;
    257. }
    258. temp = temp->next;
    259. }
    260. }
    261. // 11.输出有的链表元素
    262. void show(Dnode* L)
    263. {
    264. DNode *temp;
    265. temp= L->next;
    266. while(temp != nullptr){
    267. cout << temp->data << " ";
    268. temp = temp->next;
    269. }
    270. cout << endl;
    271. }
    272. // 12.初始化并用头插法(或尾插法)输入元素
    273. void show12(Dnode* L,int sum)
    274. {
    275. ClearDLink(L);
    276. for(int i = 0; i < sum; i ++)
    277. {
    278. Dnode* l;
    279. l = (DNode*) malloc(sizeof(DNode));
    280. EleType num;
    281. cin >> num;
    282. l->data = num;
    283. l->next = L->next;
    284. l->prior = L;
    285. if(L->next != nullptr)
    286. {
    287. L->next->prior = l;
    288. }
    289. L->next = l;
    290. }
    291. show(L);
    292. }
    293. void show13(Dnode* L)
    294. {
    295. queue q;
    296. DNode *temp;
    297. DNode *p;
    298. temp= L->next;
    299. while(temp != nullptr){
    300. q.push(temp->data);
    301. p = temp;
    302. temp = temp->next;
    303. free(p);
    304. }
    305. L->next = nullptr;
    306. L->prior = nullptr;
    307. while(!q.empty())
    308. {
    309. EleType s;
    310. s = q.front();
    311. q.pop();
    312. DNode* l;
    313. l = (Dnode*) malloc(sizeof(DNode));
    314. l->data = s;
    315. l->next = L->next;
    316. l->prior = L;
    317. if(L->next != nullptr)
    318. {
    319. L->next->prior = l;
    320. }
    321. L->next = l;
    322. }
    323. }
    324. int main()
    325. {
    326. DLinkList L;
    327. int op = -1;
    328. bool flag = false;
    329. menu();
    330. while(op != 0)
    331. {
    332. cout << "<------------------------------>" << endl << "请输入你的选择:";
    333. cin >> op;
    334. if(op == 1)
    335. {
    336. // 1.初始化或重置链表
    337. if(Init_linkList(L))
    338. {
    339. cout << "初始化成功!" << endl;
    340. flag = true;
    341. }
    342. else cout << "初始化失败!" << endl;
    343. }else if(op == 2)
    344. {
    345. if(!flag)
    346. {
    347. cout << "链表已被销毁" << endl;
    348. continue;
    349. }
    350. // 2.销毁链表
    351. DestroyLink(L);
    352. flag = false;
    353. cout << "成功销毁链表!" << endl;
    354. }else if(op == 3)
    355. {
    356. // 3.清空链表
    357. if(!flag)
    358. {
    359. cout << "链表已被销毁" << endl;
    360. continue;
    361. }
    362. if(ClearDLink(L))
    363. cout << "清空链表成功!" << endl;
    364. else
    365. cout << "清空链表失败!" << endl;
    366. }else if(op == 4)
    367. {
    368. // 4.链表长度
    369. if(!flag)
    370. {
    371. cout << "链表已被销毁" << endl;
    372. continue;
    373. }
    374. int l = LengthLink(L);
    375. cout << "链表长度为:" << l << endl;
    376. }else if(op == 5)
    377. {
    378. // 5.指定位置的元素值
    379. if(!flag)
    380. {
    381. cout << "链表已被销毁" << endl;
    382. continue;
    383. }
    384. int address;
    385. cout << "请输入位置:";
    386. cin >> address;
    387. if(elem_check(L,address))
    388. {
    389. EleType ans = ElemLink(L,address);
    390. cout << "第" << address << "位置的元素为:" << ans << endl;
    391. }
    392. else
    393. {
    394. cout << "这个位置没有元素!" << endl;
    395. }
    396. }else if(op == 6)
    397. {
    398. // 6.链表已存在元素的位序
    399. if(!flag)
    400. {
    401. cout << "链表已被销毁" << endl;
    402. continue;
    403. }
    404. EleType elem;
    405. cout << "请输入查找的元素:";
    406. cin >> elem;
    407. if(judge_address(L,elem))
    408. {
    409. int address = AddressLink(L,elem);
    410. cout << "值" << elem << "的位置在" << address << endl;
    411. }
    412. else
    413. {
    414. cout << "链表中不存在这个值!" << endl;
    415. }
    416. }else if(op == 7)
    417. {
    418. // 7.求输入元素的直接前驱
    419. if(!flag)
    420. {
    421. cout << "链表已被销毁" << endl;
    422. continue;
    423. }
    424. EleType elem;
    425. cout << "请输入查找的元素:";
    426. cin >> elem;
    427. if(judge_before(L,elem))
    428. {
    429. EleType ans;
    430. ans = BeforeLink(L,elem);
    431. cout << "元素" << elem << "的直接前驱为:" << ans << endl;
    432. }
    433. else
    434. {
    435. cout << "这个值没有直接前驱!" << endl;
    436. }
    437. }else if(op == 8)
    438. {
    439. // 8.求输入元素的直接后继
    440. if(!flag)
    441. {
    442. cout << "链表已被销毁" << endl;
    443. continue;
    444. }
    445. EleType elem;
    446. cout << "请输入查找的元素:";
    447. cin >> elem;
    448. if(judge_after(L,elem))
    449. {
    450. EleType ans;
    451. ans = AfterLink(L,elem);
    452. cout << "元素" << elem << "的直接后继为:" << ans << endl;
    453. }
    454. else
    455. {
    456. cout << "这个值没有直接后继!" << endl;
    457. }
    458. }
    459. else if(op == 9)
    460. {
    461. // 9.在第i个位置插入一个元素
    462. if(!flag)
    463. {
    464. cout << "链表已被销毁" << endl;
    465. continue;
    466. }
    467. int len;
    468. len = LengthLink(L);
    469. int address;
    470. cout << "输入插入位置:";
    471. cin >> address;
    472. EleType elem;
    473. cout << "输入插入元素:";
    474. cin >> elem;
    475. if(address < 1 || address > len + 1)
    476. {
    477. cout << "这个位置不能插入元素" << endl;
    478. }
    479. else
    480. {
    481. LinkListInit(L,address,elem);
    482. cout << "插入成功!" << endl;
    483. }
    484. }
    485. else if(op == 10)
    486. {
    487. // 10.删除第i个元素
    488. if(!flag)
    489. {
    490. cout << "链表已被销毁" << endl;
    491. continue;
    492. }
    493. int address;
    494. cout << "请输入元素位置:";
    495. cin >> address;
    496. int len = LengthLink(L);
    497. if(address < 1 || address > len)
    498. {
    499. cout << "这个位置不能删除"<< endl;
    500. continue;
    501. }
    502. drop(L,address);
    503. cout << "删除成功!" << endl;
    504. }
    505. else if(op == 11)
    506. {
    507. // 11.输出有的链表元素
    508. if(!flag)
    509. {
    510. cout << "链表已被销毁" << endl;
    511. continue;
    512. }
    513. show(L);
    514. }
    515. else if(op == 12)
    516. {
    517. // 12.初始化并用头插法(或尾插法)输入元素
    518. if(!flag)
    519. {
    520. cout << "链表已被销毁" << endl;
    521. continue;
    522. }
    523. cout << "初始化并用头插法(或尾插法)输入元素" << endl;
    524. cout << "请输入插入元素个数:";
    525. int sum;
    526. cin >> sum;
    527. show12(L,sum);
    528. }
    529. else if(op == 13)
    530. {
    531. // 13.实现单链表的逆序存放
    532. if(!flag)
    533. {
    534. cout << "链表已被销毁" << endl;
    535. continue;
    536. }
    537. show13(L);
    538. }
    539. else if(op == -1) break;
    540. }
    541. cout << "程序结束!" << endl;
    542. }

  • 相关阅读:
    lspci源码
    嵌入Circle映射和逐维小孔成像反向学习的鲸鱼优化算法-附代码
    手机能做静态二维码吗?用手机做二维码的教程
    基于微信小程序新冠疫苗预约系统(微信小程序)
    .net餐厅管理系统数据层餐厅服务类添加删除菜品
    解决vue中接收到后端图片路径传值相同
    C语言变量、指针的内存关系
    以太网媒体接口MII/RMII/SMII/GMII/RGMII/SGMII
    网络安全(黑客)自学笔记&学习路线
    Linux中系统定时任务
  • 原文地址:https://blog.csdn.net/littlegengjie/article/details/134039810