单链表的基本操作

前言:最近复习数据结构,回归C++的怀抱~

代码环境:

Dev-C++ 5.11
在这里插入图片描述

定义:

/*构建节点类*/ 
class Node
{
	public:
		int data;   //数据域
		Node *next; //指针域 
};
/*构建单链表类*/
class LinkList
{
	public:
		LinkList();                                 //构建一个单链表 
		~LinkList();                                //销毁一个单链表
		void CreateLinkList(int n);                 //创建一个单链表
		void TravalLinkList();                      //遍历线性表
		int GetLength();                            //获取线性表长度
		bool IsEmpty();                             //判断是否为空 
		ElemType *Find(DataType data);              //查找结点值 
		void InsertElemAtEnd(DataType data);        //在尾部插入指定元素 
		void InsertElemAtIndex(DataType data,int n);//在指定位置插入指定元素 
		void InsertElemAtHead(DataType data);       //在头部插入指定元素 
		void DeleteElemAtEnd();                     //在尾部删除元素 
		void DeleteAll();                           //删除所有元素
		void DeleteElemAtPoint(DataType data);      //删除指定数据
		void DeleteElemAtHead();                    //在头部删除结点 
		void DeleteElemBetweenData(DataType data1,DataType data2);      //删除介定给定值的元素 
		void Reverse();                             //就地逆置 
		void Reverse_table();                       //更形象的就地逆置 
		void SortHigher();                          //递增排序 
		void SortHigherCout();                      //递增输出 
		
   private:
        ElemType *head;                           //头结点 
};

基本操作的实现:

