算法一 取值
Status GetElem_L(LinkList L, int i, ElemType& e) {
p = L->next; j = 1;
while (p && j < i) {
p = p->next; ++j;
}
if (!p || j > i)return ERROR;
e = p->data;
return OK;
}
算法二 查找
时间复杂度为O(n)
//按值查找,返回地址
Lnode* LocateElem_L(LinkList L, ElemType e) {
p = L->next;
while (p && p->data != e)
p = p->next;
return p;
}
//按值查找,返回序号
int LocateElem_L(LinkList L, ElemType e) {
p = L->next; j = 1;
while (p && p->data != e) {
p = p->next;j++
}
if (p)return j;
else return 0;
}
算法三 插入
插入是有顺序的,时间复杂度为O(1)
Status ListInsert_L(LinkList& L, int i, ElemType e) {
p = L; j = 0;
while (p && j < i - 1) {//p不是空表
p = p->next;//找到第i-1的位置
++j;
}
if (!p || j > i - 1)return ERROR;//I大于表长+1或者小雨1,插入位置非法
s = new LNode;
s->data = e;//生成新结点S,将S的数据阈设置为e
s->next = p->next;
p->next = e;
return OK;
}//ListInsert_L
算法四 删除
时间按复杂度为O(1)
Status ListDelete_L(LinkList& L, int i, ElemType& e) {
p = L; j = 0;
while (p->next && j < i - 1) { p = p->next; ++j; }//寻找第i个结点并令p指向其前驱
if (!(p->next) || j > i - 1)return ERROR;//删除位置不合理
q = p->next;//临时保存被删除结点
p->next = q->next;//改变删除节点前驱的指针域
e = q->next;//保存删除节点的数据阈
delete q;//释放删除节点的空间
return OK;
}//ListDelete_L
地址和数据不是一个东西,放在节点里边才是一个东西,才有删除这个概念。
PS:
红点为p的next阈,存的是ai的地址