#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;
}