#include <iostream>
#include <vector>
using namespace std;
template <typename DataType>
struct Node
{
DataType data;
struct Node* next;
};
template <typename DataType>
class LinkList
{
public:
LinkList();//初始化链表1
LinkList(DataType a[], int l);//初始化链表2
bool If_Empty();//判断链表是否为空
void Print_List();//打印链表
int Length();//计算链表的长度
DataType Find_Value_By_Pos(int pos);//按位置查找数据
int Find_Pos_By_Value(DataType value);//返回数据的位置
void Insert_value_By_Pos(int pos,DataType value);//按位置插入数据
void Delete_Value_By_Pos(int pos);//按位置删除数据
private:
Node<DataType>* first;
};
template <typename DataType>
LinkList <DataType>::LinkList() {
first = new Node<DataType>;
first->next = nullptr;
}//初始化链表1
template <typename DataType>
LinkList <DataType>::LinkList(DataType a[],int l) { //尾插法,每次将新申请的结点插在终端结点的后面
first = new Node<DataType>;
Node <DataType>* r = first, * s = nullptr;
for (int i = 0; i < l; i++)
{
s = new Node<DataType>; s->data = a[i];
r->next = s; r = s;
}
r->next = nullptr;
}
template <typename DataType>
bool LinkList<DataType>::If_Empty() {
if (first->next==nullptr)
{
return 1;
}
else
{
return 0;
}
}//判断链表是否为空
template <typename DataType>
void LinkList<DataType>::Print_List() {
Node <DataType>* p = first->next;
while (p!=nullptr)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}//打印链表
template <typename DataType>
int LinkList<DataType>::Length() {
Node <DataType>* p = first->next;
int pos = 0;
while (p!=nullptr)
{
pos++;
p = p->next;
}
return pos;
}//计算链表的长度
template <typename DataType>
DataType LinkList<DataType>::Find_Value_By_Pos(int pos) {
Node <DataType>* p = first->next;
int count = 1;
while (p!=nullptr&&count<pos)
{
count++;
p = p->next;
}
if (p==nullptr)
{
throw"查找位置错误";
}
else
{
return p->data;
}
}//按位置查找数据
template <typename DataType>
int LinkList<DataType>::Find_Pos_By_Value(DataType value) {
Node <DataType>* p = first->next;
int pos = 1;
while (p!=nullptr)
{
if (p->data==value)
{
return pos;
}
else
{
p = p->next;
pos++;
}
}
}//返回数据的位置
template <typename DataType>
void LinkList<DataType>::Insert_value_By_Pos(int pos,DataType value) {
Node <DataType>* p = first, *s = nullptr;
int count = 0;
while (p!=nullptr&&count<pos-1)
{
p = p->next;
count++;
}
if (p==nullptr)
{
throw"插入位置错误";
}
else
{
s = new Node<DataType>; s->data = value;
s->next = p->next; p->next = s;
cout << "位置" << pos << "插入的数据是" << s->data;
}
}//按位置插入数据
template <typename DataType>
void LinkList<DataType>::Delete_Value_By_Pos(int pos) {
Node <DataType>* p = first, * q = nullptr;
int count = 1;
while (p!=nullptr&&count<pos-1)
{
p = p->next;
count++;
}
if (p==nullptr)
{
throw"删除位置错误";
}
else
{
q = p->next; int value = p->data; //把p->next把指向下一个数据结点的指针赋给一个空结点q(假设这个结点是l)
cout << "删除的位置" << pos << "的元素是" << value<<"(由于已删除无法看到真实数字,此处显示的为未被使用的地址)";
p->next = q->next; delete q; //把1这个结点与p->next这个指针连接起来 //q结点作为中间结点作用达到后删除,释放空间
}
}//按位置删除数据
int main() {
int a[5] = { 1,2,3,4,5 };
LinkList<int> L{ a,5 };
L.Print_List();
cout << endl;
cout << "链表是否为空:" << L.If_Empty() << endl<<endl;
cout << "链表长度为" << L.Length() <<endl <<endl;
cout << "位置3的元素是:"<<L.Find_Value_By_Pos(3)<<endl;
cout << endl;
cout << "元素5所在位置是:"<<L.Find_Pos_By_Value(5)<<endl<<endl;
cout << "在位置3插入元素6" << endl;
L.Insert_value_By_Pos(3, 6);
cout << endl;
cout << "插入后的链表是";
L.Print_List();
cout << endl << endl;
cout << "删除位置1的元素" << endl;
L.Delete_Value_By_Pos(1);
cout << endl;
cout << "删除后的链表是";
L.Print_List();
return 0;
}
数据结构与算法之C++实现(单链表的建立和使用)
最新推荐文章于 2022-10-17 10:49:22 发布