/* 构造函数 */ 
LinkList::LinkList()
{
 	head = new ElemType;
 	head -> data= 0;           //将头结点的数据部分定义为0 
 	head -> next = NULL;        //初始为空链表 
} 
/* 析构函数 */ 
LinkList::~LinkList()
{
	ElemType *temp; 
	if(head -> next != NULL)
	{
		temp = head -> next;
		delete head;
		head = temp;
	 } 
 	delete head;
} 
/* 创建单链表 */ 
void LinkList::CreateLinkList(int n)
{
 	ElemType *pnew,*ptemp;
 	ptemp = head;
 	if(n<0)
 	{
 		cout<<"输入的结点个数有误"<<endl;
		exit(EXIT_FAILURE); 
	 }
	 for(int i=0;i<n;i++)
	 {
	 	pnew = new ElemType;
	 	cout<<"请输入第"<<i+1<<"结点的值:";
		cin>> pnew -> data;
		pnew -> next = NULL;
		ptemp -> next = pnew ;
		ptemp = pnew;
	 }
}
/* 遍历单链表 */ 
void LinkList::TravalLinkList()
{
 	if(head == NULL || head -> next == NULL){
 		cout<<"链表为空"<<endl; 
	 }
	 ElemType *p = head;
	 while(p -> next != NULL)
	 {
	 	p = p->next;
	 	cout<<p->data<<" "<<endl;
	 }
}
/* 获取单链表长度 */ 
int LinkList::GetLength()
{
 	int count = 0;
 	ElemType *p = head -> next;
 	while(p != NULL)
 	{
 		count++;
		p = p -> next;
	 }
	 return count;
}
/* 判空 */ 
bool LinkList::IsEmpty()
{
 	if(head -> next == NULL)
 	{
 		return true;
	 }
	 return false;
}
/* 查找结点值 */ 
ElemType *LinkList::Find(DataType data)
{
 	ElemType *p=head;
 	if(p == NULL)
 	{
 		cout<<"此链表为空链表"<<endl;
		 return ERROR; 
	 }
	 else
	 {
	 	while(p -> next != NULL)
	 	{
	 		if(p -> data == data){
	 			return p;
			 }
			 p = p -> next;
		 }
		 if(p -> data == data)
		 {
		 	return p;
		 }
		 return NULL;
	 }
}
void LinkList::InsertElemAtEnd(DataType data)
{
 	ElemType *newNode = new ElemType;
 	newNode -> next = NULL;
 	newNode -> data = data;
 	ElemType *p = head;
 	if(head == NULL)
 	{
 		head = newNode;
	 }
	 else
	 {
	 	while(p -> next != NULL)
	 	{
	 		p = p -> next;
		 }
		 p -> next = newNode;
	 }
}
void LinkList::InsertElemAtIndex(DataType data,int n)
{
 	if(n<1 || n>GetLength())
 	   cout<<"输入的值不符合要求"<<endl;
	else
	{
		ElemType *ptemp = new ElemType;
		ptemp -> data =data;
		ElemType *p = head;
		int i = 1;
		while(n > i && p != NULL)
		{
			p = p->next;
			i++;
		}
		ptemp -> next = p -> next;
	    p -> next = ptemp;
	 } 
} 
void LinkList::InsertElemAtHead(DataType data)
{
	ElemType *newNode = new ElemType;
	newNode -> data = data;
	ElemType *p = head;
	if(head = NULL)
	{
		head = newNode;
	}
	newNode -> next =  head -> next;
	head -> next = newNode -> next;
}
void LinkList::DeleteElemAtEnd()
{
	ElemType *p = head;
	ElemType *ptemp = NULL;
	if(p -> next == NULL)
	{
		cout<<"单链表为空"<<endl; 
	}
	else
	{
		while(p -> next != NULL)
		{
			ptemp = p;
			p = p -> next;
		}
		delete p;
		p = NULL;
		ptemp -> next = NULL;
	}
}
void LinkList::DeleteAll()
{
	ElemType *p = head -> next;
	ElemType *ptemp = new ElemType;
	while(p != NULL)
	{
		/*从头结点的下一结点开始删除*/
		ptemp = p;
		p = p -> next;
		head -> next = p;
		ptemp -> next= NULL;
		delete ptemp;
	}
	head -> next = NULL; 
}
void LinkList::DeleteElemAtPoint(DataType data)
{
	ElemType *ptemp = Find(data);
	if(ptemp == head -> next)
	{
		DeleteElemAtHead();
	}
	else 
	{
		ElemType *p = head;
		while(p -> next != ptemp)
		{
			p = p -> next;
		}
		p -> next = ptemp -> next;
		delete ptemp;
		ptemp = NULL;
	}
}
void LinkList::DeleteElemAtHead()
{
	ElemType *p = head;
	if(p == NULL || p -> next == NULL)
	{
		cout<<"该链表为空"<<endl; 
	}
	else
	{
		ElemType *ptemp = NULL;
		p = p -> next;
		ptemp = p -> next;
		delete p;
		p = NULL;
		head -> next = ptemp;
	}
}
void LinkList::Reverse() 
{
	ElemType *p = head -> next, *r;
	head -> next = NULL;
	while(p != NULL)
	{
		r = p -> next;
		p -> next = head -> next;
		head -> next = p;
		p = r;
	}
}
void LinkList::Reverse_table()
{
	ElemType *pre, *p, *r;
	p = head -> next; 
	r = p -> next;
	p -> next = NULL;
	while(r != NULL)
	{
		pre = p;
		p = r;
		r = r -> next;
		p -> next = pre;
	}
	head -> next = p; 
} 
void LinkList::SortHigher()
{
	ElemType *p = head -> next, *pre;
	ElemType *r = p -> next;
	p -> next = NULL;
	p = r;
	while(p != NULL){
		r = p -> next;
		pre = head ;
		while((pre -> next != NULL) && ((pre -> next ->data) <(p -> data)))
		{pre = pre -> next;}
		p -> next = pre -> next;
		pre -> next = p;
		p = r;
	} 
} 
void LinkList::DeleteElemBetweenData(DataType data1,DataType data2)
{
	ElemType *p = head -> next  , *pre = head;
	while(p != NULL)
	{
		if((p -> data >= data1)&&(p -> data <= data2))
		{
			pre -> next = p -> next;
			delete p;
			p = pre -> next;
		}
		else
		{
			pre = p;  p = p-> next;
		}
	 } 
}
void LinkList::SortHigherCout()
{
	SortHigher();
	ElemType *p , *pre;
	p = head -> next, pre = p;
	head -> next = NULL;
	while(p != NULL)
	{
		cout << p -> data << "  ";
		p = p -> next;
		delete pre;
		pre = p ;
	}
	head = NULL;
} 

