zoukankan      html  css  js  c++  java
  • 数据结构(C语言版)顺序表相关算法代码实现

      这两天实现了一下顺序表的相关操作,包括顺序表初始化、创建、遍历、第i个元素前插入,删除第i个元素、查找元素e的位置、清空顺序表、销毁顺序表、合并两个非递减顺序表操作。

      这次在网上学习到了新的布局方法,将顺序表的存储结构定义,函数说明部分放在了头文件里,源文件中实现的是主函数和各功能函数。

      这次使用的编译环境是vc++6.0

    //头文件部分
    #define LIST_INIT_SIZE 5
    #define INCREAMENT 5
    typedef char Elemtype;
    typedef int Status;
    //线性表存储结构定义
    typedef struct {
    Elemtype *elem;
    int length;
    int listsize;
    }SqList;
    //函数说明部分
    Status InitList(SqList &L);
    Status CreateList(SqList &L,int size);
    Status TraverseList(SqList L);
    Status ListInsert(SqList &L,int i,Elemtype e);
    Status ListDelete(SqList &L,int i,Elemtype &e);
    int LocateElem(SqList L,Elemtype e,Status (*compare)(Elemtype e,Elemtype temp));
    Status ClearList(SqList &L);
    Status DestroyList(SqList &L);
    Status EqualElem(Elemtype e,Elemtype temp);
    void MergeList(SqList La,SqList Lb,SqList &Lc);
    
    
    
    //源文件部分
    #include<stdio.h>
    #include <stdlib.h>//malloc函数包含在其中
    //将自定义头文件包含进来时只能用""
    #include"ListHeader.h"
    //程序入口
    void main(){
        int size=6;
        SqList list;
        Elemtype deletes;
        InitList(list);
        CreateList(list,size);
    //    TraverseList(list);
    //    ListInsert(list,5,'o');
    //    TraverseList(list);
    //    ListDelete(list,5,deletes);
    //    TraverseList(list);
    //    printf("找到符合compare关系的元素位序是:%d\n",LocateElem(list,'b',EqualElem));
    //    ClearList(list);
    //    TraverseList(list);
    //    DestroyList(list);
    //    TraverseList(list);
        SqList list2;
        InitList(list2);
        CreateList(list2,5);
        SqList list3;
        InitList(list3);
        MergeList(list,list2,list3);
        TraverseList(list3);
        getchar();
    }
    //初始化一个顺序表
    Status InitList(SqList &L){
           //分配内存
        L.elem = (Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype));
        if(!L.elem){
            return false;
        }
        L.length=0;
        L.listsize=LIST_INIT_SIZE;
        return true;
    }
    //创建顺序表(判断是否需要重新分配内存,将元素读入)
    Status CreateList(SqList &L,int size){
        if(size>L.listsize){
            Elemtype *newbase;
            newbase=(Elemtype *)realloc(L.elem ,(L.listsize+INCREAMENT)*sizeof(Elemtype));
            if(!newbase){
                return false;
            }
            L.elem=newbase;
            L.listsize+=INCREAMENT;
            }
        printf("输入创建顺序表内容:\n");
        for(int i=0;i<size;i++){
            scanf("%c",L.elem+i);
            getchar();//输入了6个元素,只输入三次就自动结束,因为vc6.0将回车也算进字符里,这里用getchar()接收
        }
        L.length=size;
        return true;
    }
    //顺序表的遍历,用指针来操作
    Status TraverseList(SqList L){
        if(L.length==0){
            printf("空表!");
            return false;
        }
        printf("遍历结果:\n");
        for(int i=0;i<L.length;i++){
            printf("%c",*(L.elem++));
            printf("\n");
        }
        return true;
    }
    //顺序表中第i个元素之前插入元素,下标是i-1
    Status ListInsert(SqList &L,int i,Elemtype e){
        //非法判断
        if(i<0||i>L.length){
            return false;
        }
        if(L.length>=L.listsize){
            Elemtype *newbase;//这里为了更好的判断出空间分配结果,新建一个变量newbase
            newbase=(Elemtype *)realloc(L.elem,(L.listsize+INCREAMENT)*sizeof(Elemtype));
            if(!newbase){
                return false;
            }
            L.listsize+=INCREAMENT;
            }
        Elemtype *itemp,*ttemp;
        itemp=&(L.elem[i-1]);
        ttemp=&(L.elem[L.length-1]);
        for(ttemp;ttemp>=itemp;ttemp--){
            *(ttemp+1)=*ttemp;
            }
        *itemp=e;              //这里的itemp始终指向第i个元素的位置,所以用他赋值较好
        L.length+=1;
        return true;
    }
    //删除顺序表中第i个元素
    Status ListDelete(SqList &L,int i,Elemtype &e){
        if(i<0||i>L.length){
            return false;
        }
        Elemtype *itemp=&(L.elem[i-1]);
        e=*itemp;
        Elemtype *ttemp=&(L.elem[L.length-1]);
        for(itemp;itemp<ttemp;itemp++){
            *itemp=*(itemp+1);
        }
        L.length--;
        return true;
    }
    //返回顺序表中第一个与e满足compare()关系的元素位序,不存在返回0
    int LocateElem(SqList L,Elemtype e,Status (*compare)(Elemtype e,Elemtype temp)){
        int i=1;
        Elemtype *temp=L.elem;
        while(!(*compare)(e,*temp)&&i<=L.length){
            temp++;
            i++;
        }
        if(i>L.length){
            i=0;
        }
        return i;
    }
    //清空顺序表,只让length=0
    Status ClearList(SqList &L){
        L.length=0;
        return true;
    }
    //销毁顺序表,释放elem指针
    Status DestroyList(SqList &L){
        if(L.elem){
            free(L.elem);
        }
        L.length=0;
        return true;
    }
    //两个元素是否相等
    Status EqualElem(Elemtype e,Elemtype temp){
        if(e==temp){
            return true;
        }
        return false;
    }
    //将两个值不递减的顺序表合并到一个新的顺序表中
    void MergeList(SqList La,SqList Lb,SqList &Lc){
        Lc.listsize=La.length+Lb.length;
        Lc.length=Lc.listsize;
        Lc.elem=(Elemtype *)malloc(Lc.listsize*sizeof(Elemtype));
        Elemtype *pa,*pb,*pa_last,*pb_last,*pc;
        pa=&La.elem[0];
        pb=&Lb.elem[0];
        pa_last=&(La.elem[La.length-1]);
        pb_last=&(Lb.elem[Lb.length-1]);
        pc=&Lc.elem[0];
        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++;
        }
    }
  • 相关阅读:
    flume配置和说明(转)
    ganlia安装配置文档
    (转)传统MySQL+ Memcached架构遇到的问题
    (转)QRCODE二维码介绍及常用控件推荐
    (转) VS2012程序打包部署详解
    (转)安装程序发布利器——InstallShield 2011 Limited Edition
    (转)linux下mysql的安装过程
    (转)反向代理服务器的工作原理
    (转)工业4.0消灭淘宝只需十年
    (转)TCP注册端口号大全
  • 原文地址:https://www.cnblogs.com/jiangcsu/p/5399770.html
Copyright © 2011-2022 走看看