单链表的c++实现操作
2018-03-15 20:54
302 查看
看别人写的,自己又写一遍。仅供自己学习。
//单链表的操作
#include<iostream>
using namespace std;
typedef int DataType;
#define Node ElemType
#define ERROR NULL
//构建一个节点类
class Node{
public:
int data;//数据域
Node *next;//指针域
};
//构建一个单链表类
class LinkList{
private:
ElemType *head;//头结点
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 DeleteAllElem();//删除全部元素
void DeleteElemAtPoint(DataType data);//删除指定的数据
void DeleteElemAtHead();//删除头部节点
};
//初始化单链表
LinkList::LinkList()//构造函数
{
head = new ElemType;
head->data = 0;//将头结点的数据域定义为0
head->next = NULL;//将头节点的指针域设置为null
}
//销毁单链表
LinkList::~LinkList()//析构函数
{
delete head; //删除头结点
}
//创建一个单链表
void LinkList::CreateLinkList(int n)
{
ElemType *pnew,*ptemp;
ptemp = head;
if(n<0)
{
cout<<"输入的节点个数有误"<<endl;
}
for(int i = 0;i<n;i++)
{
pnew = new ElemType;
cout<<"请输入第"<<i+1<<"个值:";
cin>>pnew->data;//输入新节点的数据域
pnew->next = NULL;//新节点下一个地址为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;//p指向p的下一个地址
cout<<p->data<<" ";
}
}
//获取单链表的长度
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;
}
//查找与元素data相同的节点
ElemType * LinkList::Find(DataType data)
{
ElemType *p = head;
if(p==NULL||p->next==NULL)//为空表时
{
cout<<"此单链表为空表"<<endl;
return ERROR;
}
else{
while(p->next!=NULL)
{
if(p->data==data)
{
return p;
}
p = p->next;
}
}
}
//在尾部插入指定元素
void LinkList::InsertElemAtEnd(DataType data)
{
ElemType *newNode = new ElemType;
newNode->data = data;
newNode->next = NULL;
ElemType *p = head;
if(head == NULL)//如果头结点为空时,设置newNode为头结点
{
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
4000
;
ElemType *p = head;//创建一个指针指向头结点
int i = 1;
while(n>i)
{
p = p->next;
i++;
}
ptemp->next = p->next;
p->next = ptemp;
}
}
//在头部插入指定元素
void LinkList::InsertElemAtHead(DataType data)
{
ElemType *newNode = new ElemType;//定义一个Node节点指针newNode
newNode->data = data;
ElemType *p = head;
if(head == NULL)
{
head = newNode;
}
newNode->next = p->next;
p->next = newNode;
}
//在尾部删除元素
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::DeleteAllElem()
{
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;//头结点的下一个节点指向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;
}
}
//测试函数
int main()
{
LinkList list;
int i;
cout << "1.创建单链表 2.遍历单链表 3.获取单链表的长度 4.判断单链表是否为空 5.获取节点\n";
cout << "6.在尾部插入指定元素 7.在指定位置插入指定元素 8.在头部插入指定元素\n";
cout<<"9.在尾部删除元素 10.删除所有元素 11.删除指定元素 12.在头部删除元素 0.退出" << endl;
do
{
cout<<"请输入要执行的操作:";
cin>>i;
switch(i)
{
case 1:
int n;
cout<<"请输出要创建单链表的长度:";
cin>>n;
list.CreateLinkList(n);
break;
case 2:
list.TravalLinkList();
break;
case 3:
cout<<"该单链表长度为"<<list.GetLength()<<endl;
break;
case 4:
if(list.IsEmpty() == 1)
cout<<"单链表是空表"<<endl;
else
cout<<"链表不是空表"<<endl;
break;
case 5:
DataType data;
cout<<"请输入要获取节点的值:";
cin>>data;
cout<<"该节点的值为" << list.Find(data)->data << endl;
break;
case 6:
DataType endData;
cout << "请输入要在尾部插入的值: ";
cin >> endData;
list.InsertElemAtEnd(endData);
break;
case 7:
DataType pointData;
int index;
cout<<"请输入要插入的数据:";
cin >> pointData;
cout << "请输入要插入数据的位置: ";
cin >> index;
list.InsertElemAtIndex(pointData, index);
break;
case 8:
DataType headData;
cout << "请输入要在头部插入的值: ";
cin >> headData;
list.InsertElemAtHead(headData);
break;
case 9:
list.DeleteElemAtEnd();
break;
case 10:
list.DeleteAllElem();
break;
case 11:
DataType pointDeleteData;
cout << "请输入要删除的数据: ";
cin >> pointDeleteData;
list.DeleteElemAtPoint(pointDeleteData);
break;
case 12:
list.DeleteElemAtHead();
break;
default:
break;
}
}
while (i != 0);
return 0;
}
相关文章推荐
- c++实现链表的倒序操作
- (C++版)链表(二)——实现单项循环链表创建、插入、删除等操作
- 链表的基本操作函数算法(C/C++实现)
- 单链表基础操作C++实现
- 【数据结构】用C++实现单循环链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
- c++实现链表的基本操作
- 数据结构 带头结点的单链表 操作大全 最全的链表操作(c++实现)
- 【C++】模版实现双向链表的各种操作(如:逆置、去重Unique、分类(冒泡)、合并)
- 【C++】模版实现双向链表的各种操作(如:逆置、去重Unique、分类(冒泡)、合并)
- 【数据结构】用C++实现双循环链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
- C++实现链表基本操作
- 【C++】实现双向链表的所有操作,包括逆置双链表(三种方法)
- C++实现链表的进本操作及测试用例
- 双向链表的基础操作(C++实现)
- 双向链表的相关操作C++实现
- C++实现链表基本操作
- 双向链表的相关操作C++实现
- c++实现链表的基本操作
- (C++版)链表(三)——实现双向链表的创建、插入、删除等简单操作
- C++实现链表基本操作