美文网首页
数组实现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