指针 数组 结构体 练习
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <stdbool.h> //简单数组存储 gcc下运行 //J.WANG 2013-6-8 typedef struct Arr{ int * data; //存储数组的第一个元素的地址 int len; //数组的存储长度 int index; //有效元素个数 } ARR; bool init(ARR *p,int n); //初始存储,p要初始对象的地址,n初始的长度 bool append(ARR *p,int val); //添加元素,p添加的对象,val要增加的值 void printArr(ARR *p); //打印数组 bool isFull(ARR *p); //数组是否有足够的空间 void reverse(ARR *p); //反转数组 bool delete(ARR *p,int val); //删除数组中第一个出现的指定元素 void sort(ARR *p); //排序 bool insert(ARR *p,int pos,int val); //插入数据 bool isEmpty(ARR *p); //判断数组是否为空 int main(){ ARR arr; init(&arr,12); //插入数据 append(&arr,32); append(&arr,22); append(&arr,1); append(&arr,-1); append(&arr,0); append(&arr,0); append(&arr,6); append(&arr,55); append(&arr,1011); append(&arr,23); append(&arr,88); append(&arr,22); //删除 delete(&arr,22); delete(&arr,22); delete(&arr,1); printf("-------输出数据----\n"); printArr(&arr); printf("-------反转数据----\n"); reverse(&arr); //反转 printArr(&arr); printf("-------排序后数据----\n"); sort(&arr); //排序 printArr(&arr); return 0; } //初始数组 bool init(ARR * p,int n){ if(0<n){ p->data=(int *)malloc(sizeof(int)*n); if(p->data==NULL){ printf("初始化失败.\n"); return false; }else{ p->index=0; p->len=n; return true; } } return false; } //判断数组是否已满 bool isFull(ARR *p){ if(isEmpty(p)){ printf("isFull数组为空.\n"); return false; } //有效元素个数大于等于数组长度,数组已满 if(p->len<=p->index) return true; else return false; } //增加 bool append(ARR * p,int val){ if(isFull(p)){ printf("append没有足够空间存储.%d\n",val); return false; } p->data[p->index] = val; p->index++; return true; } //打印 void printArr(ARR *p){ int i; for(i=0;i<p->len;i++){ printf("%d\n",p->data[i]); } printf("\n"); } //是否为空 bool isEmpty(ARR *p){ if(p==NULL||p->len==0) return true; else return false; } //插入数据 bool insert(ARR *p,int pos,int val){ int i; if(pos<1){ printf("insert无效的位置.\n"); return false; } if(isEmpty(p)){ return false; } if(p->len-1<p->index){ printf("insert没有足够的空间存储数据.\n"); return false; } //每个元素向后移1位 for(i=p->len-1;i>=pos;i--){ p->data[i]=p->data[i-1]; } //插入值 p->data[pos-1]=val; p->index++; return true; } //删除数组中第一个出现的指定的元素 bool delete(ARR *p,int val){ int i; if(isEmpty(p)){ printf("delete数组为空!\n"); return false; } //找到第一个出现的指定元素 for(i=0;i<p->len&&!(p->data[i]==val);i++); //标记: !的优先级比==高 //每个元素向前移动1位 for(;i<p->len-1;i++){ p->data[i]=p->data[i+1]; } p->index--; p->len--; return true; } //反转数组 void reverse(ARR *p){ if(isEmpty(p)){ printf("reverse数组为空!\n"); return; } int i=0,j=p->len-1,m=(p->len)/2,t; while(0 < m){ t=p->data[i]; p->data[i]=p->data[j]; p->data[j]=t; i++; j--; m--; } } //选择排序 void sort(ARR *p){ if(isEmpty(p)){ printf("sort数组为空!\n"); return; } int i,j,min,tmp; for(i=0;i<p->len;i++){ //遍历所有元素 min=i; for(j=i+1;j<p->len;j++){ //从所有元素里找出最小的元素下标 if(p->data[min]>p->data[j]){ min=j; } } if(min!=i){ tmp=p->data[i]; p->data[i]=p->data[min]; p->data[min]=tmp; } } }