C 언어 를 사용 하여 순환 단일 체인 표를 만 듭 니까?
#include
#include
typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}DLinkList;
/ / 우선 기본 함수 에 대해 설명 하고, 뒤쪽 은 주 함수 에서 호출 합 니 다.
void InitList(DLinkList *&L);
void CreateList(DLinkList *&L);
void DispList(DLinkList *L);
bool ListEmpty(DLinkList *L);
int ListLength(DLinkList *L);
bool ListInsert(DLinkList *&L,int i,ElemType e);
bool GetElem(DLinkList *L,int i,ElemType &e);
int locateElem(DLinkList *L,ElemType e);
bool ListDelete(DLinkList *&L,int i,ElemType &e);
void DestroyList(DLinkList *&L);
int main()
{
DLinkList *L;
ElemType e;
InitList(L);
CreateList(L);
DispList(L);
//
if(ListEmpty(L)==1)
printf("
");
else
printf("
");
ListInsert(L,2,'a');
ListInsert(L,1,'e');
DispList(L);
printf(" :%d
",ListLength(L));
if(GetElem(L,5,e)==1)
printf("%c
",e);
else
printf(" 。");
printf("%d
",locateElem(L,'d'));
ListDelete(L,1,e);
DispList(L);
DestroyList(L);
return 0;
}
/ / 순환 단일 체인 테이블 초기 화
void InitList(DLinkList *&L)
{
L=(DLinkList *)malloc(sizeof(DLinkList));//
L->next=L;
}
/ / 꼬리 삽입 법 으로 순환 싱글 체인 표를 만 듭 니 다.
//
void CreateList(DLinkList *&L)
{
DLinkList *p,*s;
ElemType i;
L=(DLinkList *)malloc(sizeof(DLinkList));
p=L;
p->next=L;
while(1)
{
scanf("%c",&i);
if(i=='z')
break;
s=(DLinkList *)malloc(sizeof(DLinkList));
s->data=i;
s->next=p->next;
p->next=s;
p=s;
}
}
/ / 출력 순환 싱글 체인 시트
//
void DispList(DLinkList *L)
{
DLinkList *p;
p=L->next;
while(p!=L)
{
printf("%c",p->data);
p=p->next;
}
printf("
");
}
/ / 단일 체인 시트 가 비어 있 는 지 판단
bool ListEmpty(DLinkList *L)
{
return (L->next==L);
}
/ / 단일 체인 시트 의 길 이 를 구 합 니 다.
int ListLength(DLinkList *L)
{
int j=0;
DLinkList *p=L->next;
while(p!=L)
{
j++;
p=p->next;
}
return j;
}
/ / 순환 단일 링크 에 데이터 요 소 를 삽입 합 니 다.
//
bool ListInsert(DLinkList *&L,int i,ElemType e)
{
int j=1;
DLinkList *p=L->next,*s;
while(p!=L&&jnext;
j++;
}
if(i==1)
{
s=(DLinkList *)malloc(sizeof(DLinkList));
s->data=e;
s->next=p;
L->next=s;
return true;
}
else if(j!=i-1)
return false;
else
{
s=(DLinkList *)malloc(sizeof(DLinkList));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
/ / 단일 체인 시트 의 어느 위치 에 있 는 요소 값 을 찾 습 니 다.
bool GetElem(DLinkList *L,int i,ElemType &e)
{
int j=1;
DLinkList *p=L->next;
while(jnext;
j++;
}
if(j!=i)
return false;
else
{
e=p->data;
return true;
}
}
/ / 원소 값 에 따라 이 원소 가 이 단일 체인 테이블 에 있 는 위 치 를 찾 습 니 다
//
int locateElem(DLinkList *L,ElemType e)
{
int i=1;
DLinkList *p=L->next;
while(p!=L&&p->data!=e)
{
i++;
p=p->next;
}
if(p==L)
return 0;
else
return i;
}
/ / 순환 단일 체인 테이블 의 원소 값 삭제
bool ListDelete(DLinkList *&L,int i,ElemType &e)
{
int j=1;
DLinkList *p=L->next,*q;
while(jnext;
}
if(i==1)
{
q=L->next;
if(q==L)
return false;
e=q->data;
L->next=q->next;
free(q);
return true;
}else if(j!=i-1)
return false;
else
{
q=p->next;
if(q==L)
return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}
/ / 순환 단일 체인 테이블 폐기
void DestroyList(DLinkList *&L)
{
DLinkList *pre=L,*p=L->next;
while(p!=L)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}