单链表的几个基本操作
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
bool Init(LinkList &L)
{
L= new LNode;
L->next = NULL;
return true;
}
void CreateList(LinkList L,int n)
{//前插法
int i;
LNode *p=NULL;
for(i=0;i<n;i++)
{
p=new LNode;
cin>>p->data;
p->next=L->next;
L->next=p;
}
/*
LNode *r = NULL;
r=L;
for(i=0;i<n;i++)
{
p=new LNode;
cin>>p->data;
p->next = NULL;
r->next = p;
r=p;
}
*/
}
bool Getelem(LinkList L,int i,int &e)
{
int j=1;
LNode *p=NULL;
p=L->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return false;
e=p->data;
return true;
}
LNode *Locate(LinkList L,int e)
{
LNode *p=NULL;
p=L->next;
while(p&&p->data!=e)
{
p=p->next;
}
return p;
}
bool ListInsert(LinkList &L,int i,int e)
{
LNode *p=NULL, *s=NULL;
p=L;
int j=0;
while(p && j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return false;
s = new LNode;
s->data=e;
s->next = p->next;
p->next = s;
return true;
}
bool ListDelete(LinkList &L,int i)
{
LNode *p=NULL,*q=NULL;
int j=0;
p=L;
while(p->next && j<i-1)
{
p=p->next;
j++;
}
if(!(p->next)||(j>i-1))
return false;
q=p->next;
p->next=q->next;
delete q;
return true;
}
void display(LinkList L)
{
LNode *p;
p=L->next;
while(p)
{
cout<<p->data;
p=p->next;
}
cout<<endl;
}
int main()
{
int n,e;
LNode *p=NULL;
cout<<"个数";
cin>>n;
LinkList L;
Init(L);
CreateList(L,n);
display(L);
p=Locate(L,n-1);
cout<<p;
Getelem(L,n-1,e);
ListInsert(L,n-1,e);
display(L);
ListDelete(L,n-1);
display(L);
return 0;
}
双向链表的几个操作
bool ListInsert(LinkList &L,int i,int e)
{
LNode *s=NULL,*p=NULL;
if(!(p=Getelem(L,i)))//Getelem参照前代码
return false;
s = new LNode;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return true;
}
bool ListDelete(LinkList &L,int i)
{
LNode *p=NULL;
if(!(p=Getelem(L,i)))//Getelem参照前代码
return false;
p->prior->next=p->next;
p->next->prior=p->prior;
return true;
}