美文网首页
数组实现ArrayList,长度固定,链表实现,不固定长度,实现

数组实现ArrayList,长度固定,链表实现,不固定长度,实现

作者: 小李同学今天博学了吗 | 来源:发表于2020-02-16 12:53 被阅读0次
    # include<stdio.h>
    # include<stdlib.h> //包含了exit函数
    # include<malloc.h> //包含了 malloc函数,主要是申请动态内存
    
    //定义一个结构体,包含三个成员变量
    struct Arr{
    
        int *pBase;//存储数组第一个元素的地址
        int len;//数组的长度
        int cnt;//当前数组的有效元素个数,相当于数组的下标
    };
    
    void init_arr(struct Arr *pArr,int length);//数组的初始化方法
    bool append_arr(struct Arr *pArr,int val);//向数组中增加元素
    bool insert_arr(struct Arr *pArr,int pos,int val);//向数组中插入元素
    bool delete_arr(struct Arr *pArr,int pos,int *pVal);//向数组中删除
    int get();//得到数据
    bool is_empty(struct Arr *pArr);
    bool is_full(struct Arr *pArr);
    void sort_arr(struct Arr *pArr);
    void show_arr(struct Arr *pArr);
    void inversion_arr(struct Arr *pArr);
    
    
    int main(void){
        //删除的值
        int val;
    
        struct Arr arr;
        //初始化数组
        init_arr(&arr,6);
        
        show_arr(&arr);
        //向数组中追加元素
        append_arr(&arr,1);
        append_arr(&arr,2);
        append_arr(&arr,3);
        append_arr(&arr,4);
        append_arr(&arr,5);
        //插入数据
        insert_arr(&arr,2,99);
    
        show_arr(&arr);
        delete_arr(&arr,6,&val);
        printf("删除的值是%d\n",val);
        show_arr(&arr);
    
        sort_arr(&arr);
        printf("排序后\n");
        show_arr(&arr);
    
        inversion_arr(&arr);
        return 0;
    }
    
    void init_arr(struct Arr *pArr,int length){
        //申请内存
        pArr->pBase = (int *)malloc(sizeof(int)*length);
        if(NULL == pArr->pBase){
            printf("初始化失败,内存不足\n");
            exit(-1);
        }else{
        
            pArr->len = length;
            pArr->cnt = 0;
        }
        return;
    }
    
    bool is_empty(struct Arr *pArr){
        //主要通过里面的元素来判断
        if(pArr->cnt == 0){
            return true;
        }else{
            return false;
        }
    }
    
    void show_arr(struct Arr *pArr){
    //  printf("len = %d cnt = %d",pArr->len,pArr->cnt);
        if(is_empty(pArr)){
            printf("当前的数组为空\n");
        }else{
            for(int i = 0;i < pArr->cnt;i++){
                printf("%d\n",pArr->pBase[i]);
            }
        }
    
        return;
    }
    
    bool is_full(struct Arr *pArr){
    
        if(pArr->cnt == pArr->len){
            return true;
        }else{
            return false;
        }
    }
    
    bool append_arr(struct Arr *pArr,int val){
        //如果数组已经满了,则返回false
        if(is_full(pArr)){
            return false;
        }else{
            //如果不满就填充数据
            pArr->pBase[pArr->cnt] = val;
            pArr->cnt++;
    
            return true;
        }
    }
    
    bool insert_arr(struct Arr *pArr,int pos,int val){
        
        if(is_full(pArr)){
            return false;
        }
        //如果输入的下标小于当前有效个数两个的话返回false
        // 当插入到当前有效数字的后面时,相当于追加
        if(pos < 1 || pos > pArr->cnt + 1){
            return false;
        }
        /**
            i 等于有效个数,当插入的位置小于有效个数时,将数据往后互换
            如果当插入位置在有效位置之后,就不执行for循环
        */
        for(int i = pArr->cnt; i >= pos;i--){
            pArr->pBase[i] = pArr->pBase[i-1];
        }
        pArr->pBase[pos - 1] = val;
        pArr->cnt++;
    
        return true;
    }
    
    bool delete_arr(struct Arr *pArr,int pos,int* pVal){
        if(is_empty(pArr)){
            return false;
        }
    
        if(pos < 1 || pos > pArr->cnt){
            return false;
        }
        //先将要删除的值赋值给val ,在cnt之前删除,就需要将删除的位置赋值为后一位,
        //后一位的值为再后一位的值
    
        *pVal = pArr->pBase[pos-1];
        for(int i = pos; i < pArr->cnt;i++){
            pArr->pBase[i - 1] = pArr->pBase[i];
        }
        pArr->cnt--;
    
        return true;;
    }
    
    void inversion_arr(struct Arr *pArr){
        int i = 0;
        int j = pArr->cnt-1;
        int t;
        while(i < j){
            t = pArr->pBase[i];
            pArr->pBase[i] = pArr->pBase[j];
            pArr->pBase[j] = t;
    
            i++;
            j++;
        }
    
        return;
    
    }
    //排序
    void sort_arr(struct Arr *pArr){
        int i,j;
        int t;
        for(i = 0;i<pArr->cnt - 1;i++){
            for(j = i+1;j <pArr->cnt;j++){
                if(pArr->pBase[i] < pArr->pBase[j]){
                    t = pArr->pBase[i];
                    pArr->pBase[i] = pArr->pBase[j];
                    pArr->pBase[j] = t;
                }
            }
        }
    
        return;
    }
    
    
    
    

    链表实现 list

    # include<stdio.h>
    # include<malloc.h>
    # include<stdlib.h>
    
    typedef struct Node{
    
        int data;//数据域 存放数据
        struct Node * pNext;//指针域 存放地址
    }NODE,*PNODE;
    
    
    PNODE createList(void);
    void traversion(PNODE);
    bool is_empty(PNODE);
    int length_list(PNODE);
    void sort_list(PNODE);
    bool insert_list(PNODE,int,int);
    bool delete_list(PNODE,int,int *);
    
    int main(void){
        int val;
        PNODE pNode = NULL;
        pNode = createList();
        traversion(pNode);
    
        int length;
        length = length_list(pNode);
        printf("数组的长度为%d \n",length);
        sort_list(pNode);
        printf("排序后\n");
        traversion(pNode);
    
        insert_list(pNode,1,34);
        printf("插入后输出数据\n");
        traversion(pNode);
        delete_list(pNode,3,&val);
    
        printf("删除后输出数据\n");
        printf("删除的值为%d\n",val);
        traversion(pNode);
    
        return 0;
    
    
    }
    
    PNODE createList(void){
    
        int len;//存放有效数据的个数
        int i;
        int val;// 存放用户临时输入的数据
    
    
       
        PNODE pHead  = (PNODE)malloc(sizeof(NODE));
        if(pHead == NULL){
            printf("分配头结点失败\n");
            exit(-1);
        
        }
    
       
        PNODE pTail; // 作用相当于游标
        pTail = pHead;
        pTail->pNext = NULL;
        
        printf("请输入要存放数据的个数 len =");
        scanf("%d",&len);
    
        for(i=0;i<len;i++){
          printf("请输入第%d个的值:",i+1);
          scanf("%d",&val);
            
          PNODE pNew = (PNODE)malloc(sizeof(NODE));
          if(pNew == NULL){
            printf("分配失败\n");
            exit(-1);
          
          }
          
          pNew->data = val;
    
          pTail->pNext = pNew;
          pNew->pNext = NULL;
          pTail = pNew;
          
        }
    
        return pHead;
    }
    
    void traversion(PNODE pHead){
       PNODE p = pHead->pNext;
       while(p != NULL){
       
          printf("%d  ",p->data);
          p = p->pNext;
       }
    
       printf("\n");
    }
    
    
    bool is_empty(PNODE pHead){
    
        if(pHead->pNext == NULL)
            return true;
        else
            return false;
    
    }
    
    int length_list(PNODE pHead){
    
        PNODE p;
        p = pHead->pNext;
        int cnt = 0;
    
        while(NULL != p){
           cnt++;
           p = p->pNext;
        }
    
        return cnt;
    
    
    
    }
    
    void sort_list(PNODE pHead){
    
        int i,j,t;
        int len = length_list(pHead);
    
        PNODE p,q;
        
        for(i=0,p = pHead->pNext;i<len-1;i++,p=p->pNext)
            for(j=i+1,q=p->pNext;j<len;j++,q = q->pNext){
                if(p->data > q->data){
                    t = p->data;
                    p->data = q->data;
                    q->data = t;
                }
            }
    
            return;
    }
    
    bool insert_list(PNODE pHead,int pos,int val){
        int i= 0;
        PNODE p = pHead;
    
        /**
            while 和if 是重点
    
            理解:
    
                当pos = -1时
                                    while 0 < -1-1 = false 不执行
                    if 0 > -2 = true, return false
                当pos = 0 时
                                    while 0 < -1 = false,不执行
                    if 0 > -1 = true,return false;
                当pos = 1时
                                   while        0 < 1-1 = false,不执行
                    if      0 > 0 不成立,继续向下执行,
    
                    p-pNext本来指向首节点
    
                当pos = 3 时 
                    第一次:0 < 3 -1 = true
                             p = 首节点,i = 1,
                    第二次: 1 < 3-1 = true
                             p = 第二个节点 , i = 2,
                                    第三次: 2 < 3-1 = false
    
                    if 2 > 2 不执行
    
                    p-pNext 本来指向第三个节点             
                    
        */
        while(NULL != p && i < pos -1){
            p = p->pNext;
            i++;
        }
    
        if(i > pos -1 || NULL == p)
            return false;
    
        PNODE pNew = (PNODE)malloc(sizeof(NODE));
        pNew->data = val;
    
        //三行代码实现插入
        //PNODE q = p->pNext;
    //  p->pNext = pNew;
    //  pNew->pNext = q;
    
        //两行代码实现插入
        pNew->pNext = p->pNext;
        p->pNext = pNew;
        
        return true;
    
    }
    
    bool delete_list(PNODE pHead,int pos,int * pVal){
    
        int i = 0;
        PNODE p = pHead;
    
        while(NULL != p->pNext && i < pos-1){
             p = p->pNext;
             i++;
        }
    
        if(i > pos-1 || p->pNext == NULL)
            return false;
    
        PNODE q = p->pNext;
        *pVal = q->data;
        
        p->pNext  = p->pNext->pNext;
        free(q);
        q = NULL;
    
        return true;
    
    
    
        
    
    }
    

    相关文章

      网友评论

          本文标题:数组实现ArrayList,长度固定,链表实现,不固定长度,实现

          本文链接:https://www.haomeiwen.com/subject/ftgmxhtx.html