您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > c语言数组的动态分配
下面代码添加到头文件里面#includestdio.h#includestdlib.hstructdata{int*p;//指针保存数组起始点intlength;//保存数组长度intreallength;//实际分配内存长度intstate;//0代表无序,1代表有序从小到大,2代表有序从大到小};structfind{int**pp;intn;};voidinit(structdata*pdata);//初始化voidreinit(structdata*pdata);//重新初始化voidaddobject(structdata*pdata,intnum);//增加一个元素voidaddobjects(structdata*pdata,int*pnum,intn);//增加一个数组voidprintf1(structdata*pdata);//打印一个出来voidsort(structdata*pdata,intobj);//实现排序obj=0从小到大,否则从大到小int*finddata(structdata*pdata,intnum);//找到并返回第一次找到的地址voidchange(structdata*pdata,intoldnum,intnewnum);//修改一个数据voidinsert(structdata*pdata,intnum,intinsertnum,intheadback);//插入一个数据,0代表前插,1代表后插voiddeleteone(structdata*pdata,intnum);//删除第一个找到的数据voiddeleteall(structdata*pdata,intnum);//删除找到的全部数据structfindfindalldata(structdata*pdata,intnum);//返回一片内存,包含所有找到的元素添加到源文件中#includestdio.h#includestdlib.h#include动态数组.hvoidinit(structdata*pdata){pdata-p=NULL;pdata-length=0;pdata-reallength=0;pdata-state=0;}voidreinit(structdata*pdata){if(pdata-p==NULL){return;}else{free(pdata-p);pdata-p=NULL;pdata-length=0;pdata-reallength=0;pdata-state=0;}}voidaddobject(structdata*pdata,intnum){if(pdata-p==NULL){pdata-p=(int*)malloc(sizeof(int));*(pdata-p)=num;pdata-length++;pdata-reallength++;}else{if(pdata-length==pdata-reallength){(pdata-length)++;(pdata-reallength)++;pdata-p=(int*)realloc(pdata-p,(pdata-length)*sizeof(int));pdata-p[pdata-length-1]=num;}else{(pdata-length)++;pdata-p[pdata-length-1]=num;}}}voidaddobjects(structdata*pdata,int*pnum,intn){if(pdata-p==NULL){pdata-p=(int*)malloc(sizeof(int)*n);for(inti=pdata-length;ipdata-length+n;i++){pdata-p[i]=pnum[i];}pdata-length+=n;pdata-reallength+=n;}else{if(pdata-length+n=pdata-reallength){for(inti=pdata-length;ipdata-length+n;i++){pdata-p[i]=pnum[i-pdata-length];}(pdata-length)+=n;}else{pdata-p=(int*)realloc(pdata-p,(pdata-length+n)*sizeof(int));for(inti=pdata-length;ipdata-length+n;i++){pdata-p[i]=pnum[i-pdata-length];}(pdata-length)+=n;(pdata-reallength)+=n;}}}voidprintf1(structdata*pdata){if(pdata-p==NULL){printf(打印失败\n);}else{for(inti=0;ipdata-length;i++){printf(%d\n,pdata-p[i]);}printf(动态数组长度为%d\n,pdata-length);}}voidsort(structdata*pdata,intobj){if(obj==0)//从小到大{for(inti=0;ipdata-length-1;i++){for(intj=0;jpdata-length-1-i;j++){if(pdata-p[j]pdata-p[j+1]){pdata-p[j]=pdata-p[j]^pdata-p[j+1];pdata-p[j+1]=pdata-p[j]^pdata-p[j+1];pdata-p[j]=pdata-p[j]^pdata-p[j+1];}}}pdata-state=1;}else//从小到大{for(inti=0;ipdata-length-1;i++){for(intj=0;jpdata-length-1-i;j++){if(pdata-p[j]pdata-p[j+1]){pdata-p[j]=pdata-p[j]^pdata-p[j+1];pdata-p[j+1]=pdata-p[j]^pdata-p[j+1];pdata-p[j]=pdata-p[j]^pdata-p[j+1];}}}pdata-state=2;}}int*finddata(structdata*pdata,intnum){if(pdata-state==0){for(inti=0;ipdata-length;i++){if(pdata-p[i]==num){return&pdata-p[i];break;}}//printf(此数据不存在\n);returnNULL;}elseif(pdata-state==1){intlow=0;inthigh=pdata-length-1;intmid=(low+high)/2;while(low=high){if(pdata-p[mid]==num){return&pdata-p[mid];}elseif(pdata-p[mid]num){high=mid-1;mid=(low+high)/2;}else{low=mid+1;mid=(low+high)/2;}}//printf(此数据不存在\n);returnNULL;}else{intlow=0;inthigh=pdata-length-1;intmid=(low+high)/2;while(low=high){if(pdata-p[mid]==num){return&pdata-p[mid];}elseif(pdata-p[mid]num){low=mid+1;mid=(low+high)/2;}else{high=mid-1;mid=(low+high)/2;}}//printf(此数据不存在\n);returnNULL;}}voidchange(structdata*pdata,intoldnum,intnewnum){int*p=finddata(pdata,oldnum);if(p==NULL){printf(查找失败,没有修改的这个数);return;}else{*p=newnum;}}voidinsert(structdata*pdata,intnum,intinsertnum,intheadback){int*curposition=finddata(pdata,num);if(curposition==NULL){printf(查找失败,没有像插入的这个数);return;}else{if(headback==0){if(pdata-length==pdata-reallength){intcur=curposition-pdata-p;pdata-p=(int*)realloc(pdata-p,(pdata-length+1)*sizeof(int));for(inti=pdata-length-1;i=cur;i--){pdata-p[i+1]=pdata-p[i];}pdata-p[cur]=insertnum;pdata-length++;pdata-reallength++;}else{intcur=curposition-pdata-p;for(inti=pdata-length-1;i=cur;i--){pdata-p[i+1]=pdata-p[i];}pdata-p[cur]=insertnum;pdata-length++;}}else//后面插入{if(pdata-length==pdata-reallength){intcur=curposition-pdata-p;pdata-p=(int*)realloc(pdata-p,(pdata-length+1)*sizeof(int));for(inti=pdata-length-1;icur;i--){pdata-p[i+1]=pdata-p[i];}pdata-p[cur+1]=insertnum;pdata-length++;pdata-reallength++;}else{intcur=curposition-pdata-p;for(inti=pdata-length-1;icur;i--){pdata-p[i+1]=pdata-p[i];}pdata-p[cur+1]=insertnum;pdata-length++;}}}}voiddeleteone(structdata*pdata,intnum){if(pdata-p==NULL){printf(删除失败\n);return;}else{int*curposition=finddata(pdata,num);intcur=curposition-pdata-p;for(inti=cur;ipdata-length-1;i++){pdata-p[i]=pdata-p[i+1];}pdata-length-=1;}}voiddeleteall(structdata*pdata,intnum){if(pdata-p==NULL){printf(删除失败\n);return;}else{while(finddata(pdata,num)){deleteone(pdata,num);}}}int*find(int*p,intnum,intn){for(inti=0;in;i++){if(p[i]==num){returnp+i;break;}}returnNULL;}structfindfindalldata(structdata*pdata,intnum){s
本文标题:c语言数组的动态分配
链接地址:https://www.777doc.com/doc-2908934 .html