采用尾插法来实现单链表的基本功能,咱就不说啥了,直接上代码:
#include<iostream>
using namespace std;
//create node
typedef int ElemType;
typedef struct LNode{
ElemType data;
LNode* next;
}LNode;
typedef LNode* LinkList;
//input data function
void input(ElemType &eq){
cin>>eq;
}
//Create List
void CreateList(LinkList *L,ElemType n,void (*input)(ElemType &)){
*L=new LNode;LinkList p=*L;
LinkList s;
(*L)->next= nullptr;
cout<<"请输入列表元素:";
while(n-->0){
s=new LNode;
input(s->data);
p->next=s;p=s;
}
}
//Destory List
void DestoryList(LinkList *L){
LinkList p,q;p=*L;
while(p!=nullptr){
q=p->next;
delete p;
p=q;
}
(*L)= nullptr;
}
//traverse list
void visit(ElemType *eq){
cout <<*eq<< " ";
}
void ListTraverse(LinkList L,void (*visit)(ElemType*)){
LinkList p;
p=L->next;
while(p!= nullptr){
visit(&p->data);
p=p->next;
}
}
//compare
int Compare(ElemType *eq,ElemType *ep){
if (*eq==*ep) return 1;
else return 0;
}
//LocateList elem
int LocateElem(LinkList L,ElemType e,int (*Compare)(ElemType*,ElemType*)){
LinkList p=L->next;ElemType i=0;
while(p!= nullptr){
i++;
if (Compare(&p->data,&e)) return i;
p=p->next;
}
return 0;
}
//List insert
int Listinsert(LinkList *L,ElemType i,ElemType e){
LinkList s,p=*L;
while(p!= nullptr && i>1){
p=p->next;
i--;
}
if (p== nullptr || i<1) return 0;
s=new LNode;
s->data=e;
s->next=p->next,p->next=s;
return 1;
}
//delete node
int DeleteList(LinkList *L,int i,ElemType *eq){
LinkList p,q=*L;
while(q!= nullptr && i>=1){
p=q;
q=q->next;
i--;
}
if (p== nullptr || q==nullptr) return 0;
p->next=q->next;
if (eq != nullptr) *eq=q->data;
delete q;
return 1;
}
int main(){
int n,e,i,m,k;
cout<<"请输入链表长度:";cin>>n;
LinkList L;
CreateList(&L,n, input);
cout<<"请输入要查找的元素为:";cin>>e;
cout<<"元素位于"<<LocateElem(L,e,Compare)<<endl;
cout<<"请输入要插入的位置:";cin>>i;
cout<<"请输入要插入的元素:";cin>>m;
Listinsert(&L,i,m);
ListTraverse(L,visit);
cout<<'\n';
cout<<"请输入要删除元素的位置:";cin>>i;
DeleteList(&L,i,&k);
cout<<"删除元素为:"<<k<<endl;
ListTraverse(L,visit);
DestoryList(&L);
return 0;
}
运行结果: