/**
* ADT 线性表(List)
* Data
* Operation
* InitList(*L);
* ListEmpty(L);
* ClearList(*L);
* GetElem(L,i,*e);
* LocateElem(L,e);
* ListInsert(*L,i,e);
* ListDelete(*L,i,*e);
* ListLength(L);
* endADT
*/
#include <stdio.h>
#define MAXSIZE 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];//会初始化为零么?
int length;
}SqList;
Status MakeData(int data[]);//初始化赋值列表
Status InitList(SqList *L, int data[]);//初始化
Status ListEmpty(SqList L);//为空返回true,为假返回false
Status ClearList(SqList *L);//清空线性表
Status GetElem(SqList L, int i, ElemType *e);//返回i位置上的值
Status LocateElem(SqList L, ElemType e);//查找与e相同的元素,查找成功就返回序号,不成,则返回0
Status ListInsert(SqList *L, int i, ElemType e);//i位置上插入e
Status ListDelete(SqList *L, int i, ElemType *e);//删除i上的元素
Status ListLength(SqList L);//返回元素个数
int main()
{
SqList L;
int data[MAXSIZE-5];//留点空余,以作后面的操作
MakeData(data);
InitList(&L, data);
printf("线性表长度为:%d
", ListLength(L));
ListEmpty(L);
printf("线性表长度为:%d
", ListLength(L));
ElemType e, i;
printf("请输入你想要的位置i:
");
scanf("%d", &i);
GetElem(L, i, &e);
printf("%d
", e);
printf("与e相等的元素位于%d
", LocateElem(L, e));
ListInsert(&L, i, e);
printf("线性表长度为:%d
", ListLength(L));
ListDelete(&L, i, &e);
printf("线性表长度为:%d
", ListLength(L));
ClearList(&L);
printf("线性表长度为:%d
", ListLength(L));
return 0;
}
Status MakeData(int data[])
{
for (int i = 0; i < MAXSIZE-5; ++i)
{
data[i] = i+2;
}
return OK;
}
Status InitList(SqList *L, int data[])
{
L->length = 0;
for (int i = 0; i < MAXSIZE-5; ++i)
{
L->data[i] = data[i];
L->length++;
}
for (int i = MAXSIZE-5; i < MAXSIZE; ++i)
{
L->data[i] = 0;
}
return OK;
}
Status ListEmpty(SqList L)
{
if (L.length == 0)
{
return TRUE;
}
return FALSE;
}
Status ClearList(SqList *L)
{
if (L->length == 0)
{
return OK;
}
for (int i = 0; i < L->length; ++i)
{
L->data[i] = 0;
}
return OK;
}
Status GetElem(SqList L, int i, ElemType *e)
{
if (L.length==0 || i<1 || i>L.length)
{
return ERROR;
}
*e = L.data[i-1];
return OK;
}
Status ListInsert(SqList *L, int i, ElemType e)
{
int k;
if (L->length == MAXSIZE)
{
return ERROR;
}
if (i<1 || i>L->length+1)
{
return ERROR;
}
if (i<=L->length)
{
for (k=L->length-1; k>=i-1; k--)
{
L->data[k+1] = L->data[k];//向后移动
}
}
L->data[i-1] = e;
L->length++;
return 0;
}
Status ListDelete(SqList *L, int i, ElemType *e)
{
int k;
if (L->length == 0)
{
return ERROR;
}
if(i<1 || i>L->length)
{
return ERROR;
}
*e = L->data[i-1];
if (i<L->length)
{
for (k=i; k<L->length; k++)
{
L->data[k-1] = L->data[k];//向前移动
}
L->data[L->length-1] = 0;
}
L->length--;
return OK;
}
Status LocateElem(SqList L, ElemType e)
{
for (int i = 0; i < L.length; ++i)
{
if (L.data[i] == e)
{
return i+1;
}
}
return FALSE;
}
Status ListLength(SqList L)
{
if (!L.length)
{
return 0;
}
//计数这里倒也没必要这么复杂,直接返回L->length就好了嘛
//这里权当练习
int count = 0;
for (int i = 0; i < MAXSIZE; ++i)
{
if (L.data[i] == 0)
{
return count;
}
count++;
}
return count;//其实就是MAXSIZE
}