线性表的链性存储结构
线性表中的数据元素(结点)在存储器的位置是任意的,即逻辑上相邻的数据元素在物理位置上不一定相邻
结点
链表
n个结点由指针链组成一个链表
单链表的基本操作
单链表的初始化
构造一个空表
步骤:
生成新结点作为头结点,用头指针L去指向头结点
将头结点的指针域置空
Status InitList_L(LinkList &L){
L = new LNode;
L->next=NULL;
return OK;
}
补充: 判断链表是否为空
int ListEmpty(LinkList L){
> if(L->next)//非空
> return 0;
> else
> return 1;
> }
补充:单链表的销毁
首先让 P =L
然后将L的下一个地址赋值给L,L = L->next
然后就可以放心删除(释放)前一个数据了,delete P
就这样依次释放所有结点,直到 L==NULL
Status DestroyList_L(LinkList &L){
Lnode *p
while(L){
p=L;
L = L->next;
delete P;
}
}
补充:清空链表,链表依然存在,只是没有元素了。只剩下头指针和头结点
首先将首元结点赋值给p,p= L->next
这时候引入另外一个指针,记录p结点的下一个结点的数据。q=p->next
然后就可以放心删除p结点了。delete p
接下来反复执行:
p=q
q = q->next
结束条件:p==NULL
循环条件:p!=NULL
Status ClearList(LinkList &L){
Lnode *p,*q;
p =L->next;
while(p){
q = p->next;
delete p;
p=q;
}
L->next ==NULL;
return OK;
}
补充:求链表的表长
int ListLength_L(LinkList L){
LinkList p;
p = L->next;//p指向第一个结点
int i =0;
while(p){ //遍历链表统计结点数
i++;
p =p->next;
}
return i;
}
补充:取单链表第i个元素的内容
由于链表不是随机存取结构
所以必须从头指针出发,顺着next逐个结点往下找,直到第i个为止
Status GetElem_L(LinkList L,int i,ElemType &e){
p =L->next; j =1;//初始化
while(P&&j<i){ //向后扫描,直到p指向第i个节点或p为空
p=p->next;j++;
}
if(!p丨丨j>i) return error;//第i个不存在
e=p->data;//取第i个元素
return ok;
}
链表的查找–按值查找,时间复杂度为O(n)
步骤:
从第一个结点开始,一次和e相比较
如果找到一个值和e相等,则返回他的位置或者地址
如果找遍了都没找到,则返回0或者null
Lnode*LocateElem_L(LinkList L,ElemTpe e){
p = L->next;
while(p&&p->data!=e)
p=p->next;
return 0;
}
插入–在第i个结点前插入一个e结点 时间复杂度为O(1)
步骤:
首先要找到第i-1个结点的存储位置p
生成一个数据域为e的新结点s
新结点的指针域指向a_i s->next = p->next
结点a_i-1的指针域指向新结点 p->next = s
Status Listinsert_L(LinkList&L,int i,ElemType e){
p=L;j=0;
while(p&&j<i-1){p=p->next;++j}//寻找第i-1个结点,p i-1结点
if(!p丨丨j>i-1)return error;//i大于表长+1或者下于1,插入位置非法
s= new LNode;
s->data=e;//生成新结点s,数据域为e
s->next = p->next;
p->next = s;
return ok;
}
删除第i个结点 时间复杂度为O(1)
步骤:
首先找到第a_i-1的存储位置p,保存要删除的a_i的值
令p->next = a_i+1
p->next = p->next->next
Status ListDelete_L(LinkList &L,int i,ElemTpye &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->data;//保存删除结点的数据域
delete q;//释放删除结点的空间
return ok;
}