#include<iostream>
using namespace std;
//定义链表中的元素
struct Date
{
int age = 0;
};
//定义单链表(指针和元素)
typedef struct Lnode
{
Date date;
Lnode* next;
}Lnode, * ListNode;
//初始化链表
void InitList(ListNode& L)
{
L->next = NULL;
L->date.age = 0;
return;
}
//判断链表是否为空
void Empty_L(ListNode& L)
{
//为空返回ture,否则返回false
if (L->next == NULL)cout << "链表L为空" << '\n';
else cout << "链表L非空" << '\n';
}
//单链表的销毁,销毁后不存在,注意和清空有所区别
void Destroy_L(ListNode& L)
{
ListNode p = new Lnode;
while (L)
{
p = L;
L = L->next;
delete(p);
}
return;
}
//清空链表
void Clear_L(ListNode& L)
{
ListNode p, q;
p = L->next;
while (p)
{
q = p->next;
delete(p);
p = q;
}
L->next = NULL;
return;
}
//求表长
void Length_L(ListNode& L)
{
ListNode p;
p = L->next;
int length = 0;
while (p)
{
length++;
p = p->next;
}
cout << "表长为" << length << '\n';
return;
}
//取单链表中第i个元素的内容
Date GetElem_L(ListNode& L, int i)
{
int count = 1;
ListNode p; p = L->next;
//i可能是负数
while (count < i && p != NULL)
{
count++;
p = p->next;
}
if (p == NULL || count > i)
{
cout << "查找失败" << '\n';
Date s;
s.age = -1;
return s;
}
else return p->date;
}
//按值查找,返回所在位置(地址)
ListNode FindElem_L(ListNode& L, Date e)
{
ListNode p = L->next;
while (p)
{
if (p->date.age == e.age)return p;
p = p->next;
}
cout << "不存在该数值" << '\n';
return p;
}
//按值查找,返回所在序号
int FindLoca_L(ListNode& L, Date e1)
{
ListNode p = L->next;
int count = 1;
while (p)
{
if (p->date.age == e1.age)return count;
p = p->next;
count++;
}
cout << "不存在该数值" << '\n';
return -1;
}
//在第i个结点前插入新结点
void Insert_L(ListNode& L, int i, int e2)
{
int count = 0;
ListNode p = L;
while (p && count < i - 1)
{
p = p->next;
count++;
}
if (p == NULL || count > i - 1)
{
cout << "不存在该结点" << '\n';
return;
}
ListNode q = new Lnode;
q->date.age = e2;
q->next = p->next;
p->next = q;
return;
}
//删除第i个结点
void Delete_L(ListNode& L, int i)
{
ListNode p = L;
int count = 0;
while (p && count < i - 1)
{
count++;
p = p->next;
}
if (p == NULL || count > i - 1)
{
cout << "不存在要删除的结点" << '\n';
return;
}
ListNode q = p->next;
p->next = q->next;
delete(q);
return;
}
//单链表的建立(头插法),插入n个元素
void CreatList_H(ListNode& L, int n)
{
for (int i = 0; i < n; i++)
{
ListNode p = new Lnode;
cin >> p->date.age;
p->next = L->next;
L->next = p;
}
return;
}
//单链表的建立(尾插法),插入n个元素
void CreatList_E(ListNode& L, int n)
{
ListNode R = L;
for (int i = 0; i < n; i++)
{
ListNode p = new Lnode;
cin >> p->date.age;
p->next = NULL;
R->next = p;
R = p;
}
}
//输出链表
void Print_L(ListNode& L)
{
ListNode p = L->next;
while (p)
{
cout << p->date.age <<' ';
p = p->next;
}
cout << '\n';
return;
}
int main()
{
//创建一个链表
Lnode* L = new Lnode;
//初始化链表
InitList(L);
单链表的建立(头插法),插入n个元素
//int n = 0; cin >> n;
//CreatList_H(L, n);
//单链表的建立(尾插法),插入n个元素
int n = 0; cin >> n;
CreatList_E(L, n);
//输出链表
Print_L(L);
//判断链表是否为空
Empty_L(L);
单链表的销毁,销毁后不存在,注意和清空有所区别
//Destroy_L(L);
判断链表是否为空
//Empty_L(L);
清空链表
//Clear_L(L);
判断链表是否为空
//Empty_L(L);
//求表长
Length_L(L);
取单链表中第i个元素的内容
//int i = 0; cin >> i;
//Date e = GetElem_L(L, i);
//cout << e.age << '\n';
按值查找,返回所在位置(地址)
//Date e1; cin >> e1.age;
//ListNode t = FindElem_L(L, e1);
//cout << t->date.age << '\n';
按值查找,返回所在序号
//Date e1; cin >> e1.age;
//int Loc = FindLoca_L(L, e1);
//cout << Loc << '\n';
在第i个结点前插入新结点元素e2
//int i = 0; cin >> i;
//int e2 = 0; cin >> e2;
//Insert_L(L, i, e2);
输出链表
//Print_L(L);
删除第i个结点
//int i = 0; cin >> i;
//Delete_L(L, i);
输出链表
//Print_L(L);
return 0;
}
chap1 数据结构——单链表的实现
于 2023-09-28 15:32:57 首次发布