C++ 单链表基本操作

一:目的

用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");








  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值