c/c++单链表的基本操作

单链表的基本操作

#include<iostream>
//@lining
using namespace std;
typedef int Type;
//构建一个结点类
class Node
{
public:
	int data;
	Node* next;
};
//单链表类
class LinkList
{
public:
	LinkList();   //构造链表
	~LinkList();  //析构销毁链表
	void CreatLinkList();//创建链表
	void PrintLinkList();//打印链表
	int GetLinkListLength();//获取链表长度
	bool IsEmpty();///判断链表是否为空
	void InsertHead(Type data);//头部插入
	void InsertRear(Type data);//尾部插入
	void InsertAppoint(Type data,int n);//指定位置插入
	void DeleteHead();//删除头结点
	void DeleteRear();//删除尾结点
	void DeleteAppoint(Type data);//删除指定结点
	void DeleteAll();//删除所有数据
	Node* Find(Type data);//查找结点
private:
	Node* head;//头结点
};
LinkList::LinkList()
{
	head = new Node;
	head->data = 0;
	head->next = NULL;
}
LinkList::~LinkList()
{
	delete head;
}
void LinkList::CreatLinkList()
{
	//尾插法建立链表
	Node* pnew,*ptemp=head;
	cout << "请输入数据建立链表,输入数字1003作为建立链表的结束" << endl;
	//建立第一个新结点
	pnew = new Node;
	cin >> pnew->data;
	pnew->next = NULL;
	while (pnew->data != 1003)//输入1003停止建立链表
	{
		ptemp->next = pnew;//当前结点指向新节点
		ptemp = pnew;      //新结点成为新的当前结点
		pnew = new Node;
		cin >> pnew->data;
		pnew->next = NULL;
	}
}
void LinkList::PrintLinkList()
{
	if (IsEmpty())
	{
		cout << "链表为空" << endl;
		return;
	}
	cout << "链表的打印结果为:" << endl;
	Node* p = head->next;
	while (p)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}
int LinkList::GetLinkListLength()
{
	if (IsEmpty())
	{
		cout << "链表的长度为0" << endl;
	}
	Node* p = head;
	int count=0;
	while (p->next)
	{
		p = p->next;
		count++;
	}
	return count;
}
//判断链表是否为空
bool LinkList::IsEmpty()
{
	if (!head||!head->next)
	{
		return true;
	}
	else
	{
		return false;
	}
}
//在头部插入指定元素
void LinkList::InsertHead(Type data)
{
	Node* newNode = new Node;
	newNode->data = data;
	if (!head)//若头结点为空
	{
		head = newNode;
	}
	newNode->next = head->next;
	head->next = newNode;
}
//在尾部插入指定元素
void LinkList::InsertRear(Type data)
{
	Node* newNode = new Node;
	newNode->data = data;
	Node* p = head->next;
	if (!head)//若头结点为空
	{
		head = newNode;
	}
	else
	{
		while (p->next)
		{
			p = p->next;
		}
		p->next = newNode;
		newNode->next = NULL;
	}
}
//在指定位置插入指定元素
void LinkList::InsertAppoint(Type data,int n)
{
	Node* newNode = new Node;
	newNode->data = data;
	if (n > GetLinkListLength())
	{
		cout << "指定位置超出链表范围" << endl;
	}
	else
	{
		int count = 1;
		Node* p = head;
		while (count < n)
		{
			p = p->next;
			count++;
		}
		newNode->next = p->next;
		p->next = newNode;
	}
}
//删除第一个结点
void LinkList::DeleteHead()
{
	if (IsEmpty())
	{
		cout << "链表为空" << endl;
	}
	else
	{
		Node* p = head->next;
		head->next = p->next;
	}
}
//删除最后一个结点
void LinkList::DeleteRear()
{
	if (IsEmpty())
	{
		cout << "链表为空" << endl;
	}
	else
	{
		Node* p = head;
		Node* ptemp = head;
		while (p->next)
		{
			ptemp = p;
			p = p->next;
		}
		ptemp->next = NULL;
	}
}
//删除指定结点
void LinkList::DeleteAppoint(Type data)
{
	if (IsEmpty())
	{
		cout << "链表为空" << endl;
	}
	else
	{
		Node* p = head;
		Node* ptemp = head;
		while (p->data!=data)
		{
			ptemp = p;
			p = p->next;
		}
		ptemp->next = p->next;
	}
}
//删除所有结点
void LinkList::DeleteAll()
{
	if (IsEmpty())
	{
		cout << "链表为空" << endl;
	}
	else
	{
		Node* p = head->next;
		Node* ptemp = p;
		while (p)
		{
			ptemp = p;
			p = p->next;
			head->next = p;//连接头结点
			delete ptemp;
		}
	}
}
//查找指定元素
Node* LinkList::Find(Type data)
{
	Node* p = head;
	if (IsEmpty())
	{
		cout << "链表为空" << endl;
		return NULL;
	}
	int count=0;
	while (p->data != data && p->next)
	{
		p = p->next;
		count++;
	}
	cout << "查找元素在第"<<count<<"个位置" << endl;
	cout << "查找元素的值为:" << endl;
	return p;
}
void test()
{
	LinkList p;
	p.CreatLinkList();
	if (!p.IsEmpty())
	{
		p.PrintLinkList();
		p.GetLinkListLength();
		cout << p.Find(2)->data << endl;
		//p.DeleteAll();
		p.PrintLinkList();
		int n = 0;
		cout << "请输入要头插入的数据:" << endl;
		cin >> n;
		p.InsertHead(n);
		p.PrintLinkList();
		int m = 0;
		cout << "请输入要尾插入的数据:" << endl;
		cin >> m;
		p.InsertRear(m);
		p.PrintLinkList();
		int l = 100000;
		p.InsertAppoint(l, 2);
		p.PrintLinkList();
	}
	else
	{
		cout << "链表为空" << endl;
	}
}
int main()
{
	test();
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值