엄 울 민 2.1 선형 표 코드 실현
8497 단어 c 언어 와 데이터 구조
, , !
#include
#include
#include
#include
#include
#include
#define TRUE 1 //
#define FALSE 0 //
#define OK 1 //
#define ERROR 0 //
#define Warnning 0 //
#define FAILED 0 //
#define OVERFLOW -2 //
/* 7 , */
#define LIST_INIT_SIZE 10 //
typedef int Order; //
typedef int Status; //
typedef int ElemType; //
/* int , */
typedef struct
{
ElemType *Elem;
int Length;
int ListSize;
}pList;
Status InitList(pList *L)
{ //
// : L
L->Elem=(ElemType *)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
if(!L->Elem)
{
printf(" , !
");
exit(OVERFLOW);//
}
L->Length=0; // 0
L->ListSize=LIST_INIT_SIZE; //
printf(" !
");
return OK;
}
void DestroyList(pList *L)
{ // : L 。 : L
if(L->Elem)
{
free(L->Elem);
L->Elem=NULL;
L->Length=NULL;
L->ListSize=NULL;
printf(" !
");
}
}
void ClearList(pList *L)
{ // : L 。 : L
L->Length=0;
printf(" !
");
}
Status ListEmpty(pList *L)
{ // : L 。 : L , TRUE, FALSE
if(L->Length)
return TRUE;
else
return FALSE;
}
Status ListLength(pList *L)
{ // : L 。 : L
return L->Length;
}
ElemType GetElem(pList *L,int i,ElemType *e)
{ // : L ,1≤i≤ListLength(L)。 : e L i
int Len=ListLength(L);
if(i < 1 || i > Len)
{
printf(" %d, !
",Len);
return Warnning;
}
*e=L->Elem[i-1];
return *e;
}
int LocateElem(pList *L,ElemType e,Status(*compare)(ElemType,ElemType))
{ // : L ,compare() ( 1, 0)
// : L 1 e compare() 。
// , 0。 2.6
ElemType *p;
int i=1; // i 1
p=L->Elem; // p 1
while(i <= L->Length && !compare(*p++,e))
++i;
if(i<=L->Length)
return i;
else
return 0;
}
ElemType PriorElem(pList *L,ElemType cur_e,ElemType *pre_e)
{ // : L
// : cur_e L , , pre_e ,
// ,pre_e
int i=2;
ElemType *p=L->Elem+1;
while(i < L->Length && *p != cur_e)
{
p++;
i++;
}
if(i > L->Length)
{
printf(" :%d!
",cur_e);
return FAILED;
exit(0);
}
else
{
*pre_e = *--p;
return *pre_e;
}
}
ElemType NextElem(pList *L,ElemType cur_e,ElemType *next_e)
{ // : L
// : cur_e L , , next_e ,
// ,next_e
int i=1;
ElemType *p=L->Elem;
while(i < L->Length && *p != cur_e)
{
p++;
i++;
}
if(i == L->Length)
{
printf(" :%d!
",cur_e);
return FAILED;
exit(0);
}
else
{
*next_e = *++p;
return *next_e;
}
}
Status InsertList(pList *L,int i,ElemType e)
{ // : L ,1≤i≤ListLength(L)+1
// : L i e,L 1
if(i < 1 || i > L->Length+1)
{
printf(" !
");
return ERROR;
}
if(L->Length == L->ListSize) // ,
{
ElemType *newbase = (ElemType *)realloc(L->Elem,sizeof(ElemType)*(L->ListSize + LIST_INIT_SIZE));
if(!newbase)
{
printf(" , !
");
return ERROR;
}
L->Elem=newbase;
L->ListSize += LIST_INIT_SIZE;
}
ElemType *q = &(L->Elem[i-1]); //q
ElemType *p;
for(p = &(L->Elem[L->Length - 1]);p >= q; p--)
*(p+1) = *p;
*q = e;
L->Length++;
return OK;
}
Status DeleteList(pList *L,int i,ElemType *e)
{ // : L ,1≤i≤ListLength(L)
// : L i , e ,L 1
if(i < 1 || i > L->Length)
{
printf(" !
");
return ERROR;
}
ElemType *p = &(L->Elem[i-1]);
*e = *p;
ElemType *q=L->Elem + L->Length-1;
for(p = p + 1;p <= q;p++)
*(p-1) = *p;
L->Length--;
return OK;
}
void TraverseList(pList *L)
{ // : L
// :
int i;
if(L->Length == 0)
{
printf(" !
");
}
else
{
printf( " :");
for(i = 1; i <= L->Length ; i++)
printf("%d ", L->Elem[i-1]);
printf("
");
}
}
void SortList(pList *L)
{ //
if(L->Length == 0)
{
printf(" , !
");
exit(0);
}
Order order;
printf(" ,0 ,1 :");
scanf("%d",&order);
int i,j,tmp,max,min;
switch (order)
{
case 0: //
for(i = 0;i < L->Length-1;i++)
{
min = i;
for(j = i;j < L->Length;j++)
{
if(L->Elem[min] > L->Elem[j])
min = j;
}
tmp = L->Elem[i];
L->Elem[i] = L->Elem[min];
L->Elem[min] = tmp;
}
break;
case 1: //
for(i = 0;i < L->Length-1;i++)
{
max = i;
for(j = i;j < L->Length;j++)
{
if(L->Elem[max] < L->Elem[j])
max = j;
}
tmp = L->Elem[i];
L->Elem[i] = L->Elem[max];
L->Elem[max] = tmp;
}
break;
default:
break;
}
}
void InvertList(pList *L)
{ //
int i,j,k=L->Length,tmp;
for(i=0,j=k-1;iElem[i];
L->Elem[i]=L->Elem[j];
L->Elem[j]=tmp;
}
}
void Init()
{ //
printf("
");
printf(" :1
");
printf(" :2
");
printf(" :3
");
printf(" :4
");
printf(" :5
");
printf(" i :6
");
printf(" :7
");
printf(" :8
");
printf(" :9
");
printf(" i :10
");
printf(" i :11
");
printf(" :12
");
printf(" :13
");
printf(" :14
");
printf(" :0
");
}
int main(void)
{
pList L;
ElemType e; //e ,
int i; //i
srand((unsigned int)time(NULL)); // ,
Init();
int j=1; //j
while(j!=0)
{
scanf("%d",&j);
switch (j)
{
case 0:
exit(0);
break;
case 1:
if(InitList(&L))
{
printf("
");
for(i=1;i<=8;++i)
{
e=rand()%100+1;
InsertList(&L,i,e);
}
TraverseList(&L);
}
break;
case 2:
DestroyList(&L);
TraverseList(&L);
break;
case 3:
ClearList(&L);
TraverseList(&L);
break;
case 4:
if(ListEmpty(&L) == 0)
printf(" !
");
else
{
printf(" !
");
TraverseList(&L);
}
break;
case 5:
i=ListLength(&L);
printf(" %d
",i);
break;
case 6:
printf(" :");
scanf("%d",&i);
e=GetElem(&L,i,&e);
printf(" %d :%d
",i,e);
break;
case 7:
printf(" ,compare , !
");
break;
case 8:
printf(" :");
scanf("%d",&i);
e=PriorElem(&L,i,&e);
printf(" %d :%d
",i,e);
break;
case 9:
printf(" :");
scanf("%d",&i);
e=NextElem(&L,i,&e);
printf(" %d :%d
",i,e);
break;
case 10:
printf(" :");
scanf("%d %d",&i,&e);
InsertList(&L,i,e);
TraverseList(&L);
break;
case 11:
printf(" :");
scanf("%d",&i);
DeleteList(&L,i,&e);
printf(" :%d
",e);
break;
case 12:
TraverseList(&L);
break;
case 13:
SortList(&L);
TraverseList(&L);
break;
case 14:
InvertList(&L);
TraverseList(&L);
break;
default:
break;
}
}
return 0;
}