完整代码:

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

#define Node ElemType
#define ERROR NULL
typedef int DataType;

/*构建节点类*/ 
class Node
{
	public:
		int data;   //数据域
		Node *next; //指针域 
};
 

/*构建单链表类*/
class LinkList
{
	public:
		LinkList();                                 //构建一个单链表 
		~LinkList();                                //销毁一个单链表
		void CreateLinkList(int n);                 //创建一个单链表
		void TravalLinkList();                      //遍历线性表
		int GetLength();                            //获取线性表长度
		bool IsEmpty();                             //判断是否为空 
		ElemType *Find(DataType data);              //查找结点值 
		void InsertElemAtEnd(DataType data);        //在尾部插入指定元素 
		void InsertElemAtIndex(DataType data,int n);//在指定位置插入指定元素 
		void InsertElemAtHead(DataType data);       //在头部插入指定元素 
		void DeleteElemAtEnd();                     //在尾部删除元素 
		void DeleteAll();                           //删除所有元素
		void DeleteElemAtPoint(DataType data);      //删除指定数据
		void DeleteElemAtHead();                    //在头部删除结点 
		void DeleteElemBetweenData(DataType data1,DataType data2);      //删除介定给定值的元素 
		void Reverse();                             //就地逆置 
		void Reverse_table();                       //更形象的就地逆置 
		void SortHigher();                          //递增排序 
		void SortHigherCout();                      //递增输出 
		
   private:
        ElemType *head;                           //头结点 
};
 
/* 构造函数 */ 
LinkList::LinkList()
{
 	head = new ElemType;
 	head -> data= 0;           //将头结点的数据部分定义为0 
 	head -> next = NULL;        //初始为空链表 
} 

/* 析构函数 */ 
LinkList::~LinkList()
{
	ElemType *temp; 
	if(head -> next != NULL)
	{
		temp = head -> next;
		delete head;
		head = temp;
	 } 
 	delete head;
} 

/* 创建单链表 */ 
void LinkList::CreateLinkList(int n)
{
 	ElemType *pnew,*ptemp;
 	ptemp = head;
 	if(n<0)
 	{
 		cout<<"输入的结点个数有误"<<endl;
		exit(EXIT_FAILURE); 
	 }
	 for(int i=0;i<n;i++)
	 {
	 	pnew = new ElemType;
	 	cout<<"请输入第"<<i+1<<"结点的值:";
		cin>> pnew -> data;
		pnew -> next = NULL;
		ptemp -> next = pnew ;
		ptemp = pnew;
	 }
}

/* 遍历单链表 */ 
void LinkList::TravalLinkList()
{
 	if(head == NULL || head -> next == NULL){
 		cout<<"链表为空"<<endl; 
	 }
	 ElemType *p = head;
	 while(p -> next != NULL)
	 {
	 	p = p->next;
	 	cout<<p->data<<" "<<endl;
	 }
}

/* 获取单链表长度 */ 
int LinkList::GetLength()
{
 	int count = 0;
 	ElemType *p = head -> next;
 	while(p != NULL)
 	{
 		count++;
		p = p -> next;
	 }
	 return count;
}

/* 判空 */ 
bool LinkList::IsEmpty()
{
 	if(head -> next == NULL)
 	{
 		return true;
	 }
	 return false;
}

