• c语言中线性表基本操作方法


    /*线性表的操作*/
    #include<stdio.h>
    #include<stdlib.h>
    typedef int ElemType;
    struct List
    {
        ElemType *list;
        int size;
        int MaxSize;
    };

    /*初始化列表,即动态存储空间分配并置L为一个空列表*/
    void initList(struct List *L,int ms)
    {
        if(ms<=0)
        {
            printf("MaxSize 非法!");
            exit(1);
        }
        L->MaxSize = ms;
        L->size = 0;
        L->list=malloc(ms * sizeof(ElemType));
        if(!L->list)
        {
            printf("空间分配失败!");
            exit(1);        
        }
        /*printf("%d\n",sizeof(ElemType));*//*暂用字节数*/
        return ;
    }
    void againMalloc(struct List *L)
    {
        ElemType *p = realloc(L->list,2*L->MaxSize*sizeof(ElemType));
        if(!p)
        {
            printf("存储空间分配失败!");
            exit(1);
        }
        L->list = p; /*使list指向新线性表空间*/
        L->MaxSize=2 * L->MaxSize; /*把线性空间大小修改为新的长度*/
    }
    /*向线性表L的表尾插入元素*/
    void insertLastList(struct List *L,ElemType x)
    {
        if(L->size==L->MaxSize){
           /*重新分配更大空间*/
             /*againMalloc(L);*/
            printf("max\n");
        }
        L->list[L->size]= x ;
        L->size++;
        printf("x=%d\n" ,x);
        return ;
    }

    /*插入内容*/
    int insertPostList(struct List *L,int pos,ElemType x)
    {
        int i;
        if(pos<1 || pos> L->size+1)
        {
           /*     若Pos越界则插入失败  */
            return 0 ;
        }
        if(L->size==L->MaxSize){
            /*重新分配更大的存储空间*/
            againMalloc(L);    
        }
        L->list[pos-1] = x;
        L->size++;
     /*     printf("%d\n", L->list[pos-1] );  */
        return 1 ;
    }
    /* 按下标获得元素值  */
    ElemType GetElem(struct List *L ,int pos)
    {
        if(pos<1 || pos>L->size)
        {
            printf("元素序号越界!");
            exit(1);
        }
        return L->list[pos-1]; /* 返回线性表中序号为Pos值的元素  */
    }

    /* 顺序扫描(即遍历)输出线性表L中的每个元素  */
    void traverseList(struct List *L)
    {
        int i ;
        for(i = 0; i<L->size;i++)
        {
            printf("%d ",L->list[i]);
        }
        printf("\n");
        return ;
    }

    /*值与X相等的元素,若查找成功则返回其位置,否则返回-1*/
    int findList(struct List *L,ElemType x)
    {
        int i;
        for(i = 0;i<L->size;i++){
            if(L->list[i]==x){
               return i ;
            }
        }
        return -1 ;
    }
    /* 把线性表L中第pos个元素的值修改为X的值,若修改成功批回1,否则返回0  */
    int updatePostList(struct List *L,int pos,ElemType x)
    {
        if(pos<1 || pos>L->size){
            return  0 ;    
        }
        L->list[pos-1]= x;
        return 1 ;
    }
    /*  从线性表中L删除表头元素并返回它,若删除失败则停止程序运行 */
    ElemType deleteFirstList(struct List *L)
    {
        ElemType temp;
         int i ;
        if(L->size == 0){
            printf("线性表为空,不能进行删除操作!");
            exit(1);
        }
        temp = L->list[0];
        for(i = 0 ;i<L->size;i++)
            L->list[i-1] = L->list[i];    
        L->size--;
        return temp;    
    }
    /* 线性表L中删除第pos个元素并返回它,若删除失败则停止程序运行  */
    ElemType deleteLastList(struct List  *L)
    {
        if(L->size==0){
            printf("线性表为空,不能进行删除操作!");
            exit(1);
        }
        L->size--;
    /*     返回原来表尾的值  */
        return L->list[L->size];
    }
    /* 从线性表L中删除第pos个元素并返回它,若删除失则停止程序运行  */
    ElemType deletePostList(struct List *L ,int pos)
    {
        ElemType temp;
        int i;
        if(pos < 1 || pos > L->size){        /* pos越界则删除失败 */
            printf("pos值越界,不能进行删除操作! ");
            exit(1);
        }
        temp = L->list[pos-1];
        for(i = pos; i < L->size; i++)
            L->list[i-1] = L->list[i];
            L->size--;
        return temp;
    }
    /* 返回线性表L当前的长度,若L 为空则返回0  */
    int sizeList(struct List *L)
    {
        return L->size ;
    }
    /* 是不是一个空列表  */
    int EmptyList(struct List *L)
    {
        if(L->size==0){
             return 1;
        }
        else{
            return 0 ;
        }
    }

    /* 清除线性表L中的所有元素,释放存储空间,使之成为一个空表  */
    void clearList(struct List *L)
    {
        if(L->list!=NULL){
            free(L->list);
            L->list=0;
            L->size = L->MaxSize  = 0 ;
            
        }
        return ;
    }

    main()
    {
        int a[10]={2,4,6,8,10,12,14,16,18,20};
        struct List L;
        int i ;
        initList(&L,5);
        for(i = 0 ;i<10;i++)
        {
             insertLastList(&L,a[i]);
        }
        /* 在当前下标下存入该值  */
        insertPostList(&L,11,48);
        /* 在当前下标下输入该值  */
        insertPostList(&L,3,25);
        /* 按下标获得当前下标的值  */
         printf("GetElem=%d\n",GetElem(&L,11));
        /* 输出当前列表中的所有数据  */
        traverseList(&L);
        /* 查询与 当前指标的值 */
        printf("%d\n",findList(&L,8));
        /* 在当前指标下修改值  */
        updatePostList(&L, 3, 20);
        /* 批指标来获得值  */
        printf("%d\n",GetElem(&L,3));
        /*  从线性表L中删除头元素并返回它,若删除失败则停止程序运行 */
    /*     deleteFirstList(&L);  */
        /* 再删除表头 */
    /*     deleteFirstList(&L);  */
    /*     traverseList(&L);  */
        /* 删除最后表头的值  */
    /*      deleteLastList(&L);  */
    /*     deleteLastList(&L);  */
        /* 指定删除下标进行删除  */
        printf("%d\n",deletePostList(&L,5));
        
        printf("%d\n ", sizeList(&L));
        printf("%d\n", EmptyList(&L));
        
        traverseList(&L);
    /* 清除线性列表  */
        clearList(&L);
    /* 清除了没有值了  */
        traverseList(&L);
    }
  • 相关阅读:
    485通讯和电力线载波通讯[收集转载]
    鹿城通综合业务系统常见问题
    485总表专题
    试试Live Writer的代码插件
    WPF路径动画——XAML篇
    无功电量的抄收
    一个JQuery操作Table的好方法
    季节计算脚本
    【学艺不精系列】关于Json.NET的反序列化
    NT6.x以上系统,多版本SQL Server局域网配置
  • 原文地址:https://www.cnblogs.com/long88/p/1644529.html
Copyright © 2020-2023  润新知