头文件
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
typedef char DataType;
#define Node ElemType
//定义一个节点类
class Node
{
public:
DataType 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 output_Linklist(int n);//输出指定位置元素.
void query_Linklist(DataType n);//输出指定元素位置.
private:
ElemType * head; //head存储头结点的地址吧
};
#endif // LINKLIST_H_INCLUDED
CPP文件
#define Maxsize 1000
#include<iostream>
#include"Linklist.h"
#include<stdlib.h>
using namespace std;
int key,key1;
//构建单链表
LinkList::LinkList()
{
head = new ElemType;//new一个结点并返回该引用;
head->data='0';
head->next=nullptr;
}
//摧毁单链表
LinkList::~LinkList()
{
delete head;
}
//创建一个单链表
void LinkList::CreateLinkList(int n)
{
ElemType *pnew,*ptemp;//两个结点类型的指针变量.用来存节点的地址
ptemp = head;//将头节点的地址赋值给交换指针
if(n<=0||n>Maxsize)
{
cout<<"输入节点个数有误"<<endl;
}
cout<<"请依次输入"<<n<<"元素:";
for(int i=0;i<n;i++)
{
pnew =new ElemType;//创建新结点
cin>>pnew->data;
pnew->next = nullptr;//新结点指针域为空指针
ptemp->next = pnew;//存刚刚创建节点的地址.(第一次时,把刚创建的节点的地址传给头指针的指针域) )
ptemp = pnew;//(使ptemp指向刚刚创建的结点)
}
}
//遍历单链表
void LinkList::TravalLinkList()
{
if(head==nullptr||head->next==nullptr)
{
cout<<"该表为空表!"<<endl;
}
else
{
cout<<"链表中的数据依次为:";
ElemType *p =head->next;
while(p!=nullptr)
{
cout<<p->data<<'\t';
p = p->next;
}
}
}
//获取单链表长度
int LinkList::GetLength()
{
int count=0;
ElemType *p = head->next;
while(p!=nullptr)
{
count++;
p=p->next;
}
return count;
}
//判断链表是否为空
bool LinkList::IsEmpty()
{
if(head==nullptr||head->next==nullptr)
{
cout<<"该表为空表!"<<endl;
return 0;
}
}
//在链表中查找元素
ElemType *LinkList::Find(DataType num)
{
ElemType *p=head->next;
if(p == nullptr)
{
cout<<"该表为空表"<<endl;
return p;
}
else
{
while(p!=nullptr)
{
key++;
if(p->data==num)
{
key1 = key;
return p;
}
else
p=p->next;
}
cout<<"在链表中未找到该元素"<<endl;
return nullptr;
}
}
//在链表尾部插入元素
void LinkList::InsertElemAtEnd(DataType num)
{
ElemType * newNode = new ElemType;//创建一个新结点.
newNode->data = num;
newNode->next = nullptr;
ElemType *ptemp=head;
while(ptemp->next!=nullptr)//找到最末尾的元素.
{
ptemp=ptemp->next;
}
ptemp->next=newNode;
}
//在链表任意指定位置插入元素(结点).
void LinkList::InsertElemAtIndex(DataType num,int n)
{
if(n<0||n>GetLength())
{
cout<<"插入位置不合理!"<<endl;
}
else
{
ElemType * newNode = new ElemType;//创建一个新结点.
newNode->data = num;
newNode->next = nullptr;
ElemType *ptemp=head;//目前ptemp指向表头
int count=1;
while(count<=n)//找到要插入位置的结点
{
ptemp=ptemp->next;
count++;
}
newNode->next=ptemp->next;//将插入位置结点的指针域中的地址赋值给新结点的指针域.
ptemp->next=newNode;//将新结点的地址赋值给位置节点的指针域.
}
}
//在链表头部插入指定元素
void LinkList::InsertElemAtHead(DataType num)
{
//creat_newcode
ElemType*newNode = new ElemType;
newNode->next=head->next;
head->next=newNode;//将新结点地址传给表头指针域.
}
//删除尾部元素
void LinkList::DeleteElemAtEnd()
{
ElemType *p=head;
ElemType *ptemp = nullptr;
if(p->next==nullptr)
cout<<"该表为空!"<<endl;
else
{
while(p->next!=nullptr)//循环结束时,ptemp存的是尾部上一个元素的地址.
{
ptemp=p;//将该结点的地址给ptemp
p=p->next;//指针p沿链cout<<"9.删除头部元素"<<endl;表移动指向下一节点.
}
delete p;
p = nullptr;
ptemp->next = nullptr;
}
}
//删除指定元素
void LinkList::DeleteElemAtPoint(DataType num)
{
ElemType *ptemp=Find(num);
if(ptemp == head->next)
{
DeleteElemAtHead();
}
else
{
ElemType *p = head;
while(p->next!=ptemp)
{
p= p->next;
}
p->next = ptemp->next;
delete ptemp;
ptemp =nullptr;
}
}
void LinkList::DeleteElemAtHead()
{
cout<<"构建单链表"<<endl;
ElemType*p = head;
if(p==nullptr||p->next==nullptr)
cout<<"该链表为空!"<<endl;
else
{
ElemType*ptemp=head->next;
delete p;
p=nullptr;
head =ptemp;
}
}
//输出指定位置元素.
void LinkList::output_Linklist(int n)
{
ElemType*p=head;
if(p->next==nullptr)
cout<<"该表为空表"<<endl;
else
{
while(n--)
{
p=p->next;
}
cout<<"该位置的元素为:"<<p->data<<endl;
}
}
void LinkList::query_Linklist(DataType n)
{
ElemType* p = Find(n);
if(p!=nullptr&&key1!=0)
cout<<"该元素"<<n<<"的位置为:"<<key1;
}
int main()
{
LinkList P;//创建一个链表对象.
int num;
while(1)
{
cout<<"1.创建一个长度为n的单链表"<<endl;
cout<<"2.遍历输入单链表"<<endl;
cout<<"3.获取单链表长度"<<endl;
cout<<"4.判断单链表是否为空"<<endl;
cout<<"5.查找结点(返回的是地址)"<<endl;
cout<<"6.在链表尾部插入指定元素"<<endl;
cout<<"7.删除尾部元素"<<endl;
cout<<"8.删除指定元素"<<endl;
cout<<"9.删除头部元素"<<endl;
cout<<"10.查询指定位置的元素"<<endl;
cout<<"11.查询指定元素的位置"<<endl;
cout<<"12.中止程序退出!"<<endl;
cout<<"请选择你需要执行的功能:";
cin>>num;
switch(num)
{
case 1:
cout<<"输入n:";
int n;
cin>>n;
P.CreateLinkList(n);
break;
case 2:
P.TravalLinkList();
cout<<endl;
break;
case 3:
cout<<"该链表长度为:"<<P.GetLength()<<endl;
break;
case 4:
if(!P.IsEmpty())
cout<<"该链表不为空,该表长度为:"<<P.GetLength()<<endl;
break;
case 5:
cout<<"输入要查找的元素:";
DataType a;
cin>>a;
P.Find(a);
cout<<endl;
break;
case 6:
cout<<"输入在链表尾部插入指定元素:"<<endl;
DataType num;
cin>>num;
P.InsertElemAtEnd(num);
cout<<endl;
break;
case 7:
P.DeleteElemAtEnd();
cout<<"表尾元素已删除!"<<endl;
break;
case 8:
cout<<"输入要删除指定元素:"<<endl;
DataType num1;
cin>>num1;
P.DeleteElemAtPoint(num1);
cout<<endl;
break;
case 9:
P.DeleteElemAtHead();
cout<<"头部元素已删除"<<endl;
break;
case 10:
cout<<"输入要输出链表的指定位置:"<<endl;
int num2;
cin>>num2;
P.output_Linklist(num2);
break;
case 11:
cout<<"输入要查询元素:"<<endl;
key1=0,key=0;
DataType num3;
cin>>num3;
P.query_Linklist(num3);
cout<<endl;
break;
case 12:
exit(0);
}
}
}