int j=0;
while(p &&j {
p=p->next;
++j;
}
if(!p ||j>i) return ERROR; //第i个元素不存在
e=p->data; //取第i个元素
return OK;
}
Status ListInsert_L(Linklist &L,int i,ElemType e) //在带头结点的单链表L中的第i个位置之前插入元素e
{
Linklist p=L; //初始化,p指向头结点,j为计数器
int j=0;
Linklist s;
while(p && j
p=p->next; //寻找第i-1个节点
++j;
}
if(!p ||j>i-1) return ERROR; //i小于1或者大于表长加1
s=(Linklist)malloc(sizeof(LNode)); //生成新节点,以linklist为头结点
s->data = e; //插入L中
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete_L(Linklist &L,int i,ElemType &e) //在带头结点的单链表L中,删除第i个元素,并由e返回其值
{ Linklist q;
Linklist p=L; //初始化,p指向头结点,j为计数器
int j=0;
while(p->next && j
p=p->next;
++j;
}
if(!(p->next || j>i-1)) return ERROR; //删除位置不合理
q=p->next; //删除并释放节点
p->next=q->next;
e=q->data;
free(q);
return OK;
}
Status CerateList_L(Linklist &L,int n) //逆为序输入n个元素的值,建立带表头节点的单链表L
{
Linklist p;
L=(Linklist)malloc(sizeof(LNode));
L->next=NULL; //先建立一个带头结点的单链表
for(int i=n;i>0;--i)
{
p=(Linklist)malloc(sizeof(LNode)); //生成新结点
scanf("%d",&p->data); //插入元素值
p->next=L->next; //插入到表头
L->next=p;
}
return OK;
}
Status Listlength(Linklist L,int &j) //求单链表的表长
{
j=0;
Linklist p=L;
while(p->next)
{
p=p->next;
j++;
}
return OK;
}
Status PriorEle(Linklist L,int cur_e,ElemType &pre_e) //求cur_e的前趋,并用pre_e返回
{
Linklist p=L;
while(p->next &&p->next->data !=cur_e)
p=p->next;
if(!p->next ||p==L) return ERROR; //前趋不存在
pre_e=p->data;
return OK;
}
Status search(Linklist L,int k) //在一个单链表中求倒数第k个元素
{
Linklist p,q;
int count =0;
p=q=L->next;
while(p != NULL) //p不为空的时候,p先走到第k个位置,然后p,q同时走
{
if(count
else
{q=q->next;}
p=p->next;
}
if(count
return OK;
}
void Traverse (Linklist L) //遍历链表
{
Linklist p;
p=L->next;
printf("链表的元素如下:\n");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
void main()
{
Linklist L,q;
int select,i,e,j,k,cur_e,pre_e,n;
printf("请输入一个数确定链表的元素个数:");
scanf("%d",&n);
CerateList_L(L,n);
Traverse (L);
do
{
printf("\n\n1:求链表的长度\n");
printf("2:取第i个元素的值\n");
printf("3:在第i个元素之前插入一个元素\n");
printf("4:删除第i个元素\n");
printf("5:求元素cur_e的前趋\n");
printf("6:求倒数第k个元素的值\n");
printf("0:结束!\n");
printf("请输入选择!\n");
scanf("%d",&select);
switch(select)
{
case 1:
Listlength(L,j);
printf("链表的表长是:%d\n",j);
break;
case 2:
printf("i=");
scanf("%d",&i);
if(GetElem_L(L,i,e)==ERROR)
printf("第i个元素不存在\n");
else
printf("\n第%d个元