单向链表:是通过结点的形式在存储器中进行存储,结点包括数据域和指针域,逻辑上相邻的两个结点在物理上不一定相邻,单向链式存储的线性表,定义了一个唯一的头结点,头结点的next指针指向下一个结点,也就是开始结点;
单向链表代码如下:
SingleNode.h
#include <iostream>
using namespace std;
typedef int DataType; //定义用户存储的数据域类型
//构建一个结点类
typedef struct Node{
DataType data;//存储数据域
Node *next;//指针域
}Node;
//创建一个链表类
class ListNode{
public:
ListNode();
~ListNode();
public://相关操作
void CreateLinkList(int n);//创建一个单链表
void TravalLinkList();//遍历单链表
int GetLength();//得到单链表的长度
bool IsEmpty();//判断单链表是否为空
Node *find(DataType data);//查找一个结点
void InsertElemAtEnd(DataType data);//在尾部插入指定元素
void InsertElemAtIndex(DataType data,int n);//在指定位置插入元素
void InsertElemAtHead(DataType data);//在头部插入元素
void DeleteElemEnd();//尾部删除元素
void DeleteAll();//删除所有元素
void DeleteElemAtPoint(DataType data);//删除指定元素
void DeleteElemHead();//在头部删除结点
private:
Node *head;
};
源文件如下:
#include "SingleNode.h"
using namespace std;
ListNode::ListNode(){
head=new Node;
head->next=NULL;
head->data=0;
}
ListNode::~ListNode(){
delete head;
}
void ListNode::CreateLinkList(int n){
if (n<1)
{
cout<<"输入的结点个数有误,请重新输入!"<<endl;
exit(OVERFLOW);
}
else
{
Node *pTemp=head,*pNew;
int i=n;
while(n-->0){
pNew=new Node;
pNew->next=NULL;
cout<<"请输入第"<<i-n<<"个结点值:";
cin>>pNew->data;
pTemp->next=pNew;
pTemp=pNew;
}
}
}
void ListNode::TravalLinkList(){
if (NULL==head->next)
{
cout<<"该链表为空!"<<endl;
exit(EXIT_FAILURE);
}else
{
Node *pTemp=head->next;
while(NULL!=pTemp){
cout<<pTemp->data<<endl;
pTemp=pTemp->next;
}
}
}
int ListNode::GetLength(){
if (NULL==head->next)
{
return -1;
}
else
{
int i=0;
Node *pTemp=head->next;
while(pTemp!=NULL){
i++;
pTemp=pTemp->next;
}
return i;//注意这个是栈中分配的内存 采用的是值 复制的模式返回
}
}
bool ListNode::IsEmpty(){
if (NULL==head->next)
{
return true;
}else
{
return false;
}
}
Node *ListNode::find(DataType data){
if (NULL==head->next)
{
cout<<"该链表为空"<<endl;
exit(EXIT_FAILURE);
}
else
{
Node *pTemp=head->next;
while(pTemp!=NULL)
{
if (pTemp->data==data)
{
return pTemp;
}
}
return NULL;
}
}
void ListNode::InsertElemAtEnd(DataType data){
Node *pTemp=head->next,*pNew;
pNew=new Node;
int n=GetLength();
for (int i=0;i<n;i++)
{
pTemp=pTemp->next;
}
pNew->next=NULL;
pNew->data=data;
pTemp->next=pNew;
}
void ListNode::InsertElemAtIndex(DataType data,int n){
Node *pTemp=head->next,*pNew;
pNew=new Node;
for (int i=0;i<n;i++)
{
pTemp=pTemp->next;
}
pNew->data=data;
pNew->next=pTemp->next;
pTemp->next=pNew;
}
void ListNode::InsertElemAtHead(DataType data){
Node *pTemp=head->next,*pNew;
pNew=new Node;
pNew->next=pTemp;
pNew->data=data;
head->next=pNew;
}
void ListNode::DeleteElemEnd(){
Node *pTemp=head->next;
int n=GetLength();
for (int i=0;i<n;i++)
{
pTemp=pTemp->next;
}
delete pTemp;
pTemp=nullptr;
}
void ListNode::DeleteAll(){
Node *pTemp=head->next,*pDel;
int n=GetLength();
for (int i=0;i<n;i++)
{
pDel=new Node;
pDel=pTemp;
pTemp=pDel->next;
delete pDel;
pDel=NULL;
}
}
void ListNode::DeleteElemAtPoint(DataType data){
Node *pTemp=head->next,*pDel;
int n=GetLength();
for (int i=0;i<n;i++)
{
if (pTemp->data==data)
{
pDel=new Node;
pDel=pTemp;
pTemp=pDel->next;
delete pDel;
pDel=nullptr;
}
else
pTemp=pTemp->next;
}
}
void ListNode::DeleteElemHead(){
Node *pTemp=head->next,*pDel;
pDel=new Node;
pDel=pTemp;
head->next=pTemp->next;
delete pDel;
pDel=NULL;
}