単一サイクルチェーンテーブルに関する操作
4890 ワード
#include /* malloc() */
#include /* EOF(=^Z F6),NULL */
#include /* atoi() */
#include /* eof() */
#include /* exit() */
/* */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2 math.h OVERFLOW 3, */
typedef int Status; /* Status , , OK */
typedef int Boolean; /* Boolean , TRUE FALSE */
typedef int ElemType
struct LNode
{
ElemType data;
struct LNode *next;
};
typedef struct LNode *LinkList; /* LinkList */
/* bo2-4.c ( c2-2.h ) 12 */
Status InitList_CL(LinkList *L)
{ /* : L */
*L=(LinkList)malloc(sizeof(struct LNode)); /* , L */
if(!*L) /* */
exit(OVERFLOW);
(*L)->next=*L; /* *////////
return OK;
}
Status DestroyList_CL(LinkList *L)
{ /* : L */
LinkList q,p=(*L)->next; /* p */
while(p!=*L) /* */
{
q=p->next;
free(p);
p=q;
}
free(*L);
*L=NULL;/////
return OK;
}
Status ClearList_CL(LinkList *L) /* L */
{ /* : L 。 : L */
LinkList p,q;
*L=(*L)->next; /* L */
p=(*L)->next; /* p */
while(p!=*L) /* */
{
q=p->next;
free(p);
p=q;
}
(*L)->next=*L; /* */
return OK;
}
Status ListEmpty_CL(LinkList L)
{ /* : L 。 : L , TRUE, FALSE */
if(L->next==L) /* */
return TRUE;
else
return FALSE;
}
int ListLength_CL(LinkList L)
{ /* :L 。 : L */
int i=0;
LinkList p=L->next; /* p */
while(p!=L) /* */
{
i++;
p=p->next;
}
return i;
}
Status GetElem_CL(LinkList L,int i,ElemType *e)
{ /* i , e OK, ERROR */
int j=1; /* ,j */
LinkList p=L->next->next; /* p */
if(i<=0||i>ListLength_CL(L)) /* i */
return ERROR;
while(jnext;
j++;
}
*e=p->data; /* i */
return OK;
}
int LocateElem_CL(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{ /* : L ,compare() */
/* : L 1 e compare() 。 */
/* , 0 */
int i=0;
LinkList p=L->next->next; /* p */
while(p!=L->next)
{
i++;
if(compare(p->data,e)) /* */
return i;
p=p->next;
}
return 0;
}
Status PriorElem_CL(LinkList L,ElemType cur_e,ElemType *pre_e)
{ /* : L */
/* : cur_e L , , pre_e , */
/* ,pre_e */
LinkList q,p=L->next->next; /* p */
q=p->next;
while(q!=L->next) /* p */
{
if(q->data==cur_e)
{
*pre_e=p->data;
return TRUE;
}
p=q;
q=q->next;
}
return FALSE;
}
Status NextElem_CL(LinkList L,ElemType cur_e,ElemType *next_e)
{ /* : L */
/* : cur_e L , , next_e , */
/* ,next_e */
LinkList p=L->next->next; /* p */
while(p!=L) /* p */
{
if(p->data==cur_e)
{
*next_e=p->next->data;
return TRUE;
}
p=p->next;
}
return FALSE;
}
Status ListInsert_CL(LinkList *L,int i,ElemType e) /* L */
{ /* L i e */
LinkList p=(*L)->next,s; /* p */
int j=0;
if(i<=0||i>ListLength_CL(*L)+1) /* i */
return ERROR;
while(jnext;
j++;
}
s=(LinkList)malloc(sizeof(struct LNode)); /* */
s->data=e; /* L */
s->next=p->next;
p->next=s;
if(p==*L) /* */
*L=s;
return OK;
}
Status ListDelete_CL(LinkList *L,int i,ElemType *e) /* L */
{ /* L i , e */
LinkList p=(*L)->next,q; /* p */
int j=0;
if(i<=0||i>ListLength_CL(*L)) /* i */
return ERROR;
while(jnext;
j++;
}
q=p->next; /* q */
p->next=q->next;
*e=q->data;
if(*L==q) /* */
*L=p;
free(q); /* */
return OK;
}
Status ListTraverse_CL(LinkList L,void(*vi)(ElemType))
{ /* :L 。 : L vi()。 vi() , */
LinkList p=L->next->next;
while(p!=L->next)
{
vi(p->data);
p=p->next;
}
printf("
");
return OK;
}
/* main2-4.c , bo2-4.c */
#include"c1.h"
typedef int ElemType;
#include"c2-2.h"
#include"bo2-4.c"
Status compare(ElemType c1,ElemType c2)
{
if(c1==c2)
return TRUE;
else
return FALSE;
}
void visit(ElemType c)
{
printf("%d ",c);
}