/*
*Copyright(c) 2017,YTU CS
*All right reserved.
*作 者:王铭泽.
*完成日期:2017,9,21
*版 本 号: v1.0
*
*问题描述: 算法库包括两个文件:
头文件:linklist.h,包含定义顺序表数据结构的代码、宏定义、要实现算法的函数的声明;
源文件:linklist.cpp,包含实现各种算法的函数的定义
*输 入: 无
*输 出: 两个不同方式建立的链表。
*/
本文章是上一篇文章的续,再次文章中添加了六个函数算法分别是:1.判断链表是否为空。2.求链表长度。3.求链表中某个数据的元素值。4.按元素查找。5.插入元素。6.删除元素。
附上代码:
//判断是否为空表
bool ListEmpty(LinkList *L)
{
return (L->next==NULL);
}
//求链表长度
int ListLength(LinkList *L)
{
int i=0;
LinkList *p;
p=L;
while(!p->next==NULL)
{
i++;
p=p->next;
}
return i;
}
//求线性表中某元素的值
bool GetElem(LinkList *L,int i,Elemtype &e)
{
LinkList *r=L;
int j=0; //记录数据的个数。
if(i<0) return false;//容错判断
//开始查找第i个元素。
while(j<i && r!=NULL)
{
j++;
r=r->next;//指向的是j的后一个元素。
}
if(r==NULL)
return false;
else
{
e=r->data;
return true;
}
}
//按元素查找位置
int LocateElem(LinkList *L,Elemtype e)
{
LinkList *r=L->next;
int j=1;
//观察&&不同对结果的影响。测试后感觉没有影响!?
//计算顺序是如果&&前的条件成立则不进行下一步的计算。
while(r->next !=NULL && r->data!=e)
{
r=r->next;
j++;
}
if(r->next==NULL)
{
return 0;
}
else
{
return j;
}
}
//插入元素
bool ListInsert(LinkList *&L,int i,Elemtype e)
{
int j=0;
LinkList *r=L,*s;
i--;
if(i<0) return false;
//完成r指向第i-1个元素。
while(j<i && r!=NULL)
{
j++;
r=r->next;
}
if(r==NULL)
return false;
else
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=e;
s->next=r->next;
r->next=s;
return true;
}
}
//删除元素
bool ListDelete(LinkList *&L,int i,Elemtype &e)
{
LinkList *r=L,*s;
int j=0;
if(i<0) return false;
i--;
while( j<i && r!=NULL )
{
j++;
r=r->next;
}
if(r==NULL)
return false;
else
{
s=r->next;
//注意判断当恰好取到最后一个元素的时候。
if(s->next==NULL)
return false;
e=s->data;
r->next=s->next;
free(s);
return true;
}
}
以上这些函数与之前的函数形成了比较完整的链表算法库,供以后进行链表基本运算使用和借鉴。