线性表的链式存储实现
typedef struct LNode *List;
struct LNode {
ElementType Data;
List Next;
};
struct Lnode L;
List PtrL
求表长(链表)
时间性能为O(n)
int Length(List PtrL)
{
LIst p=PtrL;
int j=0;
while(p)
{
p=p->Next;
j++;
}
return j;
}
查找(链表)
平均时间性能为O(n)
//按值查找
- #define ERROR NULL
Position Find( List L, ElementType X )
{
Position p = L; /* p指向L的第1个结点 */
while ( p && p->Data!=X )
p = p->Next;
return 0;
/* 下列语句可以 替换return p;
if ( p )
return p;
else
return ERROR;*/
}
---------------------------------------------------------
//按序号查找
List FindKth(int K,List PtrL)
{
List p=PtrL;
int i=1;
while(p!=NULL&&i<K)
{
p=p->Next;
i++
}
if(i==K)return p;//找到第K个,返回指针
else return NULL;//否则返回NULL
插入 (链表)(在第i-1(1<=i<=n+1)个结点后插入一个值为X的新结点)
平均查找次数为n/2
平均时间性能为O(n)
- 先构造一个新结点,用s指向
- 再找到链表的第i-1个结点,用p指向
- 然后修改指针,插入结点(p之后插入的新节点是s)
List Insert( ElementType X , int i , List PtrL )
{
List p,s;
if(i==1)
{
s=(List)malloc(sizeof(struct LNode));
s->Date=X;
s->Next=PtrL;
return s;
}
p=FindKth(i-1,PtrL);
if(p==NULL)
{
printf("参数%d错误",i);
return NULL;
}
else
{
s=(List)malloc(sizeof(struct LNode));
s->Date=X;
s->Next=p->Next;
p->Next=s;
return PtrL;
}
删除(链表) (删除链表的第i(1<=i<=n)个位置上的结点)
平均查找次数为n/2
平均时间性能为O(n)
- 先找到链表的第i-1个结点,用p指向
- 再用指针s指向要被删除的结点(p的下一个结点)
- 然后修改指针,删除s所指结点
- 最后释放s所指结点的空间
List Delete(int i,List PtrL)
{
List p,s;
if(i==1)
{
s=PtrL;
if(PtrL!=NULL)PtrL=PtrL->Next;
else return NULL;
return PrtL;
}
p=FindKth(i-1;PtrL)
if(PtrL==NULL)
{
printf("第%d个结点不存在",i-1); return NULL;
}
else if(p->Next==NULL)
{
printf("第%d个结点不存在",i);return NULL;
}
else
{
s=p->Next;
p->Next=s->Next;
free(s);
return PtrL;
}
}
内容来自mooc浙江大学数据结构课程由陈越老师,何钦铭老师任课