#include<stdio.h>

#include<stdlib.h>

typedef int Status;

typedef int Elemtype;

typedef struct LNode{

Elemtype data;

struct LNode *next;

}*LinkList;


Status InitList(LinkList &L){

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

return 1;

}


Status DestoryList(LinkList &L){

LNode *p,*q;

p=L;

while(p->next){

q=p->next;

free(p);

p=q;

}

return 1;

}


Status IsListEmpty(LinkList &L){

if(!L->data) return 1;

return 0;

}


Status ListLength(LinkList &L){

LNode *p;

p=L;

int i=0;

while(p->next){

p=p->next;

i++;

}

return i;

}


Status GetElem(LinkList &L,int i,Elemtype &e){

LNode *p;

int j=0;

p=L;

while(p->next&&j<i-1){

p=p->next; 

j++;

}

if(!(p->next)||j>i-1) return 0;

e=p->data;

return 1;

}


Status LocateElem(LinkList &L,Elemtype e){

LNode *p;

p=L;

int i=0;

while(p->next){

i++;

if(p->data==e) 

return i;

p=p->next;

}

return 0;

}


Status PriorElem(LinkList &L,Elemtype cur_e,Elemtype &pre_e){

LNode *p,*q;

p=L;

int i=0;

while(p->next){

q=p;

i++;

p=p->next;

if(p->data==cur_e) {

q->data=pre_e;

return 1;

}

}

return 0;

}


Status NextElem(LinkList &L,Elemtype cur_e,Elemtype &next_e){

LNode *p;

p=L;

int i=0;

while(!p->next){

i++;

if(p->data==cur_e){

p->next->data=next_e;

return 1;

}

p=p->next;

}

return 0;

}


Status Listsert(LinkList &L,int i,Elemtype e){

LNode *p;

int j=0;

p=L;

while(p&&j<i-1){

p=p->next; 

j++;

}

if(!p||j>i-1) return 0;

LNode *s;

s=(LinkList)malloc(sizeof(LNode));

s->data=e; s->next=p->next; 

p->next=s;

return 1;

}


Status ListDelete(LinkList &L,int i,Elemtype &e){

LNode *p,*q;

int j=0;

p=L;

while(p->next&&j<i-1){

p=p->next; 

j++;

}

if(!(p->next)||j>i-1) return 0;

q=p->next; p->next=q->next;

e=q->data; free(q);

return 1;

}


Status PrintList(LinkList &L){

LNode *p;

p=L;

while(p->next){

p=p->next;

printf("%d\n",p->data);

}

return 1;

}




int main(){

LinkList l;

InitList(l);

int set,isclose,locate;

Elemtype e,cur_e,pre_e,next_e;

/*student student[10];

for(int i=0;i<2;i++){

scanf("%s %d",student[i].name,&student[i].score);

Push(s,student[i]);

}

PrintStack(s);

*/

while(1){

set=0;

printf(" 1.插入元素\n 2.删除指定位置元素并输出\n 3.输出链表的长度\n 4.销毁链表\n 5.在指定元素前插入一个元素 \n 6.查询该链表是否为空 \n 7.输出位置元素\n 8.输出整个链表中的所有元素\n 9.建立链表(在销毁后重建)\n");

scanf("%d",&set);

switch(set){

case 1:printf("请输入元素及要插入的位置,用空格分隔\n");scanf("%d %d",&e,&locate);if(Listsert(l,locate,e)) printf("插入成功\n");else printf("插入失败\n"); break;

case 2:printf("请输入要删除的位置\n");scanf("%d",&locate);if(ListDelete(l,locate,e))printf("%d\n",e);else printf("链表里无元素\n");break;

case 3:printf("%d\n",ListLength(l));break;

case 4:if(DestoryList(l)) printf("销毁成功\n");break;

case 5:printf("请输入指定的元素和要插入的元素\n");scanf("%d %d",&cur_e,&pre_e); if(PriorElem(l,cur_e,pre_e)) printf("插入成功\n");break;

case 6:if(IsListEmpty(l)) printf("链表为空\n"); else printf("链表不为空\n");break;

case 7:printf("请输入要输出的位置\n");scanf("%d",&locate);if(GetElem(l,locate,e))printf("%d\n",e);else printf("链表里无元素\n");break;

case 8:PrintList(l);break;

case 9:InitList(l);break;

}

printf("结束输入0\n");

scanf("%d",&isclose);

if(!isclose) break;

}

return 0;

}