#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
Status InitList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));
if (L == NULL)return ERROR;
L->next = NULL;
return OK;
}
Status ListEmpty(LinkList L)
{
if (L->next == NULL) return TRUE;
return FALSE;
}
Status ListInsert(LinkList &L, int i, ElemType e)
{
int j = 0;
LinkList p = L, s;
if (i<1) return ERROR;
while ((p != NULL) && (j<i - 1))
{
p = p->next;
j++;
}
if(p==NULL)return ERROR;
s = (LNode*)malloc(sizeof(LNode));
if (s == NULL) return ERROR;
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
Status ScanfList(LinkList &L)
{
printf("输入整数,以0结束:\n");
ElemType e;
int i = 1;
scanf("%d", &e);
while (e != 0)
{
if (!ListInsert(L, i, e)) return ERROR;
i++;
scanf("%d", &e);
}
return OK;
}
Status ListDelete(LinkList &L, int i, ElemType &e)
{
int j = 0;
LinkList p = L, q;
if ((i<1) || (L->next == NULL)) return ERROR;
while ((p != NULL) && (j<i - 1))
{
p = p->next;
j++;
}
if (p == NULL) return ERROR;
q = p->next;
p->next = q->next;
e = q->data;
free(q);
return OK;
}
Status GetElem(LinkList L, int i, ElemType &e)
{
int j = 1;
LinkList p = L->next;
if (i<1) return ERROR;
while ((p != NULL) && (j<i))
{
p = p->next;
j++;
}
if (p == NULL) return ERROR;
e = p->data;
return OK;
}
int LocateElem(LinkList L, ElemType e)
{
int i = 1;
LinkList p = L;
while (p->next != NULL)
{
p = p->next;
if (p->data == e)return i;
i++;
}
return i;
}
Status PriorElem(LinkList L, ElemType e, ElemType &pr_e)
{
LinkList p = L->next;
if (p->data == e) return ERROR;
while (p != NULL)
{
if (p->next->data == e) break;
p = p->next;
}
if (p == NULL) return ERROR;
pr_e = p->data;
return OK;
}
int GetLength(LinkList L)
{
int i = 0;
LinkList p = L;
while (p->next != NULL)
{
p = p->next;
i++;
}
return i;
}
void PrnList(LinkList L)
{
LinkList p = L->next;
if (p == NULL) printf("NULL\n");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void NiList(LinkList &L)
{
LinkList p = L->next, q;
L->next = NULL;
while (p != NULL)
{
q = p;
p = p->next;
q->next = L->next;
L->next = q;
}
}
Status ClearList(LinkList &L)
{
LinkList p = L->next, q;
if (p == NULL) return OK;
while (p != NULL)
{
q = p->next;
free(p);
p = q;
}
L->next = NULL;
return OK;
}
Status Destroy(LinkList &L)
{
LinkList p = L->next, q;
while (p != NULL)
{
q = p->next;
free(p);
p = q;
}
free(L);
return OK;
}
int main()
{
int i;
ElemType e, e1;
LinkList L;
if (InitList(L)) printf("OK\n");
ScanfList(L);
PrnList(L);
int k;
printf("\n1.插入\n2:删除\n3:取值\n4:定位\n5:直接前驱\n");
printf("6.求长度\n7:遍历\n8:逆置\n9:清空\n10:销毁\n\n0.退出\n");
scanf("%d", &k);
while (k != 0)
{
switch (k)
{
case 1:
printf("在第几个位置插入何数:");
scanf("%d%d", &i, &e);
if (ListInsert(L, i, e)) printf("OK\n");
break;
case 2:
printf("删除第几个数:");
scanf("%d", &i);
if (ListDelete(L, i, e))printf("删除数为:%d\n", e);
break;
case 3:
printf("获取第几个数:");
scanf("%d", &i);
if (GetElem(L, i, e)) printf("数为:%d\n", e);
break;
case 4:
printf("定位何数:");
scanf("%d", &e);
if (LocateElem(L, e)) printf("位序为:%d\n", LocateElem(L, e));
break;
case 5:
printf("寻找何数直接前驱:");
scanf("%d", &e);
if (PriorElem(L, e, e1)) printf("前驱为:%d\n", e1);
break;
case 6:
printf("表长为:");
printf("%d\n", GetLength(L));
break;
case 7:
printf("遍历:\n");
PrnList(L);
break;
case 8:
NiList(L);
PrnList(L);
printf("逆置成功\n");
break;
case 9:
if (ClearList(L))printf("清空成功\n");
break;
case 10:
if (Destroy(L))printf("销毁成功\n");
break;
default:
printf("ERROR\n");
}
scanf("%d", &k);
}
return 0;
}