前言:最近复习数据结构,回归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;
}
运行结果:
- 实现都只是个人的见解,欢迎大家批评指正!