数据结构_数据结构与算法04

数据结构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


















没有更多推荐了,返回首页