運用C語言建立循環單鏈表?

#include<stdio.h>
#include<malloc.h>

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("該單鏈表爲空\n");
	else
		printf("該單鏈表不爲空\n");
	ListInsert(L,2,'a');
	ListInsert(L,1,'e');
	DispList(L);
	printf("該單鏈表的長度爲:%d\n",ListLength(L));
	if(GetElem(L,5,e)==1)
		printf("%c\n",e);
	else
		printf("該元素不存在。");
	printf("%d\n",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("\n");
}

//判斷單鏈表是否爲空

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&&j<i-1)//尋找第i-1個節點
	{
		p=p->next;
		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(j<i&&p!=L)
	{
		p=p->next;
		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(j<i-1&&p!=L)
	{
		j++;
		p=p->next;
	}
	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);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章