用C语言单链表实现NSMutableArray的生成和增删改查

  以前就看过数据结构,但是也只是停留在理论水平,知道大概怎么做的,自己实现还真是没有做过,用单链表做一个类似于NSMutableArray的类,基本的增删改查都有。

#include <stdio.h>
#include <stdlib.h>

//定义数组的数据结构
typedef struct Node  {

    int data; // 对oc来说换成 void * 更好
    struct Node * next; // 下一个结点

}Node;

 Node * list ;

// 生成一个可变的数组,对应于alloc init。
void initList() {

    list = malloc(sizeof(Node));
    list->data = 0;
    list->next = NULL;

}
//列表中元素的个数,偷懒了,数组的第一个元素不存数据,存的是数组中元素的个数
int count(){

    return list->data;
}
void getItemAt(int i) {

    if(list->data==0){
        printf("数组为空,查找失败!!!\n");
        return;
    }
    if(i>list->data){
        printf("查找位置%d超出数组长度,失败!!!\n",i);
        return;
    }
    if(i<0){
        printf("查找位置%d不能为负数,失败!!!\n",i);
        return;
    }

    int j = 0;
    Node * p = list->next;
    while(j<i){
        p = p->next;
        j++;
    }
    printf("第%d个位置  %d \n",i,p->data);
}

void changeDataAt(int i,int newData) {
    if(list->data==0){
        printf("数组为空,修改失败!!!\n");
        return;
    }
    if(i>list->data){
        printf("修改位置%d超出数组长度,失败!!!\n",i);
        return;
    }
    if(i<0){
        printf("修改位置%d不能为负数,失败!!!\n",i);
        return;
    }

    int j = 0;
    Node * p = list->next;
    while(j<i){
        p = p->next;
        j++;
    }
    printf("原来第%d个位置  %d \n",i,p->data);
    p->data = newData;
   printf("现在第%d个位置  %d \n",i,p->data);
}


// 插入一个数据
void insertAt(int i,int data) {

    if(i>list->data){
        printf("插入位置%d超出数组长度,失败!!!\n",i);
        return;
    }
    if(i<0){
        printf("插入位置%d不能为负数,失败!!!\n",i);
        return;
    }


    int j=0;
    Node * p = list->next;
    while(j<i-1){
        p = p->next;
        j++;
    }
    if(i==0){
        p = list;
    }

    Node * s = malloc(sizeof(Node));
    s->data = data;

    s->next = p->next;
    p->next = s;

    list->data++;
}
void addData(int data){
    insertAt(list->data,data);
}
// 删除指定元素
void removeAt( int i) {

    if(list->data==0){
        printf("数组为空,删除失败!!!\n");
        return;
    }

    if(i>list->data){
        printf("删除位置%d超出数组长度,失败!!!\n",i);
        return;
    }
    if(i<0){
        printf("删除位置%d不能为负数,失败!!!\n",i);
        return;
    }
    int j=0;
    Node * p = list->next;
    while(j<i-1){
        p = p->next;
        j++;
    }
    if(i==0){
        p = list;
    }

    Node * s = p->next ;

    p->next = s->next ;
    printf("即将删除位置为 %d 数据 %d\n",i,s->data);
    free(s);
    list->data -- ;


}

void clearList(){

    while(list->data>0){
        removeAt(0);
    }
}
void removeLastNode(){
    removeAt(list->data-1);
}

void printList(){

    int i=0;
    Node * p = list->next;
    printf("总共有%d个数据\n",list->data);
    while(p != NULL) {
        printf("第%d个  数据为%d  \n",i++,p->data);
        p=p->next;
    }

}




int main()
{

    initList();
    getItemAt(0);
    changeDataAt(0,1000);
    removeAt(0);
    addData(333);
    addData(222);
    addData(45);
    addData(6666);

    insertAt(1,1);
    insertAt(2,2);
    insertAt(0,3);



    getItemAt(0);

    changeDataAt(0,1000);


    printList();
    removeAt(3);

    removeLastNode();
    printList();
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值