以下为单链表的基础定义和操作,可以参考,欢迎大家来共同讨论。
#include<iostream>
using namespace std;
typedef struct LNode//定义链表
{
int data;//数据元素
struct LNode* next;//尾指针
}LNode,*LinkList;
void InitList(LinkList &L)//初始化链表
{
L = new LNode;//分配一个头节点
if (L == NULL)
{
cout << "分配内存失败,初始化失败" << endl;//悲报
return;//退出
}
L->next = NULL;//尾指针置空
cout << "初始化成功" << endl;//喜报
}
LinkList Link_TailInsert(LinkList L)//建立单链表(尾插法)
{
int x;//数据容器
L = new LNode;//创建头指针
L->next = NULL;//头指针的尾指针置空
LNode*r = L;//创建工作指针
cout << "请输入要插入的数据,如无需插入则输入10086" << endl;
cin >> x;
while (x != 10086)//循环插入
{
LNode* s = new LNode;//创建新节点
s->data = x;//给新节点赋值
r->next = s;//将新节点并入链表
r = s;//工作指针后移一位
cout << "请输入要插入的数据,如无需插入则输入10086" << endl;
cin >> x;//输入数据
};
r->next = NULL;//工作指针的尾指针置空
return L;//返回单链表的头指针
}
LinkList List_HeadInsert(LinkList L)
{
int x;//数据容器
L = new LNode;//创建头指针
L->next = NULL;//头指针的尾指针置空
cout << "请输入要插入的数据,如无需插入则输入10086" << endl;
cin >> x;
while (x != 10086)//循环插入
{
LNode* s = new LNode;//创建新节点
s->data = x;//给新节点赋值
s->next = L->next;//将新节点和头指针指向同一片区域
L->next = s;//将新节点并入头指针
cout << "请输入要插入的数据,如无需插入则输入10086" << endl;
cin >> x;//输入数据
};
return L;//返回单链表的头指针
}
bool IsEmpty(LinkList L)//判断链表是否为空
{
return L->next == NULL;
}
void ListInsert(LinkList& L, int i, int e)//链表插入,i为要求位置,e为插入的数据
{
if (i < 1)
{
cout << "插入位置有误,插入失败" << endl;
return;
}
LinkList p = L;//创建新指针
int j = 0;
while (p != NULL && j < i - 1)//指针扫描指定位置的节点
{
p = p->next;
j++;
}
if (p == NULL)//如指定位置无节点
{
cout << "插入位置无节点,插入失败" << endl;//悲报
return;//退出
}
LNode* s = new LNode;//创建要插入的新节点
s->data = e;//赋值给新节点
s->next = p->next;//新节点和要求节点尾指针指向同一个节点
p->next = s;//要求位置的节点尾指针指向新节点
cout << "插入成功" << endl;//喜报
}
void InsertNextNode(LNode* p, int e)//指定节点之后插入
{
if (p == NULL)
{
cout << "指定节点为空,插入失败" << endl;//悲报
return;
}
LNode* s = new LNode;
if (s == NULL)
{
cout << "内存分配失败,插入失败" << endl;//悲报
return;
}
s->data = e;//赋值给新节点
s->next = p->next;//新节点和要求节点尾指针指向同一个节点
p->next = s;//要求位置的节点尾指针指向新节点
cout << "插入成功" << endl;//喜报
}
void ListDelete(LinkList& L, int i, int& e)//按位删除
{
if (i < 1)
{
cout << "删除位置有误,删除失败" << endl;
return;
}
LinkList p = L;//创建新指针
int j = 0;
while (p != NULL && j < i - 1)//指针扫描指定位置的节点
{
p = p->next;
j++;
}
if (p == NULL)
{
cout << "删除位置无节点,删除失败" << endl;//悲报
return;//退出
}
if (p->next==NULL)
{
cout << "删除位置无节点,删除失败" << endl;//悲报
return;//退出
}
LNode* q = p->next;//创建新指针指向被删除的节点
e = q->data;//将数据挪出
p->next = q->next;//将q节点从链表断开
delete q;//删除q节点
q = NULL;//防止指针乱指
cout << "删除成功" << endl;//喜报
}
LNode* GetData(LinkList L, int i)//按位查找
{
if (i < 0)
{
cout << "目标位置错误,查找失败" << endl;//悲报
return NULL;
}
LinkList p = L;//创建工作链表
int j = 0;//创建计数器
while (p != NULL && j < i)//循环查找目标节点
{
p = p->next;
j++;
}
return p;//如果目标节点存在则返回节点,否则返回NULL
}
LNode* LocateData(LinkList L, int e)//按值查找
{
LNode* p = L->next;//创建工作链表
while (p != NULL && p->data != e)//通过循环查找和数值匹配的节点
{
p = p->next;
}
return p;//返回该节点,若未找到则返回NULL
}
int Length(LinkList L)//统计链表长度
{
int count = 0;//创建计数器
LinkList p = L;//创建工作指针
while (p != NULL)//通过循环来计数
{
p = p->next;
count++;
}
return count;//返回长度
}
欢迎大家批评指正,我将虚心请教。