一:目的
用C++实现单链表的基本操作;
一:实现
1. 首先定义单链表的结构和类,书写在LinkList.h中
# include <iostream>
# include <string>
using namespace std;
//定义节点的value
struct Info
{
string name; //姓名
int id; //学号
Info(string info_name, int info_id):name(info_name),id(info_id){}
};
//定义节点
struct Node
{
Info val; //节点的值
Node * p_next; //指向下一个节点
Node(Info input):val(input),p_next(NULL){};
};
class LinkList
{
public:
LinkList(); //构造函数
~LinkList(); //析构函数
void InsertHead(Info val); //从头节点插入
void Insert(Info val, int pos); //插入
void Remove(Info val); //删除节点
void Reverse(); //翻转链表
int Find(Info val); //查找位置
int Get_Length(); //获取长度
void Print(); //打印链表
private:
Node *head; //头节点
int length; //链表长度
};
2. 在LinkList中进行实现
# include "LinkList.h"
//构造函数,进行初始化
LinkList::LinkList()
{
head = NULL; //将头结点指向空指针
length = 0;
}
//析构函数,进行释放
LinkList::~LinkList()
{
Node * p;
for(int i = 0;i<length; i ++)
{
p = head; //将指针指向头结点
head = head->p_next; //将头结点指针指向下一个
delete p;
}
}
//获取长度
int LinkList::Get_Length()
{
return length;
}
//打印链表
void LinkList::Print()
{
if(head == NULL)
{
cout << "空指针" << endl;
return;
}
Node *p = head;
while(p!=NULL)
{
cout << "Id:" << p->val.id << ";Name" << p->val.name << endl;
p = p->p_next;
}
}
//从头部插入节点
void LinkList::InsertHead(Info val)
{
Node *node = new Node(val); //新建节点
node->p_next = head;
head = node;
length++;
}
//插入
void LinkList::Insert(Info val, int pos)
{
if(pos<0 || pos>length)
{
cout<<"插入位置不能小于0;不能大于链表长度"<<endl;
return;
}
int index = 1;
Node * temp = new Node(val);
Node * p = head;
while(index < pos && p!=NULL)
{
p = p->p_next;
index++;
}
if(p == NULL)
{
cout<<"插入失败"<<endl;
return;
}
temp->p_next = p->p_next;
p->p_next = temp;
length++;
}
//查找节点
int LinkList::Find(Info val)
{
Node * p = head;
int pos = 0;
while(p!=NULL)
{
if(p->val.id == val.id && p->val.name == val.name)
return pos;
p=p->p_next;
pos++;
}
return -1;
}
//移除节点
void LinkList::Remove(Info val)
{
Node * p = head;
if(p->val.id == val.id && p->val.name == val.name)
{
head = p->p_next;
delete p;
length--;
return;
}
Node *p_pre = p;
p=p->p_next;
while(p!=NULL)
{
if(p->val.id == val.id && p->val.name == val.name)
{
p_pre->p_next = p->p_next;
delete p;
length--;
return;
}
p_pre=p_pre->p_next;
p=p->p_next;
}
}
//翻转链表
void LinkList :: Reverse()
{
if(head == NULL)
return;
Node *p = head;
Node *p_next = p->p_next;
Node * temp = NULL;
while(p_next!=NULL)
{
temp = p_next->p_next;
p_next->p_next = p;
p= p_next;
p_next = temp;
}
head->p_next = NULL;
head = p;
}
3. 简单的测试
LinkList linklist;
Info val1("赵一",1), val2("王二",2),val3("张三",3),val4("李四",4);
Info val5("赵五",5), val6("王六",6),val7("张七",7),val8("李八",8);
linklist.InsertHead(val1);
linklist.InsertHead(val2);
linklist.InsertHead(val3);
linklist.InsertHead(val4);
linklist.InsertHead(val5);
linklist.InsertHead(val6);
linklist.InsertHead(val7);
linklist.InsertHead(val8);
int pos = linklist.Find(val3);
linklist.Print();
linklist.Remove(val3);
cout<<"==========================="<<endl;
linklist.Print();
linklist.Reverse();
cout<<"==========================="<<endl;
linklist.Print();
system("pause");