/* 查找结点值 */ 
ElemType *LinkList::Find(DataType data)
{
 	ElemType *p=head;
 	if(p == NULL)
 	{
 		cout<<"此链表为空链表"<<endl;
		 return ERROR; 
	 }
	 else
	 {
	 	while(p -> next != NULL)
	 	{
	 		if(p -> data == data){
	 			return p;
			 }
			 p = p -> next;
		 }
		 if(p -> data == data)
		 {
		 	return p;
		 }
		 return NULL;
	 }
}
 
void LinkList::InsertElemAtEnd(DataType data)
{
 	ElemType *newNode = new ElemType;
 	newNode -> next = NULL;
 	newNode -> data = data;
 	ElemType *p = head;
 	if(head == NULL)
 	{
 		head = newNode;
	 }
	 else
	 {
	 	while(p -> next != NULL)
	 	{
	 		p = p -> next;
		 }
		 p -> next = newNode;
	 }
}
 
void LinkList::InsertElemAtIndex(DataType data,int n)
{
 	if(n<1 || n>GetLength())
 	   cout<<"输入的值不符合要求"<<endl;
	else
	{
		ElemType *ptemp = new ElemType;
		ptemp -> data =data;
		ElemType *p = head;
		int i = 1;
		while(n > i && p != NULL)
		{
			p = p->next;
			i++;
		}
		ptemp -> next = p -> next;
	    p -> next = ptemp;
	 } 
} 
  
  
void LinkList::InsertElemAtHead(DataType data)
{
	ElemType *newNode = new ElemType;
	newNode -> data = data;
	ElemType *p = head;
	if(head = NULL)
	{
		head = newNode;
	}
	newNode -> next =  head -> next;
	head -> next = newNode -> next;
}

void LinkList::DeleteElemAtEnd()
{
	ElemType *p = head;
	ElemType *ptemp = NULL;
	if(p -> next == NULL)
	{
		cout<<"单链表为空"<<endl; 
	}
	else
	{
		while(p -> next != NULL)
		{
			ptemp = p;
			p = p -> next;
		}
		delete p;
		p = NULL;
		ptemp -> next = NULL;
	}
}

void LinkList::DeleteAll()
{
	ElemType *p = head -> next;
	ElemType *ptemp = new ElemType;
	while(p != NULL)
	{
		/*从头结点的下一结点开始删除*/
		ptemp = p;
		p = p -> next;
		head -> next = p;
		ptemp -> next= NULL;
		delete ptemp;
	}
	head -> next = NULL; 
}

void LinkList::DeleteElemAtPoint(DataType data)
{
	ElemType *ptemp = Find(data);
	if(ptemp == head -> next)
	{
		DeleteElemAtHead();
	}
	else 
	{
		ElemType *p = head;
		while(p -> next != ptemp)
		{
			p = p -> next;
		}
		p -> next = ptemp -> next;
		delete ptemp;
		ptemp = NULL;
	}
}

void LinkList::DeleteElemAtHead()
{
	ElemType *p = head;
	if(p == NULL || p -> next == NULL)
	{
		cout<<"该链表为空"<<endl; 
	}
	else
	{
		ElemType *ptemp = NULL;
		p = p -> next;
		ptemp = p -> next;
		delete p;
		p = NULL;
		head -> next = ptemp;
	}
}

void LinkList::Reverse() 
{
	ElemType *p = head -> next, *r;
	head -> next = NULL;
	while(p != NULL)
	{
		r = p -> next;
		p -> next = head -> next;
		head -> next = p;
		p = r;
	}
}

void LinkList::Reverse_table()
{
	ElemType *pre, *p, *r;
	p = head -> next; 
	r = p -> next;
	p -> next = NULL;
	while(r != NULL)
	{
		pre = p;
		p = r;
		r = r -> next;
		p -> next = pre;
	}
	head -> next = p; 
} 

