C++写链表一些基础的操作
来源:互联网 发布:jsp引入java文件 编辑:程序博客网 时间:2024/06/05 00:33
#include <iostream>using namespace std;
//定义节点类
class node{public: int data; node *next;};
//定义链表
class list{private: node *head; node *temp;public: list():temp(NULL),head(NULL){}//初始化节点 // ~list(); //析构 node *create_list(); //尾插法创造单链表 node *list_create(); //头插法创建单链表 bool isEmpty(); //判断链表是否为空 int length_list(); //求链表的长度 int getData(); //查找数据(按值查找位置) int getData2(); //查找数据(按位置查找值) node *insert_list(); //插入数据 node *delete_list(); //删除数据(根据数据删除) node *delete_list2(); //删除数据(根据位置删除) node *reverse_list(); //逆置单链表 node *traversal(); //遍历线性表 };
//链表的创建(尾插法)
node *list::create_list(){ node *p; head = new node; //为head创建一个node类型的空间 head->next = NULL; //让head->next指向空,防止野指针的出现 p = head; //让p与head为同一块区域 int x = 1; cout<<"请输入数据:"; while(x != 0) { temp = new node; //为temp创建一个node类型的空间 cin>>x; //输入数据 temp->data = x; //将数据放入节点中 p->next = temp; //让 p->next 指向temp p = temp; //让p与temp为同一块区域指针,为了下一次p的指向 } return head;}
链表的创建(头插法,此方法易于尾插法)
node *list::list_create(){ head = new node; //为head创建一个node类型的空间 head->next = NULL; //让head->next指向空,防止野指针的出现 int x = 1; cout<<"请输入数据:"; while(x != 0) { temp = new node; //为temp创建一个node类型的空间 cin>>x; //输入数据 temp->data = x; //将数据放入节点中 temp->next = head->next;//每次循环,将head->next与temp->next指向同一块区域 head->next = temp; //让 head->next 指向temp } return head;}
//判断链表是否为空
bool list::isEmpty(){ return head->next == NULL;}
//判断链表长度
int list::length_list(){ int i = 0; // 计数器 node *p; p = head; while(p->next) { p = p->next; i++; } return i;}
//通过数据查找位置
int list::getData(){ node *p; p = head->next; int n,i = 0; cout<<"请输入你想得到的数据:"; cin>>n; //查找数值为n的数据所在的位置 while(p != NULL) { if(p->data == n) { cout<<"你所要查找的值的位置为:"<<++i<<endl; return i; } else { p = p->next; i++; } } return i;}
//通过位置查找数据
int list::getData2(){ int n,i = 0; cout<<"请输入你想查找的位置:"; cin>>n; node *p; p = head; do{ p = p->next; i++; }while(i != n); cout<<"你想得到的数据为:"<<p->data<<endl; return p->data;}
//插入数据
node *list::insert_list(){ node *p = head; temp = new node; int i; //插入数据的位置 int n; //插入的数据 cout<<"请输入你想插入的数据:"; cin>>n; cout<<"请输入你想插入数据的位置:"; cin>>i; temp->data = n; if(i<1||i>length_list()) { cout<<"位置不存在!"<<endl; } else { int m = 1; while(m != i) { m++; p = p->next; } temp->next = p->next; //与头插法类似 p->next = temp; traversal(); } return head;}
//通过数据删除数据
node *list::delete_list(){ int x; node *p = head->next; cout<<"请输入你想删除的数据:"; cin>>x; while(p->data != x) { p = p->next; } p->data = p->next->data; //此方法无需找到前驱节点,只需要将后一个节点完全复制到前一个节点就可 p->next = p->next->next; traversal(); return head;}
//通过位置删除数据
node *list::delete_list2(){ int i,n = 0; node *p = head; cout<<"请输入你想删除的位置:"; cin>>i; while(n != i) { p = p->next; n++; } p->data = p->next->data; //此方法无需找到前驱节点,只需要将后一个节点完全复制到前一个节点就可 p->next = p->next->next; traversal(); return head;}
//逆置链表
//逆置链表方法有很多种,如:新创建一个链表,然后将原链表数据逆次放入新链表中。但是此方法对内存开销较大,不建议使用
node *list::reverse_list(){ node *p = new node; //为p申请一个新的节点 temp = new node; //为temp申请一个节点 p = head->next; //令 p 与 head->next 变成同一块节点 temp = p->next; //让 temp 与 p->next 变成同一块节点 head->next = NULL; //由于我们要做到逆置链表,因此可让head->next指向空,可将head看做"new node"类型 while(p != NULL) { p->next = head; if(temp == NULL) break; head=p; p=temp; temp=temp->next; } cout<<head->data<<" "; //这里将最后一个值输出,若不这么做,链表最后一个值无法得到 traversal(); return p;}
//遍历单链表
node *list::traversal(){ node *p = head; while(p->next->next) { p = p->next; cout<<p->data<<" "; } cout<<endl; return head;}
//函数的实现
int main(){ list com; com.create_list(); //com.isEmpty(); //com.length_list(); //com.getData(); // com.getData2(); //com.insert_list(); //com.delete_list2(); com.reverse_list(); return 0;}
阅读全文
2 0
- C++写链表一些基础的操作
- linux的一些基础操作
- 【STM32】一些基础的操作
- c一些经典的操作
- c字符串的一些操作
- 一些c的字符串操作
- python的一些基础操作和c文件的链接编译原理
- [c语言基础回顾]操作符和表达式中一些极其容易混淆的知识点
- 【C++】流操作的基础
- VC一些操作,编译的基础问题
- 关于数据库的一些基础操作
- redis的安装与一些基础操作
- SQL语句的一些基础操作
- 数据库中一些基础的操作
- 一些常用的前端基础操作
- 一些常用的前端基础操作
- 一些常用的前端基础操作
- 【php基础】mysqli的一些操作
- 面试过阿里等互联网大公司,我知道了这些套路
- Bootstrap插件(六)——警告框(alert.js)
- 操作系统启动过程
- (子域名扫描器)Knock Subdomain Scan v.4.1.0
- 2017/9/18小米机试题(桌子坐人问题)
- C++写链表一些基础的操作
- 华盛顿大学机器学习课程(个案研究法)
- Chapter 9. Sequential Containers
- Swift 3D(三维动画制作软件) v6 免费版
- SpringWeb MVC处理请求的流程:(处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件)
- 资源管理类
- 【http】相关知识
- webLogic内存溢出解决方案
- 大规模SQL注入漏洞扫描器:SQLiv