第二章.线性表(严版教材相关代码)

本文详细介绍了线性表的顺序表和链表表示,包括插入、删除、查找等操作的C语言实现。讨论了顺序表的合并、插入、删除算法,以及链表的创建、插入、删除和合并等操作。此外,还涉及了一元多项式的表示及相加。
摘要由CSDN通过智能技术生成

线性结构:线性表,栈和队列,串。        

线性结构特点:1、存在唯一的一个第一个数据元素。2、存在唯一的一个最后一个数据结构。3、除开头结尾元素外,每个元素只有一个前驱,一个后继。

顺序表相关代码:

例2-1.将所有在线性表Lb中但不在La中的数据元素插入到La中

 void union(list &La,list Lb){

    La_len=listLength(La),Lb_len=listLength(Lb) ;

    for(int j=0;j<Lb_len;j++){

        getlem(Lb,j,e);

    if(!LocateElem(La,e,equal))    ListInsert(La,La_len++,e);

 }   

}

例2-2.La,Lb非递减排列,合并La,Lb使其仍然满足非递减

void union(List La,List Lb,List &Lc){

    La_len=ListLength(La),Lb_len=ListLength(Lb);

    int i=1,j=1,k=0;

    while(i<=La_len&&j<=Lb_len){

     getElem(La,i,ai),getElem(Lb,j,bj);

    if(ai<=bj)    ListInsert(Lc,++k,ai),i++;

    else    ListInsert(Lc,++k,bj),j++;

 }

    if(La_len>Lb_len)    ListInsert(Lc,++k,ai);

    else    ListInsert(Lc,++k,bj);

 }

 算法2.3

status ListInsert_sq(splits &L,int i,Elemtype){

    if(I<1|| I>L.length+1)    return error;//在顺序表的第I个位置之前插入一个新元素 e

    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]);

    for(p=&(L.elem[L.length-1]);p>=q;--p)    *(p+1)=*p;

    *q=e;

    ++L.length;

    return ok;

 }

算法2.4

status listdelet(sqlist &L,int I,Elemtype &e ){

    if((i<1)||(i>L.length))    return error;

    p=&(L.elem[i-1]);

    e=*p;

    q=L.elem+L.length-1;

    for(++p;p<=q;++p)

            *(p-1)=*p;

    --L.length;

    return ok;

 }

算法2.5

int locatelem_sq(sqlist L,elemtype e,status (* compare)(elemtype,elemtype) ){

    i=1;

    p=L.elem;

    while(i<=Length&&!(*compare)(*p++,e))    ++I;

    if(I<=L.length)    return I;

    else return 0;

}

算法2.6(对比算法2.2)

void mergelist_sq(sqlist La,sqlist La,sqlist &Lc){

    pa=La.elem,pb=Lb.elem;

    Lc.listsize=Lc.listlength=La.length+Lb.length;

    pc=Lc.elem=(Elemtype*)malloc(Lc.listsize*sizeof(Elemtype));

    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++;

    while(pb<=pb_last)    *pc++=*pb++;

}

线性表的链式表示和实现:

status getlem_L(LinkList L,int i,ElemType &e){

    p=L->next;    //返回第I个元素的值

    int j=1;

    while(p&&j<i){

    p=p->next;

    j++;

}

    if(!p||j>i)    return error;

    e=p->data;

    return ok;

}

算法2.8

status ListInsert_L(LinkList &L,int I,Elemtype e){

    p=L;            //第i 个元素之前插入元素e

    int j=0;

    while(p&&j<i-1){

    p=p->next;

    j++;

}

    if(!p||j>I-1)    return error;

    s=(LNode *)malloc(sizeof(LNode));

    s->data=e;s->next=p->next;

    p->next=s;

    return ok;

}

算法2.9

status Listdelete_L(Linklist &L,int i,Elemtype &e){

    p=L;            //删除第i个元素的值

    int j=0;

    while(p&&j<i-1){

        p=p->next;

        j++;

}

    if(j>I-1 || p->next==NULL)    return error;

    q=p->next;

    p->next=q->next;

    e=q->data;

    free(q);

    return ok;

}

算法2.10

void create list_L(Linklist &L,int n)

{        //逆序输入n个元素的值

    L=(LNode *)malloc(sizeof(LNode));

    L->next=NULL;

    for(int I=n;i>0;i--){

    p=(LNode *)malloc(sizeof(LNode));

    scanf(&p->data);

    p->next=L->next;        //r->next=p;r=p;尾插法

    L->next=p;

}

    }

算法2.11

   void mergeList_L(Linklist La,Linklist Lb,Linklist &Lc){

        pa=La->next;       //合并两个有序链表

        pb=Lb->next;

        Lc=(LNode *)malloc(sizeof(LNode));

        Lc->next=NULL;

        while(pa&&pb){

        if(pa->data<=pb->data){

        Lc->next=pa;

        Lc=pa;

        pa=pa->next;

}

        else{Lc->next=pb;Lc=pb;pb=pb->next;}

        Lc->next=pa?pa:pb;

}

}

算法2.12(静态链表相关代码略)

算法2.18

status ListInsert_DUL(Dulinklist &L,int I,Elemtype e){

    s=(DuLNode *)malloc(sizeof(DuLNode));

    s->data=e;

    s->prior=p->prior;

    p->prior->next=s;

    s->next=p;

    p->prior=s;

    return ok;

}

算法2.19

status Listdelet(DuLinklist &L,int i,Elemtype &e){

    e=p->data;

    p->prior->next=p->next;

    p->next->prior=p->prior;

    free(p);

    return ok;

}

一元多项式的表示及相加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值