• 线性表的实现


    线性表的实现

    最近一直在看数据结构方面的书,最先遇到的就是线性表,于是乎照猫画虎的写了一下线性表的代码.可能很多地方还有可以改进的地方,希望各位能在下面留言,非常期待各位高手宝贵的意见.

    个人觉得比较难的几个地方是:
    1.指针的使用.你会突然发现C学的简单的指针不够用了,需要学更多的关于指针的东西;
    2.关于数组角标的计算.这种东西拿特殊情况带一下就能算出来啦.
    下面还是PO出我的代码,供大家交流学习

    /*
        Title: Array function practice(1)
        Date:2016-9-29
        Author: pengwill
    */
    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    // 定义一种结构叫做Arr
    struct Arr{
        int *pBase;//线性表的首地址
        int cnt;//当前线性表的个数
        int len;//线性表最多能容纳的元素个数
    };
    int comp(void const *a, void const *b){
        return *(int*) a -  *(int*) b;
    } 
    
    void init_Arr(struct Arr * pArr, int length);//线性表的初始化
    bool show_Arr(struct Arr * pArr); //打印线性表中的元素
    bool is_empty(struct Arr * pArr); //判断线性表是否为空
    bool scan_Arr(struct Arr * pArr, int n); //输入线性表的数据
    bool del_elem(struct Arr * pArr,int n); // 删除线性表中某个元素 
    bool append_elem(struct Arr * pArr, int n);//在线性表最后追加一个元素 
    bool sort_Arr(struct Arr * pArr);//对线性表元素进行排序; 
    bool insert_elem(struct Arr* pArr,int pos,int n);
    
    
    int main()
    {
        struct Arr arr;
        init_Arr(&arr,10);
        printf("%d %d
    ",arr.len,arr.cnt);
        {
            scan_Arr(&arr,8);
            del_elem(&arr,8);
            show_Arr(&arr);
            append_elem(&arr,-100);
            show_Arr(&arr);
            sort_Arr(&arr);
            show_Arr(&arr);
            insert_elem(&arr,5,-10010);
            show_Arr(&arr);
            sort_Arr(&arr);
            show_Arr(&arr);
    
        }
        return 0;
    }
    
    void init_Arr(struct Arr * pArr, int length)
    {
    
         pArr->pBase = (int*)malloc(sizeof(int) * length); //把操作系统请求分配的内部的首地址传给变量arr.pBase,完成初始化
         /*但是还有可能出现意外情况,即向操作系统请求分配内存失败,那么需要判断一下*/
        if(pArr->pBase == NULL){
            exit(-1);
        } else{
            pArr->cnt = 0;
            pArr->len = length;
            printf("---------Initializtion  Over---------
    ");
        }
        /*如果请求分配内存失败,那么程序终止,否则完成的数组的cnt(当前个数)和len(数组总长度)的初始化*/
    }
    
    
    bool show_Arr(struct Arr * pArr)
    {
        int i;
        if(is_empty(pArr) == true ){
            printf("---------The Array is empty!--------
    ");
        }else {
            printf("------The Array is NOT empty!-------
    ");
            printf("------Now output the elements!------
    ");
            for(i = 0;i<pArr->cnt;i++){
                printf("%d
    ",pArr->pBase[i]); // 这里卡住了,pBase没写出来 回头看一下;
                                                // 指针就是数组,数组就是指针,数组的单元就代表其地址
            }
    
        }
    
    }
    
    bool is_empty(struct Arr * pArr)
    {
        if(0 == pArr->cnt){
            return true;
        }else{
            return false;
        }
    }
    
    bool scan_Arr(struct Arr * pArr, int n)
    {
        int i;
        if(n > pArr->len){ // 判断防止数据数量超出分配的内存
            printf("-------------Error Number!-----------
    ");
            return false;
        }else{
            for(i = 0;i<n;i++){
                scanf("%d",&pArr->pBase[i]);//挨个读入数据
            }
            pArr->cnt = n;// 更新当前数据的个数
            return true;
        }
    }
    
    bool del_elem(struct Arr * pArr,int n)//删除第n个元素 
    {
        int i;
        if(n<= pArr->cnt){
            pArr->pBase[n-1] = 0;
            for(i = n-1;i<pArr->cnt;i++){
                pArr->pBase[i] = pArr->pBase[i+1];  
                show_Arr(pArr);
            } 
            (pArr->cnt)--;
            return true;
        }else{
            return false;
        }
    
    } 
    
    bool append_elem(struct Arr * pArr, int n)
    {
        if(pArr->cnt == pArr->len){
            printf("Sorry! The array is full!
    ");
            return false;
        } else{
            pArr->pBase[pArr->cnt] = n;
            pArr->cnt++;
            return true; 
        }
    
    } 
    
    
    bool sort_Arr(struct Arr * pArr)
    {
        if(pArr->cnt != 0){
            qsort(pArr->pBase,pArr->cnt,sizeof(int),comp);
            return true;
        }else{
            return false;
        }
    
    }
    
    bool insert_elem(struct Arr* pArr,int pos,int n)
    {
        int i;
        if(pos<=pArr->cnt && pArr->cnt <= pArr->len-1){
    
            for(i = pArr->cnt-1;i>=pos -1 ;i--){
                pArr->pBase[i+1] = pArr->pBase[i];
            }
            pArr->pBase[pos-1] = n;
            pArr->cnt++;
            return true;
        } else{
            return false;
        }
    
    }
  • 相关阅读:
    唐李问对 简单飞扬
    【关键字】Javascript js 身份证号码 检测 规则 18位 15位 简单飞扬
    司马法 简单飞扬
    实现身份证的15位转18位 简单飞扬
    JAVA验证身份证号码 简单飞扬
    页面验证的类型 简单飞扬
    模拟MSN和QQ的上线提示效果 区别IE和FF浏览器 简单飞扬
    孙子兵法 简单飞扬
    吴子 简单飞扬
    C# WPF MVVM 实战 2.1
  • 原文地址:https://www.cnblogs.com/pengwill/p/7367272.html
Copyright © 2020-2023  润新知