#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
typedef struct LNode
{
ElemType data; //结点的数据域
struct LNode *next; //结点的指针域
} LNode, *LinkList; /PnkList为指向结构体LNode的指针类型
Status InitList(LinkList *L)
{
/****在此下面完成代码***************/
*L=NULL;
return OK;
/***********************************/
}
Status DestroyList(LinkList *L)
{
/****在此下面完成代码***************/
LNode *p=(*L)->next;
free(*L);
while(p){
*L=p;
p=p->next;
free(*L);
}
return OK;
/***********************************/
}
int ListLength(LinkList L)
{
/****在此下面完成代码***************/
int i=0;
while(L){
i++;
L=L->next;
}
return i;
/***********************************/
}
int ListEmpty(LinkList L)
{
/****在此下面完成代码***************/
if(L)return 0;
else return 1;
/***********************************/
}
Status GetElem(LinkList L, int i, ElemType *e) //链表的取值
{
/****在此下面完成代码***************/
int j=1;
while(L&&j<i){
L=L->next;
j++;
}
if(!L||j>i)return ERROR;
*e=L->data;
return OK;
/***********************************/
} //GetElem
int LocateElem(LinkList L, int e) //略有改动 按值查找
{
/****在此下面完成代码***************/
int i=1;
while(L&&L->data!=e){
i++;
L=L->next;
}
if(!L)return ERROR;
return i;
/*************************************/
} //LocateElem
Status ListInsert(LinkList *L, int i, ElemType e) //单链表的插入
{
/****在此下面完成代码***************/
LNode *p=*L;
int j=1;
while(p&&(j<i-1)){
j++;
p=p->next;
}
if(j>i)return ERROR;
else if(!p&&(i>1))return ERROR;
LNode *t=(LNode *)malloc(sizeof(LNode));
t->data=e;t->next=NULL;
if(i==1){
if(*L)t->next=*L;
*L=t;
}
else {
t->next=p->next;
p->next=t;
}
return OK;
/***********************************/
} //ListInsert
Status ListDelete(LinkList *L, int i) // 链表的删除
{
/****在此下面完成代码***************/
LNode *p=*L;
int j=1;
if(!p)return ERROR;
while((p->next)&&(j<i-1)){
j++;
p=p->next;
}
if(j>i)return ERROR;
else if(!(p->next)&&(i>1))return ERROR;
LNode *t=NULL;
// t=p->next;
if(i==1){
if(p->next)t=p->next;
*L=t;
free(p);
}
else {
t=p->next;
p->next=t->next;
free(t);
}
return OK;
/***********************************/
} //ListDelete
void ListPrint(LinkList L)
{
LNode *p;
for(p = L; p; p = p->next){
printf("%d",p->data);
p->next?printf(" "):printf("\n");
}
}
int main()
{
int i;
ElemType e;
LinkList L;
char op[20];
InitList(&L);
while(scanf("%s",op)!=EOF) {
if(strcmp(op,"Empty")==0)
(ListEmpty(L) )? printf("Empty\n"): printf("Not empty\n");
else if(strcmp(op,"Insert")==0) {
scanf("%d %d",&i,&e);
if(ListInsert(&L, i, e) == ERROR)
printf("Insert failed\n");
else
ListPrint(L);
} else if(strcmp(op,"Length")==0) {
printf("List length is %d\n",ListLength(L));
} else if(strcmp(op,"GetElem")==0) {
scanf("%d",&i);
if(GetElem(L, i, &e) == ERROR)
printf("Out of index\n");
else
printf("The elem at position %d is %d\n",i,e);
} else if(strcmp(op,"LocateElem")==0) {
scanf("%d",&e);
i = LocateElem(L, e);
if(i == 0)
printf("%d is not found in list\n",e);
else
printf("%d is found at the position %d\n",e,i);
} else if(strcmp(op,"Delete")==0) {
scanf("%d",&i);
if(ListDelete(&L, i) == ERROR)
printf("Delete failed\n");
else
ListPrint(L);
}
}
DestroyList(&L);
return 0;
}