1.【定义】
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
2.【示例代码】
singlyLinkedList.h
#define OK 1
#define ERROR 0
typedef int DataType;
typedef struct Node
{
DataType _data;
struct Node* _next;
Node(){}
Node(DataType x) :_data(x), _next(NULL) {}
}LNode, *LinkList;
class LinkedList
{
public:
LinkedList(); //构建一个单链表;
~LinkedList(); //销毁一个单链表;
void CreateLinkList(DataType n); //创建一个单链表
void showLinkList(); //遍历线性表
int GetLength(); //获取线性表长度
bool IsEmpty(); //判断单链表是否为空
LNode* 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(); //在头部删除节点
private:
LNode *head;
};
singlyLinkedList.cpp
LinkedList::LinkedList()
{
head = new LNode();
head->_data = INT_MAX; //将头结点的数据域定义为0
head->_next = NULL; //头结点的下一个定义为NULL
}
void LinkedList::CreateLinkList(DataType n)
{
LinkList pnew, ptmp;
ptmp = head;
if (n < 0) //当输入的值有误时,处理异常
{
cout << "输入的节点个数有误" << endl;
exit(EXIT_FAILURE);
}
for (int i = 0; i < n; ++i)
{
DataType data;
cout << "请输入第" << i + 1 << "个值: ";
cin >> data;
pnew = new LNode(data);
ptmp->_next = pnew;
ptmp = pnew;
}
}
void LinkedList::showLinkList()
{
if (head->_next == NULL)
{
cout << "链表为空表" << endl;
return;
}
LinkList p = head; //另指针指向头结点
while (p->_next != NULL) //当指针的下一个地址不为空时,循环输出p的数据域
{
p = p->_next; //p指向p的下一个地址
cout << p->_data << " ";
}
cout << endl;
}
int LinkedList::GetLength()
{
int count = 0; //定义count计数
LinkList p = head->_next; //定义p指向第一个结点
while (p != NULL) //当指针的下一个地址不为空时,count+1
{
count++;
p = p->_next; //p指向p的下一个地址
}
return count; //返回count的数据
}
bool LinkedList::IsEmpty()
{
if (head->_next == NULL)
{
return true;
}
return false;
}
LNode* LinkedList::Find(DataType data)
{
LinkList p = head;
if (p->_next == NULL)
{ //当为空表时,报异常
cout << "此链表为空链表" << endl;
return ERROR;
}
else
{
while (p->_next != NULL) //循环每一个节点
{
if (p->_next->_data == data)
{
return p->_next; //返回指针域
}
p = p->_next;
}
cout << "查无数据" << endl;
return NULL; //未查询到结果
}
}
void LinkedList::InsertElemAtEnd(DataType data) //尾插
{
LinkList newNode = new Node(data); //定义一个Node结点指针newNode
LinkList p = head;
if (p->_next == NULL)
{
p->_next = newNode;
return;
}
while (p->_next != NULL)
{
p = p->_next;
}
newNode->_next = p->_next;
p->_next = newNode;
}
void LinkedList::InsertElemAtIndex(DataType data, int index)
{
if (index < 1 || index > GetLength()+1) //输入有误报异常
{
cout << "输入的值错误" << endl;
}
else
{
LinkList ptemp = new Node(data); //创建一个新的节点
LinkList p = head; //创建一个指针指向头结点
int i = 1;
while (index > i) //遍历到指定的位置
{
p = p->_next;
i++;
}
ptemp->_next = p->_next; //将新节点插入到指定位置
p->_next = ptemp;
}
}
void LinkedList::InsertElemAtHead(DataType data)
{
LinkList newNode = new Node(data); //定义一个Node结点指针newNode
LinkList p = head; //定义指针p指向头结点
if (p->_next == NULL)
{
p->_next = newNode;
}
newNode->_next = p->_next; //将新节点插入到指定位置
p->_next = newNode;
}
void LinkedList::DeleteElemAtEnd()
{
LinkList p = head; //创建一个指针指向头结点
LinkList ptemp = NULL; //创建一个占位节点
if (p->_next == NULL)
{
cout << "单链表空" << endl;
}
else
{
while (p->_next != NULL) //循环到尾部的前一个
{
ptemp = p; //将ptemp指向尾部的前一个节点
p = p->_next; //p指向最后一个节点
}
delete p; //删除尾部节点
p = NULL;
ptemp->_next = NULL;
}
}
void LinkedList::DeleteAll() //删除所有数据
{
LinkList p = head->_next;
LinkList ptemp = p;
if (head->_next == NULL)
{
return;
}
if (p->_next == NULL)
{
head->_next = p->_next;
delete ptemp;
return;
}
while (p->_next != NULL) //在头结点的下一个节点逐个删除节点
{
ptemp = p;
p = p->_next;
head->_next = p;
delete ptemp;
}
head->_next = NULL; //头结点的下一个节点指向NULL
}
void LinkedList::DeleteElemAtPoint(DataType data) //删除指定的数据
{
LinkList ptemp = Find(data); //查找到指定数据的节点位置
if (ptemp == NULL)
{
return;
}
if (ptemp == head->_next)
{
DeleteElemAtHead();
}
else
{
LinkList p = head; //p指向头结点
while (p->_next != ptemp) //p循环到指定位置的前一个节点
{
p = p->_next;
}
p->_next = ptemp->_next; //删除指定位置的节点
delete ptemp;
ptemp = NULL;
}
}
void LinkedList::DeleteElemAtHead() //在头部删除节点
{
LinkList p = head;
if (p->_next == NULL)
{
cout << "该链表为空表" << endl;
}
else
{
LinkList ptemp = NULL; //创建一个占位节点
p = p->_next;
ptemp = p->_next; //将头结点的下下个节点指向占位节点
delete p; //删除头结点的下一个节点
p = NULL;
head->_next = ptemp; //头结点的指针更换
}
}
LinkedList::~LinkedList()
{
delete head;
}
main.cpp
int main()
{
LinkedList L;
L.CreateLinkList(3);
cout << L.GetLength()<< endl;
L.showLinkList();
cout << "……………………………………………………………………"<< endl;
L.InsertElemAtEnd(10);
L.showLinkList();
cout << L.GetLength() << endl;
cout << "……………………………………………………………………" << endl;
L.InsertElemAtIndex(29, 1);
L.showLinkList();
cout << L.GetLength() << endl;
cout << "……………………………………………………………………" << endl;
L.InsertElemAtIndex(55, 6);
L.showLinkList();
cout << L.GetLength() << endl;
cout << "……………………………………………………………………" << endl;
L.InsertElemAtHead(0);
L.showLinkList();
cout << L.GetLength() << endl;
cout << "……………………………………………………………………" << endl;
L.DeleteElemAtEnd();
L.showLinkList();
cout << L.GetLength() << endl;
cout << "……………………………………………………………………" << endl;
L.DeleteElemAtPoint(3);
L.showLinkList();
cout << L.GetLength() << endl;
cout << "……………………………………………………………………" << endl;
L.DeleteAll();
L.showLinkList();
cout << L.GetLength() << endl;
cout << "……………………………………………………………………" << endl;
}