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