2.3线性表的链式表示和实现(1)未弄完待更改

Status ListInsert_Sq(SqList &L,int i,ElemType e)
{
    //在顺序线性表L中第i个位置之前插入新的元素e
    //i的合法值为1<=i<=ListLength_Sq(L)+1
    if(i<1||i>L.length)return ERROR;//i 值不合法
    if(L.length >= L.listsize)
    {
        newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
        if(!newbase)exit(OVERFLOW);//存储分配失败
        L.elem = newbase;
        L.listsize + = LISTINCREMENT;//增加存储容量
    }
    q=&(L.elem[i-1]); //q为插入位置
    for(p=&(L.elem[L.length-1]);p>=q;--p) 
        *(p+1)=*p; //插入位置及之后的元素移动
    *q = e;//插入e
    ++L.length //表长增1
    return OK;
}//
/*
    表示从链表的第i个元素开始一直到最后一个元素往后移一位
    p=&L.elem[L.length-1]意思是p赋初值为链表的最后一个元素地址,
    p>=q表示循环知道p<q的时候结束,--p是使p指针的指向往前移一位
*/
/*
删除第i个元素时,需要从第i+1至第n(共n-i)个元素依次向前移动一个位置
*/
Status ListDelete_Sq(SqList &L,int i,ElemType &e)
{
    //在顺序线性表L中删除第i个元素,并用e返回其值
    //i的合法值为1<=i<=ListLength.Sq(L)
    if(i<1||(i>L.length)) return ERROR; //i值不合法
    p = &(L.elem[i-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

int LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
//在顺序表中线L中查找第一个值与e满足compore()元素的位置顺序
{
//若找到,则返回其在L中的位序,否则返回0
i=1;//i的初值为第一个元素的位序
p=L.elem;//初值为第一个元素的存储位置
while(i<=L.length&&!(*compare)(*p++,e))++i;
if(i<=L.length) return i;
else return 0;
}//LocateElem_Sq

void MergeList_Sq(SqList La,SqList Lb,SqList &Lc)
//已经顺序线性表La和Lb的元素按值非递减排列
{
    pa = La.elem;pb = Lb.elem;
    Lc.listsize = Lc.length = La.length+Lb.length;
    pc = Lc.elem = (ElemType*)malloc(Lc.listsize*sizeof(ElemType));
    if(!Lc.elem)exit(OVERFLOW)
    pa_last = La.elem+La.length-1;
    pb_last = Lb.elem+Lb.length-1;
    while(pa<=pa_last&&pb<=pb_last)
    {
        if(*pa<=*pb) *pc++=*pa++;
        else *pc++ = *pb++
    }
    while(pa<=pa_last)*pc++=*pa++;  //插入La剩余的元素
    while(pb<=pb_last)*pc++=*pb++;  //插入Lb剩余的元素
}//MergeList

//-------------线性表的单链表的存储结构----------
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

Status GetElem_L(LinkList L,int i,ElemType &e)
//L表示带头结点的单链表的头指针
//当第i个元素存在时,其赋值给e并返回OK,否则返回error
{
    p = L->next;j=1;    //初始化,p指向第一个节点,j为计数器
    while(p&&j<i)       //顺时针向后查找,直到p指向第i个元素p为空
    {
        p=p->next;++j;
    }
    if(!p||j>i)return ERROR;//第i个元素不存在
    e=p->data;
    return OK;
}//GetElem_L

//基本操作:是比较j和i并向后移动指针p
//while循环体语句频度和表中的位置有关

//假设要在线性表的两个数据元素之间插入一个数据元素x
//已经知道p为单链表存储结构中的指向结点a的指针。
/*
插入数据元素x,首先要生成一个数据域为x的结点
(1)首先要生成一个数据域为X的结点(生成结点数据)
(2)修改结点a中的指针域,令其指向结点x(修改前一项指针域)
(3)修改结点x的指针域,指向b
详细看严蔚敏当时佩的图,讲的还是挺清晰的

删除线性表中的元素b是:(1)修改前一项的指针域即可
这条语句还是比较清晰的:
p->next = p->next->next
*/
//-------------线性表的单链表的存储结构----------
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
status ListInsert_L(LinkList &L,int i,ElemType e)
{
    //在带头节点的单链表线性表L中第i个前插入e
    p=L,j=0;
    while(p)
}

Status GetElem_L(LinkList L,int i,ElemType &e)
{
    //L为带头结点的单链表的头指针
    //当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
    p = L->next;j=1;
    while(p&&j<1)
    {
        p=p->next;++j;
    }
    if(!p||j>i)return ERROR; //第i个元素不存在
    e = p->data;             //取第i个元素
    return OK;
}//GetElem_L


//建立一个带头结点的单链表
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;//先建立一个带头结点的单链表

Status listInsert_L(Linklist&L,int i,ElemType e)
{
    //在带头节点的单链接线性表L中的第i个位置之前插入元素e
    p=L;j=0;  
    while(p&&j<i-1){p=p->next;++j};//寻找第一个节点
    if(!p||)
}



void InitSpace_SL(SLinkList &space)
{
    //将一维数组space中个分量链成一个备用链表,space[0].cur为头指针
    //“0”表示空指针
    for (i=0;i<MAXSIZE-1;++i)
    {
        space[i].cur = i+1;
    }
    space[MAXSIZE-1].cur = 0;
}//InitSpace_SL
//算法:2.14
int Malloc_SL(SLinkList &space)
//若备用空间链表非空,则返回分配的结点下标,否则返回0
{
    i = space[0].cur;
    if(space[0].cur)space[0].cur = space[i].cur;
    return i;
}//Malloc_SL
void Free_SL(SLinkList &space,int k)
{
    //将下标为k的空闲结点回收到备用链表

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值