数据结构04:
线性表操作:
Listelete(&L,i,&e)的实现
我们要考虑 删除线性表中的元素 线性表的结构发生变化没有。
问:删除元素时,线性表的逻辑结构发生什么变化。
考虑最坏的情况。
考虑平局情况:
ListDelete:(思想)
1、判断删除的位置是否合法。
2、p为被删除元素的位置
3、删除元素的值赋给e
4、表尾元素的位置
5、被删除元素之和的元素左移
//先理解思想,后面的代码可以用多种语言去实现这个思路。
//每种语言有它的特色,java 面向对象,C 面向过程
//以下是伪代码:
Status ListDelete Sq(SqList &L,int pos,ElemType &e)
{
if((pos<1)||(pos>L.length)){return ERROR;}//删除位置不合法
p=&(L.elem[pos-1]);//p为被删除元素的位置
e=*p; //删除元素的值赋给e
q=L.elem+L.length-1; //表尾元素的位置
for(++p;p<=q;++p){
*(p-1)=*p;//被删除元素之和的元素左移
}
--L.length; //表长度减一
return OK;
}//ListDelete_Sq
//此算法的时间复杂度为 O(ListLength())
以元素(数据元素的映像)+
指针(指示后继元素存储位置的)=结点(表示数据元素)
以“结点的序列”表示线性表------称作链表
数据域+指针域
单链表
Typedef struct LNode{
ElemType data;//数据域
struct Lnode *next;//指针域
}//LNode ,*LinkList
线性表的操作GetElem(l,i,&e)
在链表中的实现。
基本操作位:使指针p始终指向线性表中第j个数据元素
GetElem
//初始化,p指向第一个节点,j为技数器
//赋指针向查找,自到p指向第pos个元素或p为空
//第pos个元素不存在
//取第pos个元素
Status GetElem L(LinkList L,int pos,ElemType &e){
p=L->next;j=1;
while(p&&j<pos){p=p->next;++j}//赋指针向后查找,直到p指向第pos个元素或p为空
if(!p||j>pos){
return ERROR;//第pos个元素不存在
}
e=p->data; //取第pos个元素
return OK;
}//GetElem_1
ListInsert:
//寻找第pos-1个节点
//pos小于1或者大于表长
//生成新节点
//插入L中
status ListInsert L(LinkList L,int pos,ElemType e){
p=L;j=0;
while(p&&j<pos-1){//寻找第pos-1个节点
p=p->next;++j;
}
if(!p||j>pos-1){
return ERROR;//pos小于1或者大于表长
}
s=(LinkList)malloc (sizeof(LNode));//生成新节点
s->data=e;s->next=p-next;//插入L中
p->next=s;
return OK;
}//LinstInsert_L
线性表操作:
Listelete(&L,i,&e)的实现
我们要考虑 删除线性表中的元素 线性表的结构发生变化没有。
问:删除元素时,线性表的逻辑结构发生什么变化。
考虑最坏的情况。
考虑平局情况:
ListDelete:(思想)
1、判断删除的位置是否合法。
2、p为被删除元素的位置
3、删除元素的值赋给e
4、表尾元素的位置
5、被删除元素之和的元素左移
//先理解思想,后面的代码可以用多种语言去实现这个思路。
//每种语言有它的特色,java 面向对象,C 面向过程
//以下是伪代码:
Status ListDelete Sq(SqList &L,int pos,ElemType &e)
{
if((pos<1)||(pos>L.length)){return ERROR;}//删除位置不合法
p=&(L.elem[pos-1]);//p为被删除元素的位置
e=*p; //删除元素的值赋给e
q=L.elem+L.length-1; //表尾元素的位置
for(++p;p<=q;++p){
*(p-1)=*p;//被删除元素之和的元素左移
}
--L.length; //表长度减一
return OK;
}//ListDelete_Sq
//此算法的时间复杂度为 O(ListLength())
以元素(数据元素的映像)+
指针(指示后继元素存储位置的)=结点(表示数据元素)
以“结点的序列”表示线性表------称作链表
数据域+指针域
单链表
Typedef struct LNode{
ElemType data;//数据域
struct Lnode *next;//指针域
}//LNode ,*LinkList
线性表的操作GetElem(l,i,&e)
在链表中的实现。
基本操作位:使指针p始终指向线性表中第j个数据元素
GetElem
//初始化,p指向第一个节点,j为技数器
//赋指针向查找,自到p指向第pos个元素或p为空
//第pos个元素不存在
//取第pos个元素
Status GetElem L(LinkList L,int pos,ElemType &e){
p=L->next;j=1;
while(p&&j<pos){p=p->next;++j}//赋指针向后查找,直到p指向第pos个元素或p为空
if(!p||j>pos){
return ERROR;//第pos个元素不存在
}
e=p->data; //取第pos个元素
return OK;
}//GetElem_1
ListInsert:
//寻找第pos-1个节点
//pos小于1或者大于表长
//生成新节点
//插入L中
status ListInsert L(LinkList L,int pos,ElemType e){
p=L;j=0;
while(p&&j<pos-1){//寻找第pos-1个节点
p=p->next;++j;
}
if(!p||j>pos-1){
return ERROR;//pos小于1或者大于表长
}
s=(LinkList)malloc (sizeof(LNode));//生成新节点
s->data=e;s->next=p-next;//插入L中
p->next=s;
return OK;
}//LinstInsert_L