#include <iostream.h>//iostream 是输入输出流,即cin\cout等
#define OK 1
#define ERROR 0
typedef int Status;//定义结构体,typedef是类型定义,Status是函数返回值类型
typedef int ElemType;//将整形int关键字重新命名为ElemType,ElemType代表所有可能的数据类型,这里为int型
typedef struct LNode//struct LNode是一个整体
{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;//LNode是别名,LinkList是指针别名,LinkList为指向结构体LNode的指针类型
Status InitList_L(LinkList &L)//单链表的初始化:建立一个空的单链表,即创建一个头节点
{
L=new LNode;//生成新节点作为头结点,用指针L指向头节点
L->next=NULL;//将头节点的指针域置空
return OK;
}
//尾插法创建单链表:从一个空表开始,创建一个头结点,依次读取字符数组a中的元素,生成新节点,将新节点插入到当前链表的表尾上,直到结束为止
void CreateList_L(LinkList &L, int n)
{
LinkList r,p;//r为尾指针,始终指向当前链表的的尾节点
L=new LNode;//创建头节点
L->next=NULL;//其next域置为空
r=L;//r始终指向尾结点,开始时指向头节点 //尾指针r指向头结点
for(int i=0;i<n;++i)
{
p=new LNode;//创建数据节点p
cin>>p->data;//输入元素值
p->next=NULL;
r->next=p;//将p插入r之后
r=p;//r指向新的尾结点 //r指向新的尾结点
}
}
//定义Output
Status Output(LinkList L)
{
int i=0;
LinkList p;
p=L->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
i++;
cout<<"第"<<i<<"个节点的值为:"<<p->data<<"\n";
p=p->next;
}
return OK;
}
//获取线性表L中的某个数据元素的内容:在单链表中从头开始找到第i个节点,若存在第i个数据节点,则将其data值域赋给变量e
Status GetElem_L(LinkList L, int i, ElemType &e){
LinkList p;//定义p
p=L->next;//p指向头结点
int j=1; //初始化
while(p&&j<i){ //向后扫描,直到p指向第i个元素或p为空
p=p->next;
++j;
}
if(!p || j>i)//第i个元素不存在
return ERROR;
e=p->data; //取第i个元素
return OK;
}
//按元素值查找:从单链表L中从头开始找第1个值域与e相等的节点,若存在,返回位置,若不存在,返回0
int LocateELem_L (LinkList L,ElemType e) {
LinkList p;
p=L->next;//p指向第一个节点
int j=1;//初始化
while(p &&p->data!=e)//寻找与e值域相等的节点
{p=p->next;
j++;}
if(p)//存在
return j;
else //不存在
return 0;
}
//插入数据元素:先在单链表L中找到第i-1个节点p,若存在这样的节点,将值域为e的节点s插入到其后
Status ListInsert_L(LinkList &L,int i,ElemType e){
LinkList p,s;
p=L;
int j=0;
while(p&&j<i-1)//寻找第i-1个节点
{
p=p->next;
++j;
}
if(!p||j>i-1)//i大于表长,或者i小于1,即未找到第i-1个节点
return ERROR;
s=new LNode;//生成新结点s
s->data=e;//将s的数据域置为e
s->next=p->next;//将节点s插入L中
p->next=s;
return OK;
}//ListInsert_L
//删除数据元素:先在单链表L中找到第i-1个节点p,若存在这样的节点,且也存在后继节点,则删除该后继节点
Status ListDelete_L(LinkList &L, int i, ElemType &e){
LinkList p,q;
p=L;
int j=0;
while(p->next &&j<i-1){ //寻找第i-1个节点
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
return ERROR; //删除位置不合理
q=p->next;//q指向第i个节点 //临时保存被删结点的地址以备释放
p->next=q->next;//从单链表中删除q节点
e=q->data; //保存删除结点的数据域
delete q;//释放删除结点的空间
return OK;
}
int main()
{
LinkList La;
int n,a,b,i;
ElemType e;
if(InitList_L(La))
cout<<"链表创建成功!\n";
cout<<"请输入链表到达长度:";
cin>>n;
CreateList_L(La,n);
cout<<"当前的链表为:\n";
Output(La);
/*
cout<<"请输入要查找的位置:";
cin>>a;
if(GetElem_L(La,a,e))
{
cout<<"查找成功\n";
cout<<"查找的值为:"<<e<<"\n";
}
else
cout<<"查找失败\n";
cout<<"请输入要查找的值:";
cin>>e;
b=LocateELem_L(La,e);
cout<<"\n要查找值所在的位置为:"<<b;
cout<<"\n";
*/
cout<<"\n输入插入所在的位置为:";
cin>>i;
cout<<"\n输入插入的元素值:";
cin>>e;
if(ListInsert_L(La,i,e))
{
cout<<"\n插入成功\n";
Output(La);
}
else
cout<<"\n插入失败\n";
cout<<"\n输入删除节点的位置为:";
cin>>i;
if(ListDelete_L(La,i,e))
{
cout<<"\n删除成功\n";
Output(La);
}
else
cout<<"\n删除失败\n";
return 0;
}