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);
}

좋은 웹페이지 즐겨찾기