typedef struct LNode
{
ElemType data;
LNode *next;
}LNode,*LinkList;
void InitList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));//产生头结点,并使L指向此头结点
if (!L)//存储分配失败
exit(OVERFLOW);
L->next = L;//指针域指向头结点
}
void DestroyList(LinkList &L)
{
//销毁线性表
LinkList p, q;
p = L->next;//p指向头结点
while (p != L)//没到表尾
{
q = p->next;
free(p);
p = q;
}
free(L);
L = NULL;
}
void ClearList(LinkList &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;//头结点指针域指向自身
}
Status ListEmpty(LinkList L)
{
if (L->next == L)//空
return TRUE;
else
return FALSE;
}
int ListLength(LinkList L)
{
int i = 0;
LinkList p = L->next;//p指向头结点
while (p != L)
{
i++;
p = p->next;
}
return i;
}
Status GetElem(LinkList L, int i, ElemType &e)
{
int j = 1;//初始化,j为计数器
LinkList p = L->next->next;
if (i <= 0 || i > ListLength(L))//第i个元素不存在
return ERROR;
while (j<i)
{
p = p->next;
j++;
}
e = p->data;
return OK;
}
int LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType))
{
//返回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(LinkList L, ElemType cur_e, ElemType &pre_e)
{
//若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义
LinkList p = L->next->next;//p指向第一个结点
LinkList q;
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(LinkList L, ElemType cur_e, ElemType &next_e)
{
//若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(LinkList &L, int i, ElemType e)
{
//在L的第i个位置之前插入元素e
LinkList p = L->next;//p指向头结点
LinkList s;
int j = 0;
if (i<0 || i>ListLength(L))
return ERROR;
while (j < i - 1)//寻找第i-1个结点
{
p = p->next;
j++;
}
s = (LinkList)malloc(sizeof(LNode));//生成新结点
s->data = e;
//插入L中
s->next = p->next;
p->next = s;
if (p == L)
{
L = s;
}
return OK;
}
Status ListDelete(LinkList &L, int i, ElemType &e)
{
//删除L的第i个元素,并由e返回其值
LinkList p = L->next;//p指向头结点
LinkList q;
int j = 0;
if (i<0 || i>ListLength(L))
return ERROR;
while (j < i - 1)//寻找第i-1个结点
{
p = p->next;
j++;
}
q = p->next;//q指向待删除结点
e = q->data;
p->next = q->next;
if (L == q)
L = p;
free(q);
return OK;
}
void ListTraverse(LinkList L, void(*vi)(ElemType))
{
//依次对L的每个数据元素调用函数vi()
LinkList p = L->next->next;//p指向首元结点
while (p != L->next)//p不指向头结点
{
vi(p->data);
p = p->next;
}
printf("\n");
}
//两个仅设表尾指针的循环链表的合并
void MergeList(LinkList &La, LinkList Lb)
{
//将Lb合并到La的表尾,由La指示新表
LinkList p = Lb->next;
Lb->next = La->next;
La->next = p->next;
free(p);
La = Lb;
}
3.数据结构 线性表_循环单链表(使用尾指针)
最新推荐文章于 2023-10-19 19:17:41 发布