void LinkList::SortHigher()
{
	ElemType *p = head -> next, *pre;
	ElemType *r = p -> next;
	p -> next = NULL;
	p = r;
	while(p != NULL){
		r = p -> next;
		pre = head ;
		while((pre -> next != NULL) && ((pre -> next ->data) <(p -> data)))
		{pre = pre -> next;}
		p -> next = pre -> next;
		pre -> next = p;
		p = r;
	} 
} 
 
 
void LinkList::DeleteElemBetweenData(DataType data1,DataType data2)
{
	ElemType *p = head -> next  , *pre = head;
	while(p != NULL)
	{
		if((p -> data >= data1)&&(p -> data <= data2))
		{
			pre -> next = p -> next;
			delete p;
			p = pre -> next;
		}
		else
		{
			pre = p;  p = p-> next;
		}
	 } 
}

void LinkList::SortHigherCout()
{
	SortHigher();
	ElemType *p , *pre;
	p = head -> next, pre = p;
	head -> next = NULL;
	while(p != NULL)
	{
		cout << p -> data << "  ";
		p = p -> next;
		delete pre;
		pre = p ;
	}
	head = NULL;
} 
 
 int main()
{
	LinkList l;
	int i;
	cout << "【1】 创建单链表     【2】 遍历单链表          【3】 获取单链表的长度        【4】 判断单链表是否为空"<<endl; 
	cout << "【5】 获取节点       【6】 在尾部插入指定元素  【7】 在指定位置插入指定元素  【8】 在头部插入指定元素"<<endl;
	cout << "【9】 在尾部删除元素 【10】 删除所有元素       【11】 删除指定元素           【12】 在头部删除元素" <<endl;
	cout << "【13】就地逆置       【14】 就地逆置(方法2)  【15】 递增排序               【16】 删除界定值的元素"<<endl;
	cout << "【17】递增输出       【0】 退出"<<endl; 
	do
	{
		cout << "请输入要执行的操作: ";
		cin >> i;
		switch (i)
		{
		case 1:
			int n;
			cout << "请输入单链表的长度: ";
			cin >> n;
			l.CreateLinkList(n);
			break;
		case 2:
			l.TravalLinkList();
			break;
		case 3:
			cout << "该单链表的长度为" << l.GetLength() << endl;
			break;
		case 4:
			if (l.IsEmpty() == 1)
				cout << "该单链表是空表" << endl;
			else
			{
				cout << "该单链表不是空表" << endl;
			}
			break;
		case 5:
			DataType data;
			cout << "请输入要获取节点的值: ";
			cin >> data;
			cout << "该节点的值为" << l.Find(data)->data << endl;
			break;
		case 6:
			DataType endData;
			cout << "请输入要在尾部插入的值: ";
			cin >> endData;
			l.InsertElemAtEnd(endData);
			break;
		case 7:
			DataType pointData;
			int index;
			cout << "请输入要插入的数据: ";
			cin >> pointData;
			cout << "请输入要插入数据的位置: ";
			cin >> index;
			l.InsertElemAtIndex(pointData, index);
			break;
		case 8:
			DataType headData;
			cout << "请输入要在头部插入的值: ";
			cin >> headData;
			l.InsertElemAtHead(headData);
			break;
		case 9:
			l.DeleteElemAtEnd();
			break;
		case 10:
			l.DeleteAll();
			break;
	    case 11:
			DataType pointDeleteData;
			cout << "请输入要删除的数据: ";
			cin >> pointDeleteData;
			l.DeleteElemAtPoint(pointDeleteData);
			break;
		case 12:
			l.DeleteElemAtHead();
			break;
		case 13:
			l.Reverse();
			break;
	    case 14:
	    	l.Reverse_table();
	    	break;
	    case 15:
		    l.SortHigher();
			break; 
		case 16:
			DataType data1,data2;
			cout << "请输入要删除的数据的区间端值:";
			cin >> data1 >> data2 ; 
			l.DeleteElemBetweenData(data1,data2);
			break;
		case 17:
			l.SortHigherCout();
			break;
		default:
			break;
		}
	}while (i != 0);
 
	system("pause");
    return 0;
}



运行结果:
在这里插入图片描述

  • 实现都只是个人的见解,欢迎大家批评指正!
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值