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.mzph.cn/news/384423.shtml

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

相关文章

ffmpeg音视频基础知识

ffmpeg音视频基础知识前言一、图像的基础知识二、视频编码基础知识1.视频和图片之间的关系2.为什么要编码&#xff1f;3.什么是编码&#xff1f;视频相关专业术语提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言…

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脚本在唤醒…

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…

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 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;消息队列一、什么是消息队列二、消息队列内部原理三、实现消息队列的收发1.发送消息队列2.接收消息队列四、消息队列与命名管道的比较一、什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都…

基于Linux的SOCKET编程之TCP半双工Client-Server聊天程序

转自&#xff1a;http://blog.csdn.net/apollon_krj/article/details/53398448#0-tsina-1-64987-397232819ff9a47a7b7e80a40613cfe1 所谓半双工通信&#xff0c;即通信双方都可以实现接发数据&#xff0c;但是有一个限制&#xff1a;只能一方发一方收&#xff0c;之后交换收发对…

智能算法(GA、DBO等)求解阻塞流水车间调度问题(BFSP)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

Linux socket编程,对套接字进行封装

转自&#xff1a;http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html 下面是对socket操作的封装&#xff0c;因为在Linux下写中文到了windows里面会乱码&#xff0c;所以注释用英文来写&#xff0c;有空再查下解决方法吧 socket.h #ifndef SOCKET_H #define SOCKET_…

Linux系统编程(九)线程同步

Linux系统编程&#xff08;九&#xff09;线程同步一、什么是线程同步&#xff1f;二、互斥量三、条件变量pthread_cond_wait函数pthread_cond_signal函数生产者和消费者模型一、什么是线程同步&#xff1f; 线程同步&#xff0c;指一个线程发出某一功能调用时&#xff0c;在没…

linux网络编程(一)网络基础传输知识

linux网络编程&#xff08;一&#xff09;网络传输基础知识一、什么是协议&#xff1f;二、使用步骤典型协议2.网络应用程序设计模式C/S模式B/S模式优缺点3.分层模型4.TCP/IP四层模型通信过程5.协议格式数据包封装以太网帧格式ARP数据报格式IP段格式UDP数据报格式TCP数据报格式…

Linux 进程学习(四)------ sigaction 函数

转自&#xff1a;http://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html 使用 sigaction 函数&#xff1a; signal 函数的使用方法简单&#xff0c;但并不属于 POSIX 标准&#xff0c;在各类 UNIX 平台上的实现不尽相同&#xff0c;因此其用途受 到了一定的限制…

linux网络编程(二)高并发服务器

linux网络编程&#xff08;二&#xff09;高并发服务器错误处理高并发服务器多进程并发服务器客户端错误处理 #include "wrap.h"int Bind(int fd, const struct sockaddr* sa, socklen_t salen) {int ret;if ((ret bind(fd, sa, salen)) < 0){perror("bind…