包含单向链表的前插法,后插法和任意位置插入法,查找,删除和销毁
再附上我拙略的图
#include <iostream>
using namespace std;
typedef struct _LinkNode{
int data;//节点的数据域
struct _LinkNode *next;//节点的指针域
}LinkNode,LinkList;//节点,链表
//1.初始化链表
bool initList(LinkList* &L){
L = new LinkNode;
if(!L)return false;
L->next = NULL;
L->data = -1;
return true;
}
//链表下一个 -> 插入元素
//插入元素的下一个 ->原本链表下一个
//2.前插法插入元素
bool ListInsert_front(LinkList* &L,LinkNode* node){
if(!L || !node) return false;
node->next = L->next;
L->next = node;
return true;
}
//3.后插发插入元素
bool LisrInsert_back(LinkList* &L,LinkNode* node){
if(!L || !node) return false;
LinkNode *last = NULL;
last = L;
while(last->next) last = last->next;
node->next = NULL;//链表的最后一个元素是为NULL的
last->next = node;
return true;
}
//4.任意位置插入元素
bool ListInsert(LinkList* &L,int i,int &e){
if(!L) return false;
int j = 0;
LinkList *p,*s;
p = L;
while(p && j<i-1){
j++;
p = p->next;
}
if(!p || j>i-1){
return false;
}
s = new LinkNode;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//5.获取链表中的某个值
bool Link_GetElem(LinkList* &L,int i,int &e){
//用带头节点的单链表L中查找第i个元素
//用e记录L中的第i个数据元素的值
if(!L||!L->next) return false;
int index = 1;
LinkNode *p;
p = L->next;
while(p && index < i){//顺序表向后扫描,知道p指向第i个元素或p为空
p=p->next;
index++;
}
if(!p || index > i){
return false;
}
e = p->data;
return true;
}
//6.按值查找
bool Link_FindElem(LinkList* &L,int e,int &index){
//在带头结点的单链表 L 中查找值为 e 的元素
LinkList *p;
p=L->next;
index = 1;
if(!L || !L->next){
index = 0;
return false;
}
while(p && p->data!=e){
p=p->next;
index ++;
}
if(!p){
index = 0;
return false;//查无此值
}
return true;
}
//7.单链表的删除
bool LinkDelete(LinkList* &L, int i)
{
LinkList *p, *q;
int index = 0;
p=L;
if(!L || !L->next){
return false;
}
while((p->next) && (index<i-1)){
p = p->next;
index++;
}
if(!p->next || (index>i-1) ){ //当 i>n 或 i<1 时,删除位置不合理
return false;
}
q = p->next; //临时保存被删结点的地址以备释放空间
p->next = q->next;//改变删除结点前驱结点的指针域
delete q; //释放被删除结点的空间
return true;
}
//8.单链表的销毁
void LinkDestroy(LinkList* &L) //单链表的销毁
{
//定义临时节点 p 指向头节点
LinkList *p = L;
cout<<"销毁链表!"<<endl;
while(p){
L=L->next;//L 指向下一个节点
cout<<"删除元素: "<<p->data<<endl;
delete p; //删除当前节点
p = L; //p 移向下一个节点
}
}
void LinkPrint(LinkList* &L){
LinkNode* p = NULL; //设置一个临时节点
if(!L){
cout<<"链表为空."<<endl;
return ;
}
p = L->next;//把链表的下一个数据交给临时变量
while(p){
cout<<p->data<<"\t";//访问该节点数据域
p = p->next;//接着向后移动一位
}
cout<<endl;
}
int main(){
LinkList *L = NULL;
LinkNode *s = NULL;
initList(L);
initList(s);
//使用前插法插入数据
int n;
cout<<"后插法插入列表"<<endl;
cout<<"请输入元素个数n"<<endl;
cin>>n;
cout<<"依次输入n个元素:";
while(n-- > 0){
s = new LinkNode;//生成新节点
cin>>s->data;
LisrInsert_back(L,s);
}
LinkPrint(L);
int i,e;
cout<<"请输入插入位置和插入元素"<<endl;
cin>>i>>e;
ListInsert(L,i,e);
LinkPrint(L);
int e1;
if(Link_GetElem(L,2,e1)){
cout<<"第二个元素的值是"<<e1<<endl;
}else{
cout<<"没有第二个元素"<<endl;
}
int index = 1;
if(Link_FindElem(L,10,index)){
cout<<"十的位置是"<<index<<endl;
}else{
cout<<"没有元素十"<<endl;
}
//8. 单链表删除元素
if(LinkDelete(L, 2)){
cout<<"删除第 2 个元素成功!"<<endl;
LinkPrint(L);
}else {
cout<<"删除第 2 个元素失败!"<<endl;
}
//9. 销毁单链表
LinkDestroy(L);
system("pause");
return 0;
}