C++實現 簡單 單鏈表

轉自: http://blog.csdn.net/wonggonghong/article/details/21527577

? 我們首先建立一個<List.h>頭文件,聲明一個單鏈表結構:

#include "List.h"

[cpp]?view plain?copy
  1. //創建一個單鏈表結構,包含一些常見的操作??
  2. #ifndef?_List_H_??
  3. #define?_List_H_??
  4. ??
  5. #include?<iostream>??
  6. ??
  7. struct?Node{??
  8. ????int?element;??//節點存儲信息可以根據需要修改!??
  9. ????Node*?next;??
  10. };??
  11. ??
  12. Node*?CreateLists();?//創建一個空表,并返回表頭??
  13. void?DeleteLists(Node*?head);?//刪除表頭為head的該鏈表??
  14. bool?IsLast(Node*?P);??
  15. Node*?Find(int?X,?Node*?head);??
  16. Node*?FindPrevious(int?X,?Node*?head);??
  17. void?Delete(int?X,?Node*?head);??
  18. void?Insert(Node*?P,?int?X);?//在節點P后面插入X??
  19. void?OutputLists(Node*?head);?//輸出鏈表中所有元素的值??
  20. ??
  21. #endif??????

??? 然后在<List.cpp>文件里實現頭文件中的鏈表操作:

#include "List.cpp"

[cpp]?view plain?copy
  1. #include?"list.h"??
  2. ??
  3. Node*?CreateLists()??
  4. {??
  5. ????Node*?head?=?new?Node;??
  6. ????head->next?=?NULL;??
  7. ????return?head;??
  8. }??
  9. ??
  10. void?DeleteLists(Node*?head)??
  11. {??
  12. ????Node*?P?=?head->next,?*temp;??
  13. ????head->next?=?NULL;??
  14. ????while(P)??
  15. ????{??
  16. ????????temp?=?P->next;??
  17. ????????delete?P;??
  18. ????????P?=?temp;??
  19. ????}??
  20. }??
  21. ??
  22. bool?IsLast(Node*?P)??
  23. {??
  24. ????return?P->next?==?NULL;??
  25. }??
  26. ??
  27. Node*?Find(int?X,?Node*?head)??
  28. {??
  29. ????Node*?P?=?head->next;??
  30. ????while(P?&&?P->element!=X)??
  31. ????????P?=?P->next;??
  32. ????return?P;??
  33. }??
  34. ??
  35. Node*?FindPrevious(int?X,?Node*?head)??
  36. {??
  37. ????Node*?P=head;??
  38. ????while(P->next?&&?P->next->element!=X)??
  39. ????????P=P->next;??
  40. ????return?P;??
  41. }??
  42. ??
  43. void?Delete(int?X,?Node*?head)??
  44. {??
  45. ????Node*?P?=?FindPrevious(X,head),?*temp;?//如果沒找到X,則返回的是鏈表最后一項??
  46. ????if(P->next)??
  47. ????{??
  48. ????????temp?=?P->next;??
  49. ????????P->next?=?temp->next;??
  50. ????????delete?temp;??
  51. ????}??
  52. }??
  53. ??
  54. void?Insert(Node*?P,?int?X)??
  55. {??
  56. ????Node*?tempX?=?new?Node;??
  57. ????tempX->element?=?X;??
  58. ????tempX->next?=?P->next;??
  59. ????P->next?=?tempX;??
  60. }??
  61. ??
  62. void?OutputLists(Node*?head)??
  63. {??
  64. ????Node*?P?=?head->next;??
  65. ????while(P)??
  66. ????{??
  67. ????????std::cout<<P->element<<"???";??
  68. ????????P?=?P->next;??
  69. ????}??
  70. ????std::cout<<std::endl;??
  71. }??
???????? 最后,我們用一段 main 代碼驗證一下正確性:

