顺序表的合并

来源:互联网 发布:怎么找淘宝客推广 编辑:程序博客网 时间:2024/05/27 01:07

参考书目

清华大学 严蔚敏 《数据结构》C语言版
《数据结构》算法实现及其解析 高一凡


代码

#include<stdio.h>#include<process.h>#include<malloc.h>#define LIST_INIT_SIZE 10#define LISTINCREMENT 2#define OVERFLOW -2#define OK 1#define ERROR 0#define INFEASIBLE -1typedef int ElemType;typedef int Status;typedef struct {    ElemType *elem;    int length;    int listsize;}SqList;Status InitList(SqList &L){//操作结果:构造一个空的顺序线性表    L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));    if(!L.elem)        exit(OVERFLOW);    L.length = 0;    L.listsize = LIST_INIT_SIZE;    return OK;}Status ListInsert(SqList &L, int i, ElemType e) //算法2.4{ //初始条件:顺序线性表L已存在, 1≤i ≤ListLenth(L) + 1  //操作结果:在L中第i个位置之前插入新的数据元素e,L的长度+1    ElemType *newbase,  *q, *p;    if(i < 1 || i > L.length + 1)        return ERROR;    if(L.length >= L.listsize) //当前存储空间已满,增加分配    {        if(!(newbase = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType))))            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;}Status ListTraverse(SqList L, void(*vi)(ElemType&)){ //初始条件:顺序线性表L已存在   //操作结果:依次对L的每个数据元素调用函数vi()。一但vi()失败,则操作失败  //          vi()的形参加&, 表明可通过调用vi()改变元素的值    ElemType *p;    int i;    p = L.elem;    for(i = 1; i <= L.length; i++)    vi(*p++);    printf("\n");     return OK;}void MergeList(SqList La, SqList Lb, SqList &Lc){    ElemType *pa, *pa_last, *pb, *pb_last, *pc;    pa = La.elem;    pb = Lb.elem;    pa_last = La.elem + La.length - 1;    pb_last = Lb.elem + Lb.length - 1;    Lc.listsize = Lc.length = La.length + Lb.length;    pc = Lc.elem = (ElemType*)malloc(Lc.listsize*sizeof(ElemType));    if(!Lc.elem)        exit(OVERFLOW);    while(pa <= pa_last && pb <= pb_last)    {        *pa<=*pb ? *pc++ = *pa++ : *pc++ = *pb++;    }    while(pa <= pa_last)         *pc++ = *pa++;    while(pb <= pb_last)         *pc++ = *pb++;}void print(ElemType &c){    printf("%d ", c);}int main(){    SqList La, Lb, Lc;    int j;    InitList(La);     for(j = 1; j <= 5; j++)    {        ListInsert(La, j, j);    }    printf("La= ");    ListTraverse(La,print);    InitList(Lb);     for(j = 1; j <= 5; j++)    {        ListInsert(Lb, j, 2*j);    }    printf("Lb= ");    ListTraverse(Lb,print);    MergeList(La, Lb, Lc);    printf("Lc= ");    ListTraverse(Lc, print);    return 0;}

运行结果


感受

  • 初学数据结构,实现算法的时候用的语言很别扭,c/c++混用
  • 一开始while写成了if, pa,pb也混用,导致编译不通过
while(pa <= pa_last)         *pc++ = *pa++;    while(pb <= pb_last)         *pc++ = *pb++;
  • 我觉得等我学习一段时间以后回来再看这个程序可能会简化它吧
0 0
原创粉丝点击