#include<iostream.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define OK 1
#define OVERFLOW -2
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
Status InitList_L(LinkList &L)
{
//构造一个空的链表
L=new LNode;
if(!L)
exit(OVERFLOW);
L->next=NULL;
return OK;
}//InitList_L
void ListCreate_L(LinkList &L,int n)
{
//创建链表 尾插法
ElemType x;
LNode *p;
cout<<"input x(n)="<<endl;
for(int i=n;i>0;--i)
{
p=new LNode;
if(!p)
exit(OVERFLOW);
cin>>x;
p->data=x;
p->next=L->next;L->next=p;
}
}//ListCreate_L
Status GetElem_L(LinkList L,int i,ElemType &e)
{
//L是带头结点的链表的头指针,以e返回第i个元素
LNode *p;
int j;
p=L->next;
j=1; //p指向第一个结点,j为计数器
while(p && j<i)
{
p=p->next;
++j;
}
//顺指针向后查找,直到p指向第i个元素,或p为空
if(!p || j>i)
return ERROR; //第i个元素不存在
e=p->data; //取得第i个元素
return OK;
}//GetElem_L
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
//L为带头结点的单链表的头指针,本算法
//在链表中第i个结点之前插入新的元素 e
LNode *p,*q;
int j;
p=L;
j=0;
while(p && j<i-1)
{
p=p->next;
++j;
} //寻找第i-1个结点
if(!p || j>i-1)
return ERROR; //i大于表长或者小于1
q=new LNode; //生成新结点
q->data=e;
q->next=p->next;
p->next=q; //插入
return OK;
}//LinstInsert_L
Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
//删除以L为头指针(带头结点)的单链表中第i个结点
LNode *p,*q;
int j;
p=L;
j=0;
while(p->next && j<i-1)
{
p=p->next;
++j;
} //寻找第i个结点,并令p指向其前趋
if(!(p->next) || j>i-1)
return ERROR; //删除位置不合理
q=p->next;
p->next=q->next; //删除并释放结点
e=q->data;
delete q;
return OK;
}//ListDelete_L
void visit_L(LinkList L)
{
LNode *p=L->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void main()
{
LinkList L;
ElemType x;
int i,n;
InitList_L(L);
cout<<"input LinkList n=";
cin>>n;
ListCreate_L(L,n);
visit_L(L);
cout<<"input getElem i=";
cin>>i;
if(GetElem_L(L,i,x))
cout<<x<<endl;
else
cout<<"GetElem i error!\n";
cout<<"input insert i,x=";
cin>>i>>x;
if(ListInsert_L(L,i,x))
visit_L(L);
else
cout<<"Insert i error!\n";
cout<<"input delete i=";
cin>>i;
if(ListDelete_L(L,i,x))
{
cout<<"Delete Elem is"<<x<<endl;
visit_L(L);
}
else
cout<<"Delete i error!\n";
}