[cpp]?view plain?copy
  1. #include?<iostream>??
  2. #include?<assert.h>??
  3. #include?"list.h"??
  4. ??
  5. using?namespace?std;??
  6. ??
  7. int?main()??
  8. {??
  9. ????int?Date[8]?=?{2,9,5,8,15,32,7,4};??
  10. ????Node?*head?=?CreateLists();??
  11. ????Node?*P?=?head;??
  12. ????for(int?i=0;i<8;i++)??
  13. ????{??
  14. ????????Insert(P,Date[i]);??
  15. ????????P?=?P->next;??
  16. ????}??
  17. ????cout<<"打印出鏈表中所有元素:\n";??
  18. ????OutputLists(head);??
  19. ????if(IsLast(P))??
  20. ????????cout<<"該Lists的最后一個節點為:"<<P->element<<endl;??
  21. ????else??
  22. ????????cout<<"P不是最后一個節點!!P等于:"<<P->element<<endl;??
  23. ??????
  24. ????if(Find(15,head))??
  25. ????????cout<<"Find函數在該Lists中找到了值為15的節點!!!\n";??
  26. ????else??
  27. ????????cout<<"Find函數沒找到值為15的節點!!\n";??
  28. ??
  29. ????cout<<"FindPrevious函數找到節點15的前一個節點為:"<<FindPrevious(15,head)->element<<endl;??
  30. ????cout<<"而節點15的前一個節點應該為“8”!\n";??
  31. ??
  32. ????Delete(8,?head);??
  33. ????if(Find(8,head))??
  34. ????????cout<<"Delete(8,?head)后,在該Lists中找到了值為8的節點!!!\n";??
  35. ????else??
  36. ????????cout<<"Delete(8,?head)后,Find函數沒找到值為8的節點!!\n";??
  37. ??
  38. ????DeleteLists(head);???
  39. ????if(head->next)??
  40. ????????cout<<"DeleteLists函數未成功刪除鏈表!!\n";??
  41. ????else??
  42. ????????cout<<"鏈表已經為空!DeleteLists函數沒有問題!!!\n";??
  43. ????return?0;??
  44. }??
結果如下:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384423.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384423.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384423.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ffmpeg音視頻基礎知識

ffmpeg音視頻基礎知識前言一、圖像的基礎知識二、視頻編碼基礎知識1.視頻和圖片之間的關系2.為什么要編碼&#xff1f;3.什么是編碼&#xff1f;視頻相關專業術語提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言…

數據結構之單鏈表——C++模板類實現

轉自&#xff1a;http://blog.csdn.net/Mrx_Nh/article/details/60471647 單鏈表定義 [cpp] view plaincopy #ifndef SinglyLinkedListEDLIST_H_INCLUDED #define SinglyLinkedListEDLIST_H_INCLUDED #include <bits/stdc.h> using namespace std; template&l…

Linux系統編程(一)

Linux系統編程&#xff08;一&#xff09;一、進程和程序二、內存布局內核空間用戶空間三、進程狀態四、環境變量五、進程共享一、進程和程序 程序&#xff1a;是指編譯好的二進制文件&#xff0c;存儲在磁盤中&#xff0c;不占用系統資源。 進程&#xff1a;是系統進行資源分…

Linux的SOCKET編程 簡單演示

轉載&#xff1a;http://blog.csdn.net/hguisu/article/details/7445768/ Linux的SOCKET編程詳解 1. 網絡中進程之間如何通信 進 程通信的概念最初來源于單機系統。由于每個進程都在自己的地址范圍內運行&#xff0c;為保證兩個相互通信的進 程之間既互不干擾又協調一致工作&a…

Unity(一)必然事件

【MonoBehaviour 類】&#xff08;一&#xff09;必然事件一、必然事件是什么&#xff1f;二、常用函數執行順序1.Awake2.Start3.update4.FixedUpdate三、Awake和start區別一、必然事件是什么&#xff1f; 在Unity中必然事件也稱腳本生命周期&#xff0c;是指在Unity腳本在喚醒…

正則匹配函數

轉載&#xff1a;http://blog.csdn.net/ithomer/article/details/6130806 1.int regcomp(regex_t *compiled, const char *pattern, int cflags) 這個函數把指定的規則表達式pattern編譯成一種特定的數據格式compiled&#xff0c;這樣可以使匹配更有效。函數regexec會使用這個數…

Linux系統編程(二)孤兒進程和僵尸進程

Linux系統編程&#xff08;二&#xff09;一、exec函數族1.exec函數二、孤兒進程和僵尸進程三、wait和waitpid1.wait函數2.waitpid函數一、exec函數族 exec函數使用時&#xff0c;改程序的用戶空間的代碼和數據會被新程序給替代&#xff0c;會從新程序的啟動例程開始。調用exe…

linux下c/c++實例之十socket簡單應用

轉自&#xff1a;http://blog.csdn.net/taiyang1987912/article/details/49738351 一、簡介 通過socket掃描本機打開的tcp端口號&#xff0c;模擬用戶名、密碼登錄服務器的過程、socket文件傳輸及模仿http服務器。 二、詳解 1、Linux下tcp端口掃描 &#xff08;1&#xff09;…

