一、顺序存储实现
//初始化(建立空的顺序表)
List MakeEmpty()
{
List PtrL;
PtrL=(List)malloc(sizeof(struct LNode));
PtrL->Last=-1;
return PtrL;
}
//查找
int Find(ElementType X,List PtrL)
{
int i=0;
while(i<=PtrL->Last && PtrL->DATA[i]!=X)
{i++;}
if(i>PtrL->Last) return -1;
else return i;
}
//插入
//要先移动,先检查空间是否足够,再插入
void Insert(ElementType X,int i,List PtrL)
{
int j;
if(PtrL->Last==MAXSIZE-1)
{
cout<<"表空间已满,不能插入";
return;
}
if(i<0||i>PtrL->Last)
{
cout<<"位置不合法";
return;
}
for(j=PtrL->Last;j>=i;j--)
{
PtrL->Data[j+1]=PtrL->Data[j];
}
PtrL->Data[i]=X;
PtrL->Last++;//*Last仍然指向最后的元素
return;
}
//删除
void Delete(int i,List PtrL)
{
int j;
if(i<0||i>PtrL->Last)
{
cout<<"不存在此元素";
return;
}
for(j=i;j<=PtrL->Last;j++)
{PtrL->Data[j]=PtrL->Data[j-1];}
return;
}
二、链式存储实现
求表长
//求表长
int Length(List PtrL)
{
List p=PtrL;//p指向第一个节点
int j=0;
while(p)
{
p=p->Next;
j++;//令p指向第j个结点
}
return j;
} //时间性能为O(n)
查找:1)按序号查找;2)按值查找
//查找
//1.按序号查找
List Findth(int k,List PtrL)
{
List p=PtrL;
int i=0;
while(p!=NULL&&i<k)//该值不为空或序号小于k时
{
p=p->Next;
i++;
}
if(i==k) return p;//找到第k个,返回
else return NULL;
}
//2.按值查找
List Find(ElementType x,List PtrL)
{
List p=PtrL;
while(p!=NULL && p->Data!=x)//该值不为空或p指向的值不为x时
{p=p->Next;}
return p;
}//平均性能为O(n)
插入
//插入
void Insert(ElementType x,int i,List Ptrl)
{
int j;
if(Ptrl->Last==MAXSIZE-1)
{cout<<"表空间已满,不能插入";}
return;
if(i<1||i>Ptrl->Last+1)
{
cout<<"位置不合法";
return;
}
for(j=Ptrl->Last;j>=i;j--)
{
Ptrl->Data[j+1]=Ptrl->Data[j];
}
Ptrl->Data[i]=x;
Ptrl->Last++;
return;
}
删除
//删除
void Delete(int i,List Ptrl)
{
List p,s;
if(i==1)
{
s=Ptrl;
if(Ptrl!=NULL) Ptrl=Ptrl->Next;
else return NULL;
free(s);
return Ptrl;
}
p=FindKth(i-1,Ptrl)//查找第i-1个结点
if(p=NULL)
{
cout<<"不存在";return NULL;
}else if(p->Next==NULL)
{
cout<<"不存在";return NULL;
}else
{
s=p->Next;
p->Next=s->Next;//删除
free(s);//释放被删除结点
return Ptrl;
}
} //平均时间性能为O(n)
广义表
线性表的推广
多重链表
链表中的节点可能同时属于多个链,一个结点可能会有多个指针域,如图、树这样复杂的数据结构可以用多重链表实现存储。
一个典型——十字链表:
只存储非0元素,结点的行坐标Row、列坐标Col、数值Value,每个结点通过两个指针域把同行、同列串起来
行指针Right、列指针Down