仅供个人复习使用
#include<iostream>
using namespace std;
typedef struct LNode
{
int elem;
struct LNode* next;
}LNode , *LinkList;
void InitList(LinkList &L) //单链表的初始化
{
L = new LNode;
L -> next = NULL;
}
void CreatList_H(LinkList &L , int n)//前插法创建链表
{
LinkList p;
for(int i = 0 ; i < n ; i++)
{
p = new LNode;
cin>>p -> elem;
p -> next = L -> next;
L -> next = p;
}
}
void CreatList_R(LinkList &L , int n) // 尾插法建立链表
{
LinkList p,r;
r = L;
for(int i = 0 ; i < n ; i++)
{
p = new LNode;
cin>>p -> elem;
r -> next = p;
p -> next = NULL;
r = p;
}
}
void GetElem(LinkList &L , int i ,int &e)
{
// 根据序号i获取元素的值,e返回第i个元素的值
LinkList p;
p = L -> next;
int j = 1;
while(p && j < i)
{
p = p -> next;
++j;
}
if(!p || j > i)
{
cout<<"数据不合法"<<'\n';
return;
}
else
{
e = p ->elem;
cout<<"第i个元素的值:"<<e<<'\n';
}
}
void Insert(LinkList L , int i , int e)//在i-1和i之间插入数据
{
LinkList p = L;
int j = 0;
while(p && j < i - 1)
{
p = p ->next;
++j;
}
if(!p || j > i - 1)
{
cout<<"数据不合法";
return;
}
else
{
LinkList s = new LNode;
s -> elem = e;
s ->next = p ->next;
p ->next = s;
}
}
void Dele(LinkList L , int i)//删除第i个节点
{
LinkList p = L;
int j =0;
while(p ->next && j < i - 1) // 条件与插入不同,因为对于删除操作,p指针不能指向最后一个元素,而插入操作可以指向最后一个元素
//就是说p->next必须有值
{
p = p -> next;
++j;
}
if(!p->next || j > i - 1)
{
cout<<"数据不合法";
return;
}
else
{
LinkList s = p -> next;
p -> next = s -> next;
delete s;
}
}
LNode *LocateElem(LinkList L ,int e)
{
LinkList p = L;
while(p && p ->elem != e)
{
p = p->next;
}
return p;//成功返回p节点地址,否则返回NULL
}
void print(LinkList L)
{
LinkList p = L ->next;
while(p)
{
cout<<p ->elem<<" ";
p = p ->next;
}
}
int main()
{
LinkList L;
int n;
InitList(L);
cout<<"输入链表长度:"<<'\n';
cin>>n;
CreatList_H(L,n);
//CreatList_R(L,n);
int i,e = 0;
cout<<"获取序号i的值:"<<'\n';
cin>>i;
GetElem(L,i,e);
cout<<"值为"<<e<<'\n';
cout<<"按值查找:"<<'\n';
cout<<"输入值e:";
cin>>e;
if(LocateElem(L,e))
{
cout<<"查找成功"<<'\n';
}
else
{
cout<<"查找失败"<<'\n';
}
cout<<"插入数据,输入i和e"<<'\n';
cin>>i>>e;
Insert(L,i,e);
cout<<"删除第i个节点,输入i:"<<'\n';
cin>>i;
Dele(L,i);
cout<<"打印数据:"<<'\n';
print(L);
}