Linux系統編程(三)進程間的通信

Linux系統編程&#xff08;三&#xff09;進程間的通信一、為什么需要進程之間的通信&#xff08;IPC&#xff09;&#xff1f;二、管道1.概念2.特質3.原理4.局限性5.代碼2.讀入數據三、共享存儲映射注意事項父子進程通信一、為什么需要進程之間的通信&#xff08;IPC&#xff…

使用mmap實現大文件的復制:單進程與多進程情況

單線程和多進程實現文件的復制&#xff08;mmap方法&#xff09; mmap實現大文件的復制單線程和多進程實現文件的復制&#xff08;mmap方法&#xff09;一、單線程實現二、多進程實現一般文件實現方法&#xff1a;1.讀取&#xff08;fread&#xff09;要復制的文件2.寫入&#…

exec 函數族

轉自&#xff1a;http://www.cnblogs.com/mickole/p/3187409.html linux系統編程之進程&#xff08;五&#xff09;&#xff1a;exec系列函數&#xff08;execl,execlp,execle,execv,execvp)使用 本節目標&#xff1a; exec替換進程映像exec關聯函數組&#xff08;execl、execl…

Linux系統編程(四)信號

Linux系統編程&#xff08;四&#xff09;信號一、什么是信號&#xff1f;1、信號的本質2、信號來源硬件來源軟件來源二、常見信號1.可靠信號和不可靠信號2、不可靠信號主要有以下問題:3、可靠信號與不可靠信號注冊機制三、信號處理方式四、信號處理過程五、未決信號和阻塞信號…

SIGCHLD信號回收子進程

SIGCHLD信號回收子進程代碼問題注意點代碼 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h>void handler(int signo) {int status; pid_t pid;while ((pid waitpid(0, &status…

Wait waitpid

轉自&#xff1a;http://www.cnblogs.com/mickole/p/3187770.html linux系統編程之進程&#xff08;六&#xff09;&#xff1a;父進程查詢子進程的退出,wait,waitpid 本節目標&#xff1a; 僵進程SIGCHLDwaitwaitpid 一&#xff0c;僵尸進程 當一個子進程先于父進程結束運行時…

Linux系統編程(五)時序競態

時序競態產生原因改進總結產生原因 #include <cstdio> #include <stdio.h> #include <sys/time.h> #include <unistd.h> #include <signal.h> #include <stdlib.h> #include <errno.h>void catch_sigalrm(int signo) {printf("…

Linux C++ 簡單爬蟲

轉載&#xff1a;http://blog.csdn.net/orthocenterchocolate/article/details/38665937 方便易用&#xff0c;傳入URL&#xff0c;返回對應頁面的內容 [cpp] view plaincopy #include <iostream> #include <string> #include <netdb.h> #include <…

Linux系統編程(六)守護進程

Linux系統編程&#xff08;六&#xff09;守護進程一、進程組概念二、會話創建會話的條件守護進程概念守護進程模型創建守護進程一、進程組 概念 進程組&#xff0c;也稱之為作業。代表一個或多個進程的集合。每個進程都屬于一個進程組。 當父進程&#xff0c;創建子進程的時…

TCP 客戶端和服務器端

轉自&#xff1a;http://blog.csdn.net/itcastcpp/article/details/39047265 前面幾篇中實現的client每次運行只能從命令行讀取一個字符串發給服務器&#xff0c;再從服務器收回來&#xff0c;現在我們把它改成交互式的&#xff0c;不斷從終端接受用戶輸入并和server交互。 [cp…

利用多線程實現linux下C語言的聊天室程序:

轉載&#xff1a;http://www.360doc.com/content/16/0421/11/478627_552531090.shtml 利用多線程實現linux下C語言的聊天室程序&#xff1a; 客戶端代碼&#xff1a; threadsend線程負責客戶端消息的發送&#xff1b; threadrecv線程負責客戶端接受服務器端的消息。 [html] v…

Linux系統編程(七)消息隊列

Linux系統編程&#xff08;七&#xff09;消息隊列一、什么是消息隊列二、消息隊列內部原理三、實現消息隊列的收發1.發送消息隊列2.接收消息隊列四、消息隊列與命名管道的比較一、什么是消息隊列 消息隊列提供了一種從一個進程向另一個進程發送一個數據塊的方法。每個數據塊都…