C++实现链表

头文件:定义节点和链表数据类型。实现构造、插入、删除等操作。

#pragma once
#include <cstdlib>
#include <iostream>
using std::cout;
using std::endl;
struct linknode
{
	int val;
	linknode* next;
};

class linklist
{
public:
	linklist();
	~linklist();
	bool insert(int); //尾插  值为int
	bool insert(int, int);
	bool erase(int);  //删除第i个节点
	void print(void);
	int getsize();
	void reverse();
private:
	linknode* head;
	int size;
};

linklist::linklist()
{
	size = 0;
	head = new linknode;
	head->next = NULL;
	head->val = 0;
}
linklist::~linklist()
{
	if (size == 0)
		return;
	linknode* cur = head->next;
	while (cur)
	{
		head->next = cur->next;
		linknode* nex = cur->next;
		delete cur;
		cur = nex;
	}
	size = 0;
}
//尾插
bool linklist::insert(int val)
{
	linknode* nd = new linknode;
	nd->val = val;
	nd->next = NULL;

	linknode* cur = head->next;
	linknode* pre = head;

	while (cur)
	{
		pre = cur;
		cur = cur->next;
	}
	pre->next = nd;
	size++;
	return true;
}
//在第pos个位置插入节点,值为val
bool linklist::insert(int pos, int val)
{
	if (pos > size)
	{
		cout << "越界,未能插入第" << pos << "个" << "节点" << endl;
		return false;
	}
	linknode* nd = new linknode;
	nd->val = val;
	int tmp = size;
	linknode* pre = head;
	linknode* cur = head->next;
	for (int i = 0; i <= tmp; i++)
	{
		if (pos == i)
		{
			pre->next = nd;
			nd->next = cur;
			size++;
			break;
		}
		pre = cur;
		cur = cur->next;
	}
	return true;
}
//删除第pos个节点
bool linklist::erase(int pos)
{
	if (pos > size)
	{
		cout << "越界,未能删除第"<<pos<<"个"<<"节点" << endl;
		return false;
	}
	int tp = size;
	linknode* pre = head;
	linknode* cur = head->next;
	linknode* nex = cur->next;
	for (int i=0;i<tp;i++)
	{
		if (pos == i)
		{
			pre->next = cur->next;
			delete cur;
			size--;
			break;
		}
		pre = cur;
		cur = cur->next;
	}
	return true;
}
void linklist::print(void)
{
	if (head->next == NULL)
	{
		cout << "链表为空" << endl;
		return;
	}
	else
	{
		linknode* cur = head->next;
		while (cur)
		{
			cout << cur->val << "->";
			cur = cur->next;
		}
		cout << endl;
	}
}
int linklist::getsize()
{
	return size;
}
void linklist::reverse()
{
	if (head->next == NULL)
	{
		return;
	}
	linknode* pre = head->next; //第0个节点
	linknode* cur = pre->next;  //第1个节点,cur可能是个空指针
	pre->next = NULL;
	while (cur)
	{
		linknode* nex = cur->next;
		cur->next = pre;
		pre = cur;
		cur = nex;
	}
	head->next = pre;

}

.C文件:测试成员函数功能

#include <iostream>
#include "linklist.h"
using namespace std;

int main()
{
	//测试插入
	linklist L;
	L.insert(0);
	L.insert(1);
	L.insert(2, 2);
	L.insert(3);
	cout << "链表节点个数: "<<L.getsize() << endl;
	L.print();

	//测试删除
	L.erase(1);
	cout << "删除节点后链表节点个数: "<<L.getsize() << endl;
	L.print();

	//测试反转链表
	L.reverse();
	cout << "反转链表后:" << endl;
	L.print();

	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值