数据结构之数组
数组是一种线性结构,主要包括数组长度,首地址,当前的有效个数和自动的增加因素。
下面给出自己抄郝斌老师的一段代码,很有用。
#include<stdio.h>
#include<stdlib.h>//包含exit(-1)函数
#include<malloc.h>
#include<stdbool.h>//我的编译器的问题,不然就不可以使用bool值
//1.typedef是给struct arr起别名,方便书写2.这是一个c语言的结构体
typedef struct Arr{
//数组首地址
int*pbase;
//数组长度
int len;
//数组有效个数
int cnt;
}d;
//下面是数组要实现的功能,一起声明
//初始化
void init(struct Arr *arr,int length);
//追加元素
bool append(struct Arr* arr,int val);
//展示数组
void show(d* arr);
//删除数组
void delete_arr(d*arr,int pos);
//判断为空
bool is_empty(d* arr);
//判断为满
bool is_full(d* arr);
//得到具体值
int get(d*arr,int pos);
//插入值
bool insert(d*arr,int pos,int val);
//倒置
bool inverse(d*arr);
main(void){
//相当于struct Arr arr
d arr;
//函数的参数是指针,故实参必须取地址
init(&arr,7);//这些函数主要看后面的定义
append(&arr,1);
append(&arr,2);
append(&arr,3);
insert(&arr,1,5);
inverse(&arr);
inverse(&arr);
show(&arr);
}
//初始化数组,参数提供了数组的长度
void init(struct Arr *arr,int length){
//动态分配内存,arr->pbase的写法相当于*arr.pbase
arr->pbase = (int*)malloc(sizeof(int)*length);
if(NULL == arr->pbase){
printf("内存分配失败");
//终止程序的办法,在#include <stdlib.h>中
exit(-1);
}
//arr->len这种写法是为了调用全局变量
else{
arr->len = length;
arr->cnt = 0;
}
}
bool is_empty(d* arr){
if(arr->cnt== 0)
return true;
else
return false;
}
void show(d* arr){
if(is_empty(arr)){
printf("没有数组元素\n");
}
else{
int i = 0;
for(i;i<arr->cnt;i++){
printf("%d\t",arr->pbase[i]);
}
}
}
bool append(struct Arr* arr,int val){
if(is_full(arr)){
printf("已装满,追加失败");
return false;
}
else{
arr->pbase[arr->cnt]=val;
(arr->cnt)++;
return true;
}
}
bool is_full(d* arr){
if(arr->cnt == arr->len)
return true;
else
return false;
}
//在POS位置插入val值
bool insert(d*arr,int pos,int val){
if(is_full(arr)){
printf("数组已满");
return false;
}
if(pos<0||pos>(arr->cnt))
return false;
else
{
int i = arr->cnt;
for(i;i>=pos;i--){
arr->pbase[i] = arr->pbase[i-1];
}
arr->pbase[pos-1] = val;
return true;
}
}
int get(d*arr,int pos){
return arr->pbase[pos-1];
}
void delete_arr(d*arr,int pos){
int i= pos;
for(i;i<(arr->cnt);i++){
arr->pbase[i-1]= arr->pbase[i];
}
(arr->cnt)--;
}
//倒转数组
bool inverse(d*arr){
if(is_empty(arr))
return false;
else
{ int i=0;
int j;
for(i;i<=(arr->cnt)/2;i++){
j=arr->pbase[i];
arr->pbase[i]=arr->pbase[(arr->cnt)-1-i];
arr->pbase[(arr->cnt)-1-i]=j;
}
return true;}
}