以前就看过数据结构,但是也只是停留在理论水平,知道大概怎么做的,自己实现还真是没有做过,用单链表做一个类似于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;
}