#include<iostream>
using namespace std;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
//初始化链表
Status InitList_L(LinkList &L){
L=new LNode;
L->next=NULL;
return OK;
}
//求表长,返回L中数据元素个数
int ListLength_L(LinkList L){
int i=0;
LinkList p;
p=L->next; //p指向第一个结点
while(p){//遍历单链表,统计结点数
i++;
p=p->next; }
return i;
}
//取值,获取线性表L中的某个数据元素的内容
Status GetElem_L(LinkList L,int i,ElemType &e){
LNode *p=L->next;
int j=1; //初始化
while(p&&j<i){ //向后扫描,直到p指向第i个元素或p为空
p=p->next; ++j;
}
if(!p || j>i)return ERROR; //第i个元素不存在
e=p->data; //取第i个元素
return OK;
}
//在线性表L中查找值为e的数据元素
LNode *LocateELem_L(LinkList L,ElemType e) {
//返回L中值为e的数据元素的地址,查找失败返回NULL
LNode *p=L->next;
while(p &&p->data!=e)
p=p->next;
return p;
}
//插入,在L中第i个元素之前插入数据元素e
Status ListInsert_L(LinkList &L,int i,ElemType e){
LNode *p=L;
int j=0;
while(p&&j<i-1){p=p->next;++j;} //寻找第i-1个结点
if(!p||j>i-1)return ERROR; //i大于表长n+1或者小于1
LinkList s;
s=new LNode; //生成新结点s
s->data=e; //将结点s的数据域置为e
s->next=p->next; //将结点s插入L中
p->next=s;
return OK;
}//ListInsert_L
//删除,将线性表L中第i个数据元素删除
Status ListDelete_L(LinkList &L,int i){
LNode *p=L;
LNode *q;
int j=0;
while(p->next &&j<i-1){ //寻找第i个结点,并令p指向其前驱
p=p->next; ++j;
}
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 CreateList_F(LinkList &L,int n){
L=new LNode;
L->next=NULL; //先建立一个带头结点的单链表
LinkList p;
for(int i=n;i>0;--i){
p=new LNode; //生成新结点
cin>>p->data; //输入元素值
p->next=L->next;L->next=p; //插入到表头
}
}//CreateList_F
//单链表元素输出
void Out_LinkList(LNode *p){
printf("The Created LinkList Elem Is:");
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
}//Out_LinkList
int main(){
//第一步 初始化单链表
LinkList L;
LNode *p,*q,*Locate_Address;
int Init_flag,GetElem_flag;
int n=5;//建立单链表时需要创建节点的个数
Init_flag=InitList_L(L);
if(Init_flag)
cout<<"Init OK!"<<endl;
else
cout<<"Init ERROR!"<<endl;
//第二步 利用前插法建立单链表
cout<<"Please Input The LinkList Elem_Value( "<<n<<" values):"<<endl;
CreateList_F(L,n);
cout<<"Create LinkList OK!"<<endl;
Out_LinkList(L->next);//输出现有单链表中元素
cout<<endl;
//第三步 单链表按照位置i取值
int GetElem_i;
ElemType GetElem_e;
cout<<"Please Input The GetElem_i: ";
cin>>GetElem_i;
GetElem_flag=GetElem_L(L,GetElem_i,GetElem_e);
if(GetElem_flag)
cout<<"GetElem Is OK:"<<GetElem_e<<endl;
else
cout<<"GetElem Is ERROR!"<<endl;
//第四步 单链表按值查找,如果找到返回地址,否则返回null
ElemType Locate_e;
cout<<"Please input LocateElem value:";
cin>>Locate_e;
Locate_Address=LocateELem_L(L,Locate_e);
if(Locate_Address!=NULL)
cout<<"LocateElem Is OK, The Address Is:"<<Locate_Address<<endl;
else
cout<<"LocateElem Is ERROR!"<<endl;
//第五步 单链表的插入操作
ElemType ListInsert_e;
int ListInsert_i,ListInsert_flag;
cout<<"Please Input The ListInsert_i:";
cin>>ListInsert_i;
cout<<"Please Input The ListInsert_e:";
cin>>ListInsert_e;
ListInsert_flag=ListInsert_L(L,ListInsert_i,ListInsert_e);
if(ListInsert_flag)
{
cout<<"ListInsert Is OK!"<<endl;
cout<<"The LinkList of Length is: "<<ListLength_L(L)<<endl;
Out_LinkList(L->next);//输出现有单链表中元素
}
else
cout<<"ListInsert Is ERROR!"<<endl;
cout<<endl;
//第六步 单链表删除操作
int delete_i,delete_flag;
cout<<"Please input The delete_i:";
cin>>delete_i;
delete_flag=ListDelete_L(L,delete_i);
if(delete_flag)
{
cout<<"ListDelete is Ok!"<<endl;
cout<<"The LinkList of length is: "<<ListLength_L(L)<<endl;
Out_LinkList(L->next);//输出现有单链表中元素
}
else
cout<<"ListDelete Is ERROR!"<<endl;
return OK;
}
