#include <stdio.h>
#include <malloc.h>//包含malloc()
#include <stdlib.h>//包含exit()
//初始化数组
void init_arr(struct Arr *parr,int len);
//展示数组中的元素
void show_arr(struct Arr *parr);
//判断数组是否为空
int is_empty(struct Arr *parr);
//判断数组是否为满
int is_full(struct Arr *parr);
//对数组进行追加元素
int append(struct Arr *parr,int i);
//在数组中插入一个元素,pos表示在地pos个元素前插入i
int insert(struct Arr * parr ,int pos,int i);
//在数组中删除一个元素,pi将主函数中的i值改变为删除了的元素的值,pos表示删除第几个值
int del(struct Arr * parr,int pos,int *pi);
//将数组中的元素进行倒置
int reverse(struct Arr * parr);
//定义一个int类型的数组
struct Arr
{
int * pbase;//数组首元素的地址
int arr_len;//数组的长度
int arr_cnt;//数组的当前长度
};
void menu(struct Arr *parr)
{
int i;//控制菜单的变量
int j;
int tem;//存放删除的元素
while(1)
{
printf("\t\t\t1、添加元素\n\t\t\t2、删除元素\n\t\t\t3、插入元素\n\t\t\t4、显示数组中的元素\n\t\t\t5、将数组倒置\n\t\t\t6、退出\n");
scanf("%d",&i);
switch(i)
{
case 1:
printf("请输入一个整数:\n");
scanf("%d",&j);
append(parr,j);
break;
case 2:
printf("要删除第几个元素?\n");
scanf("%d",&j);
del(parr,j,&tem);
printf("删除的元素为:%d\n",tem);
break;
case 3:
printf("您要在第几个位置上插入哪个整数?\n");
scanf("%d%d",&j,&tem);
insert(parr,j,tem);
break;
case 4:
show_arr(parr);
break;
case 5:
reverse(parr);
break;
case 6:
exit(1);
break;
default:
break;
}
}
}
int main()
{
struct Arr arr;//该语句定义了一个数组,分配了内存空间,但是里边的数据都是垃圾值,所以必须进行初始化,使该数组成为一个真正的数组
int len;
printf("********************************************************************************");
printf("\t\t\t数据结构-用c语言实现顺序表\n");
printf("********************************************************************************\n");
printf("请先初始化一个数组,输入数组的长度:\n");
scanf("%d",&len);
init_arr(&arr,len);//调用初始化函数来初始化一个数组,使得该结构体的关系域中有指向内存的地址,数组的长度和当前长度分别赋值。
menu(&arr);
return 0;
}
int is_empty(struct Arr * parr)
{
if(parr->arr_cnt==0)
return 1;
else
return 0;
}
int is_full(struct Arr *parr)
{
if(parr->arr_cnt==parr->arr_len)
{
printf("数组已满!\n");
return 1;
}
else
return 0;
}
void init_arr(struct Arr *parr,int len)
{
parr->pbase=(int *)malloc(sizeof(int)*len);
if(parr->pbase==NULL)
{
printf("数组初始化不成功!\n\n");
exit(-1);
}
else
{
parr->arr_len=len;
parr->arr_cnt=0;
printf("数组初始化成功!\n\n");
}
return;
}
void show_arr(struct Arr * parr)
{
if(is_empty(parr))
{
printf("数组为空!\n");
}
else
{
int i;
printf("当前数组含有的值:\n");
for(i=0;i<parr->arr_cnt;i++)
{
printf("%d\t",parr->pbase[i]);
}
printf("\n");
}
return;
}
int append(struct Arr *parr,int i)
{
if(is_full(parr))
{
return 0;
}
else
{
parr->pbase[parr->arr_cnt]=i;//等同于*(parr->pbase+parr->arr_cnt)=i;
(parr->arr_cnt)++;
return 1;
}
}
int insert(struct Arr * parr ,int pos,int i) //pos代表插入的位置,比相应的数组的下标值大一
{
if(is_full(parr))
return 0;
//不能在第一个元素的前俩个元素的位置处插入,此时对应的数组下标为-1.也不能在最后一个元素的下一个位置处插入
else if(pos<1 || pos>parr->arr_cnt+1)
return 0;
else
{
int j;
for(j=parr->arr_cnt;j>pos-1;j--)
{
parr->pbase[j]=parr->pbase[j-1];
}
parr->pbase[pos-1]=i;
parr->arr_cnt++;
return 1;
}
}
int del(struct Arr * parr,int pos,int *pi) //pos代表删除第几个元素,对应的数组下标比其小1.
{
if(is_empty(parr))
return 0;
else if(pos<1 || pos>parr->arr_cnt)
return 0;
else
{
int i;
*pi=parr->pbase[pos-1];
for(i=pos;i<parr->arr_cnt;i++)
{
parr->pbase[i-1]=parr->pbase[i];
}
parr->arr_cnt--;
return 1;
}
}
int reverse(struct Arr * parr)
{
int i,j,k;
i=0;j=parr->arr_cnt-1;
if(is_empty(parr))
return 0;
else
{
while(i<j)
{
k=parr->pbase[i];
parr->pbase[i]=parr->pbase[j];
parr->pbase[j]=k;
i++;
j--;
}
return 1;
}
}