#include<iostream>
using namespace std;
typedef int ElemType;
struct LNode //单链表结点类型
{
ElemType data;
LNode* next;
};
typedef LNode* LinkList;
// 链表初始化
bool InitList_L(LinkList& L){
L = new LNode; // 生成新节点作为头结点
if (!L) return false; // 生成节点失败
L->next = NULL; // 头节点的指针域置空
return true;
}
// 头插法创建单链表
void CreateList_H(LinkList& L) {
int n; //输入n个元素的值,建立到头节点的单链表L
LinkList s; //定义一个指针变量
L = new LNode;
L->next = NULL; //先建立一个带头节点的空链表
cout << "请输入元素的个数n" << endl;
cin >> n;
cout << "请依次输入n个元素" << endl;
cout << "头插法创建单链表......" << endl;
while (n--) {
s = new LNode; // 生成新节点s
cin >> s->data; // 输入元素值赋值给节点的数据域
s->next = L->next;
L -> next = s; // 将新节点s插入头节点之后
}
}
// 尾插法创建单链表
void CreateList_R(LinkList& L) {
int n;
LinkList s, r;
L = new LNode;
L->next = NULL; // 先创建一个带头节点的空链表
r = L; // 尾指针r指向头节点
cout << "请输入元素个数n:" << endl;
cin >> n;
cout << "请依次输入n个元素:" << endl;
cout << "尾插法创建单链表......" << endl;
while (n--)
{
s = new LNode; //生成新节点
cin >> s->data; // 输入元素值赋给新节点的数据域
s->next = NULL;
r->next = s; // 将新节点s插入尾节点r之后
r = s; // r指向新的尾节点
}
}
// 取值
bool GetElem_L(LinkList L, int i, ElemType& e) {
int j;
LinkList p;
p = L -> next; // p指向第一个数据节点
j = 1; // j为计数器
while (j < i && p) { // 顺着链表向后扫描,直到p指向第i个元素或p为空
p = p->next; // p指向下一个节点
j++;
}
if (!p || j > i) { // i值不合法,i>n或i<=0
return false;
}
e = p->data;
return true;
}
// 查找
bool LocateElem_L(LinkList L, int e, int &i) {
LinkList p;
i = 1;
p = L-> next;
while (p && p->data != e) {
p = p->next; // 沿着链表向后扫描,直到p为空或p指向节点数据域等于e
i++;
}
if (!p) // 查找失败,p为NULL
{
i = -1;
return false;
}
return true;
}
//插入
bool ListInsert_L(LinkList& L, int i, int e) {
int j;
LinkList p, s;
p = L;
j = 0;
while (p&&j<i-1) //查找第i-1个节点,p指该节点
{
p = p->next;
j++;
}
if (!p || j > i - 1)return false; // i>n+1或者i<1
s = new LNode; // 生成新节点
s->data = e; // 将数据元素e放入新节点的数据域
s->next = p->next; // 将新节点的指针域指向第i个节点
p->next = s; // 将节点p的指针域指向节点s
return true;
}
// 删除
bool ListDelete_L(LinkList &L, int i){
LinkList p, q;
int j;
p = L;
j = 0;
while ((p->next) && (j < i - 1)) {
p = p->next;
j++;
}
if (!(p->next) || (j > i - 1))return false; // i>n或i<1时,删除位置不合理
q = p->next; // 临时保存被删节点的地址以备释放空间
p->next = q->next; // 将q节点的下一个节点地址赋值给p节点的指针域
delete q; // 释放被删除节点的空间
return true;
}
// 链表遍历辅助函数
void visit(ElemType* ep)
{
cout << *ep << " ";
}
// 遍历链表
void ListTraverse(LinkList L, void(*visit)(ElemType*))
{
LinkList p = L->next; // p指向开始结点(注意,头结点之后才是开始结点)
while (p != NULL) // 若p不是链尾则继续
{
visit(&(p->data));
p = p->next; // p指向直接后继结点
}
cout << endl;
}
// 删除链表
void DestroyList(LinkList *L)
{
LinkList q, p = *L; // p指向头结点
while (p != NULL) // 若p不是链尾则继续
{
q = p->next; // 指向直接后继结点
delete p; // 释放结点存储空间
p = q; // 直接后继结点
}
*L = NULL; // 置为空表
}
int main() {
LinkList L1,L2;
ElemType e;
int i;
cout << "初始化链表1" << endl;
InitList_L(L1);
cout << "初始化链表2" << endl;
InitList_L(L2);
cout << "头插法创建链表" << endl;
CreateList_H(L1);
cout << "尾插法创建链表" << endl;
CreateList_R(L2);
cout << "遍历链表1" << endl;
ListTraverse(L1, *visit);
cout << "遍历链表2" << endl;
ListTraverse(L2, *visit);
cout << "取第二个节点的值" << endl;
GetElem_L(L2, 2, e);
cout << "取得的值为:" << e<<endl;
cout << "查找2" << endl;
LocateElem_L(L2, 2, i);
cout << "2所在位置为:" << i << endl;
cout << "在第2个位置插入节点,数值域为2"<<endl;
ListInsert_L(L2, 2, 2);
cout << "遍历链表2" << endl;
ListTraverse(L2, *visit);
cout << "删除第2个位置的节点" << endl;
ListDelete_L(L2, 2);
cout << "遍历链表2" << endl;
ListTraverse(L2, *visit);
cout << "销毁节点" << endl;
DestroyList(&L2);
}
更多文章请关注《万象专栏》
转载请注明出处:https://www.wanxiangsucai.com/read/cv16229