2021-09-30

简单的单链表c++实现

第一次写了一个单链表用了c++的类,非常简单的实现单链表。输出看着比较乱,但是可以反映代码的书写过程,写代码时的想法
大题思路:
1:先定义一个链表的节点 Node 包含一个数据data 和一个指向Node类型的指针。
2在定义一个ListNode的类来存放链表,类里定义了一个头节点指针Node* head 。
3开始写构造函数ListNode() 默认构造一个头结点 节点的data数据存放当前节点个数,然后写了一个方法size();就是返回head->data的值。
4然后为了方便刚创建出来的节点初始化所以写了一个createNode() 用来初始化新创建出来的节点。
4写一个输出所有的节点函数printAll();检测节点书否创建成功输出内容。
5 ,在逐步实现增删改查。写一个小的方法就去检测一下基本逻辑是否正确。

最后,代码的细节考虑不充分有问题的小伙伴欢迎指出,共同学习共同进步,欢迎大神指正!!!

//单链表在vs.2013上可以直接运行
#include<iostream>
using namespace std;
struct  Node{//节点类
public:
	int data;
	Node* next;
};
class ListNode{//链表类
	Node* head;
	Node* temp;//临时变量
public:
	ListNode();
	Node* createNode(int data=0);
	void printAll();
	~ListNode();
	int size(){					//返回当前节点个数
		return head->data;
	}
	void pushNode(int data);			//尾插一个节点
	void pushNode(int num, int arry[]); //插入一个数组就是重载了一下上边的pushNode(int data);
	int append(int num);				//查找数字位置 查到返回所在的节点数,没有查到返回0
	void printAppend(int num);			//直接输出节点的位置 就是把append()封装了一下
	void deleteNode(int num);			//输入删除的节点号
	void selestNode(int num,int data);  //更改第num个节点的数据;改为data;
	void selestValue(int data1, int data2); //把节点值为data1的数该为data2;
	void printNode(int num);				//输出第num个节点
	void printValue(int data);				//输出值等于data的节点
};
 ListNode::ListNode(){
	 head = createNode();//创建一个头结点	
}
 Node* ListNode::createNode(int data){
	 temp = new Node;
	 temp->data = data;
	 temp->next = NULL;
	 return temp;
 }
 void ListNode::printAll(){
	  temp = head->next;
	 while (temp!=NULL)//这个地方是temp 而不是temp->next  否则的话少输出一项内容
	 {
		 cout << temp->data << endl;
		 temp = temp->next;
	 }
 }
 ListNode::~ListNode(){
	 //delete head;//错的,不能直接释放头结点指针会造成内存泄漏
	 /*应该是这样*/
	 temp = head;
	while (head->next != NULL){
		temp = head;
		head = head->next;
		delete temp;
	}
	delete head;
 }
 void ListNode::pushNode(int data){
	//有了一个节点Head
	temp=createNode(data);
	 Node*p = head;
	 while (p->next != nullptr)p = p->next;
	 p->next = temp;
	 p = temp;
	 head->data++;
 }
 void ListNode::pushNode(int num, int *arry){
	 for (int i = 0; i < num; i++){
		 pushNode(arry[i]);
	 }
 }
 int ListNode::append(int num){
	 int flag = 0;
	 temp = head->next;
	 while (temp->next != nullptr){
		 flag++;
		 if (temp->data == num)
			 return flag;
		 temp = temp->next;
	 }
	 return 0;
 }
 void ListNode::printAppend(int num){
	 if (!append(num))cout << "等于该数字的节点不存在" << endl;
	 else
	 {
		 cout << "查找的数字在第" << append(num) << "个节点" << endl;
	 }
 }
 void ListNode::deleteNode(int num){
	 Node * p = head;
	 for (int i = 0; i < num-1; i++){
		 p = p->next;
	 }
	 Node* temp1 = p;//暂时保存一下要删除节点前的节点。
	 p = p->next;//p就是要删除的节点
	 Node* temp2 = p->next;//把删除前的节点指向删除后的哪一个节点
	 delete temp1->next;	//删除节点
	 temp1->next = temp2;	//把删除前的节点的下一个指向的节点指向删除后的节点。
 }
 void ListNode::selestNode(int num, int data){
	 //
	 temp = head; int i = 1;
	 while (i < num){
		 temp = temp->next;
		 i++;
	 }
	 temp->data = data;
	 cout << temp->data << endl; 
 }
 void ListNode::selestValue(int num, int data){
	 temp = head;
	 while (temp->data!=num){
		 temp = temp->next;
	 }
	 temp->data = data;
 }
 void ListNode::printNode(int num){
	 temp = head;
	 int i = 0;
	 while (i < num){
		 temp = temp->next;
		 i++;
	 }
	 cout <<"第"<<num<<"的值为"<< temp->data << endl;
 }
 void ListNode::printValue(int data){
	 temp = head; int i = 0;
	 while (temp->next != NULL){
		 if (temp->data == data){
			 cout << "等于" << data << "的节点为第" << i<<"个节点"<< endl;
		 }
		 i++;
		 temp = temp->next;
	 }
 }
void main(){
	ListNode list1;//默认创建个节点保存节点个数10个
	cout << "节点个数:" << list1.size() << endl;
	list1.pushNode(1);		//插入一个节点
	list1.pushNode(2);
	list1.pushNode(5);	
	
	int arr[10]{6, 2, 3, 4, 3}; //pushNode(10,int &arry[])
	list1.pushNode(10,arr);		//插入一个数组
	list1.printAll();			//打印所有的节点的值
	
	list1.printAppend(4);		//查找数字值为4的节点是第几个节点
	list1.deleteNode(3);		//删除第三个节点就删除值为5的那个节点;
	list1.printAll();
	
	list1.selestNode(5, 5);		//把第五个节点修改为5
	list1.printAll();			//打印节点信息
	
	cout << "等于2的改为12" << endl;
	list1.selestValue(2, 12);//	感觉很费劲每次都输出所有,写一个输出对应节点的方法
	list1.printAll();			//打印所有节点的数据
	
	list1.printNode(3);			//打印第三个节点的数据
	list1.printValue(3);		//打印值为3的数据的节点
	
	system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值