数据结构-顺序表代码实现
2017-12-14 15:20
323 查看
#include <stdio.h>
#include <stdlib.h>
struct Arr {
int * pBase;//存储的是线性表第一个元素的地址
int len;//线性表所能容纳的最大元素的个数,
int cnt;//cnt的值就是新放入元素的下标,cnt++表示当前线性表有效元素个数
};
void show_menu();
bool init_arr(struct Arr *pArry, int length);
bool insert_arr(struct Arr *pArr, int pos, int val);
bool is_empty(struct Arr * pArr);
bool is_empty(struct Arr * pArr);
void show_arr(struct Arr *pArr);
bool delete_arr(struct Arr * pArr , int pos );
int getElem(struct Arr * pArr,int pos);
int getPro(struct Arr * pArr,int pos);
int getAfter(struct Arr * pArr,int pos);
bool destory_arr (struct Arr *pArr);
int i;
int main() {
struct Arr arr;//只定义没有初始化,内部三个变量都是垃圾数字
int len ;
int pos ;
int val ;
int ds= 0;
int init = 0;
show_menu();
do {
printf("请输入操作代码:\n");
scanf("%d", &i);
switch (i) {
case 1:
printf("请输入您要初始化的数组长度:\n");
scanf("%d",&len);
if(len<1) printf("您输入数值不合法!\n");
else {
if(init_arr(&arr, len))
init = 1;
}
break;
case 2:
if(init ==1 ){
if(destory_arr (&arr))
printf("线性表已经摧毁!\n");
ds=1;
init=0;
}else printf("您还未初始化线性表!\n");
break;
case 3:
if(init ==1 ){
arr.cnt=0;
printf("线性表已经清空!\n");
}else printf("您还未初始化线性表!\n");
break;
case 4:
if(init ==1 ){
if(is_empty(&arr))
printf("线性表为空!\n");
else
printf("线性表不为空!\n");
}else printf("您还未初始化线性表!\n");
break;
case 5:
if(init ==1 ){
printf("线性表的长度是:%d\n",arr.cnt);
}else printf("您还未初始化线性表!\n");
break;
case 6:
if(init ==1 ){
printf("请输入你要输出的元素位置:\n");
scanf("%d",&pos);
}else printf("您还未初始化线性表!\n");
printf("你想获得的元素是:%d\n",getElem(& arr , pos));
break;
case 7:
if(init ==1 ){
printf("请输入一个位置我帮你求它的前驱:\n");
scanf("%d",&pos);
if(pos<=1 || pos >arr.cnt)//求前驱不能等于首位置
printf("输入数据不合法!\n");
else
printf("它的前驱是:%d\n",getPro(&arr, pos));
} else printf("您还未初始化线性表!\n");
break;
case 8:
if(init ==1 ){
printf("请输入一个位置我帮你求它的后继:\n");
scanf("%d",&pos);
if(pos<1 || pos >= arr.cnt)//求后继不能等于尾位置
printf("输入数据不合法!\n");
else
printf("它的后继是:%d\n",getAfter(&arr, pos));
}else printf("您还未初始化线性表!\n");
break;
case 9:
if(init ==1 ){
printf("请输入你要插入的位置和数值:\n");
scanf("%d %d", &pos, &val);
insert_arr(& arr, pos, val);
printf("插入之后的线性表是:\n");
show_arr(& arr);
} else printf("您还未初始化线性表!\n");
break;
case 10:
if(init ==1 ){
printf("请输入你要删除的位置:\n");
scanf("%d",&pos);
delete_arr(&arr,pos);
printf("删除之后的线性表是:\n");
show_arr(& arr);
} else printf("您还未初始化线性表!\n");
break;
case 11:
if(init ==1 ){
if(ds = 0 ) {
printf("线性表不存在!\n");
ds=0;
}
else {
printf("该线性表是:\n");
show_arr(& arr);
}
}else printf("您还未初始化线性表!\n");
break;
default :
printf("您输入的数字不合法!\n");
break;
}
}while(i>=0);
return 0;
}
void show_menu() {
printf("1----初始化一个线性表\n");
printf("2----销毁线性表\n");
printf("3----清空线性表\n");
printf("4----判断线性表是否为空\n");
printf("5----求线性表的长度\n");
printf("6----获取线性表指定位置元素\n");
printf("7----求前驱\n");
printf("8----求后继\n");
printf("9----在线性表指定位置插入元素\n");
printf("10----删除线性表指定位置元素\n");
printf("11----显示线性表\n");
printf("退出,输入一个负数!\n");
return ;
}
bool init_arr(struct Arr *pArry, int length)//结构体变量可以相互赋值
{
int n;
int val;
pArry->pBase = (int *)malloc(sizeof(int) * length);
if (NULL == pArry->pBase) {
printf("动态内存分配失败!\n");
exit(-1);//终止整个程序
}
pArry->len = length;
pArry->cnt = 0;
printf("请输入你要存储数据的数量:\n");
scanf("%d",&n);
if(n >length) {
printf("你输入的值不合法!\n");
return false ;}
printf("请输入你要存储的值:\n");
for(int i = 0;i < n;i++) {
scanf("%d",&val);
pArry->pBase[i] = val;
pArry->cnt++;
}
printf("链表已经初始化!\n");
return true;//表示函数终止
}
bool is_full(struct Arr * pArr) {
/*if(有效元素个数和线性表的长度相等)
return true;
else
return false;*/
if (pArr->cnt == pArr->len)
return true;
else
return false;
}
bool is_empty(struct Arr * pArr) {
if (0 == pArr->cnt)
return true;
else
return false;
}
void show_arr(struct Arr *pArr) {
if (is_empty(pArr)){
printf("线性表为空!\n");
}
else {
for (int i = 0; i < pArr->cnt; i++) {
printf("%-5d", pArr->pBase[i]);//整个线性表的地址在pBase里面存放的
}
}
printf("\n");
}
bool insert_arr(struct Arr *pArr, int pos, int val) {//pos 的值从1开始
int i;
pArr ->pBase = (int *)realloc(pArr->pBase,sizeof(int)*100);
pArr->len +=100;
if(NULL == pArr->pBase)
printf("插入失败!\n");
if (is_full(pArr))
return false;
if (pos<1)//因为pos是从1开始的,例如有三个元素,你可以在第4个位置插,但不能在第5个位置插,因为没有第四个元素
{
printf("您输入的数值不合法!\n");
return false;
}
for (i = pArr->cnt - 1; i >= pos -
94ee
1; --i) {
pArr->pBase[i + 1] = pArr->pBase[i]; //i赋值给i+1,先移动元素再进行插入,其实就相当于在元素的后面又赋值一个元素,然后把该元素覆盖掉;往后移动就是把小下标赋值给大下标;当前元素个数(pArr->cnt)减1就是最后一个元素的下标;因为当i的值为pos-1时,还需要移动,所以要写 ">=";
}
pArr->pBase[pos - 1] = val;
pArr->cnt++;
return true;
}
bool delete_arr(struct Arr * pArr , int pos ) {
int i;
if(is_empty(pArr))
return false;
if(pos<1 || pos>pArr->cnt)//删除的时候有三个元素删除三个,所以pos不能大于pArr->cnt,而插入是有三个元素可以在第四个前面插入
return false;
//* pVal = pArr ->pBase[pos-1];//将等待删除的元素赋值给pVal,先保存起来
for(i=pos;i<pArr->cnt;++i) {
pArr->pBase[i-1]=pArr->pBase[i];//后面的要往前面移动,所以大的下标赋值给小的下标
}
pArr->cnt--;//其实最后一个元素还存在,只不过是,长度减1了,就没办法再访问了
return true;
}
int getElem(struct Arr * pArr,int pos) {
if (pos<1 || pos > pArr->cnt)
printf("输入信息不合法!\n");
int val= pArr->pBase[pos-1];
return val;
}
int getPro(struct Arr * pArr,int pos) {
// if (pos<1 || pos > pArr->cnt+1)
// printf("输入信息不合法!\n");
int val = pArr->pBase[pos-2];
return val;
}
int getAfter(struct Arr * pArr,int pos) {
//if (pos<1 || pos > pArr->cnt)
// printf("输入信息不合法!\n");
int val = pArr->pBase[pos];
return val;
}
bool destory_arr (struct Arr * pArr) {
free(pArr->pBase);
pArr->pBase=NULL;
return true;
}
#include <stdlib.h>
struct Arr {
int * pBase;//存储的是线性表第一个元素的地址
int len;//线性表所能容纳的最大元素的个数,
int cnt;//cnt的值就是新放入元素的下标,cnt++表示当前线性表有效元素个数
};
void show_menu();
bool init_arr(struct Arr *pArry, int length);
bool insert_arr(struct Arr *pArr, int pos, int val);
bool is_empty(struct Arr * pArr);
bool is_empty(struct Arr * pArr);
void show_arr(struct Arr *pArr);
bool delete_arr(struct Arr * pArr , int pos );
int getElem(struct Arr * pArr,int pos);
int getPro(struct Arr * pArr,int pos);
int getAfter(struct Arr * pArr,int pos);
bool destory_arr (struct Arr *pArr);
int i;
int main() {
struct Arr arr;//只定义没有初始化,内部三个变量都是垃圾数字
int len ;
int pos ;
int val ;
int ds= 0;
int init = 0;
show_menu();
do {
printf("请输入操作代码:\n");
scanf("%d", &i);
switch (i) {
case 1:
printf("请输入您要初始化的数组长度:\n");
scanf("%d",&len);
if(len<1) printf("您输入数值不合法!\n");
else {
if(init_arr(&arr, len))
init = 1;
}
break;
case 2:
if(init ==1 ){
if(destory_arr (&arr))
printf("线性表已经摧毁!\n");
ds=1;
init=0;
}else printf("您还未初始化线性表!\n");
break;
case 3:
if(init ==1 ){
arr.cnt=0;
printf("线性表已经清空!\n");
}else printf("您还未初始化线性表!\n");
break;
case 4:
if(init ==1 ){
if(is_empty(&arr))
printf("线性表为空!\n");
else
printf("线性表不为空!\n");
}else printf("您还未初始化线性表!\n");
break;
case 5:
if(init ==1 ){
printf("线性表的长度是:%d\n",arr.cnt);
}else printf("您还未初始化线性表!\n");
break;
case 6:
if(init ==1 ){
printf("请输入你要输出的元素位置:\n");
scanf("%d",&pos);
}else printf("您还未初始化线性表!\n");
printf("你想获得的元素是:%d\n",getElem(& arr , pos));
break;
case 7:
if(init ==1 ){
printf("请输入一个位置我帮你求它的前驱:\n");
scanf("%d",&pos);
if(pos<=1 || pos >arr.cnt)//求前驱不能等于首位置
printf("输入数据不合法!\n");
else
printf("它的前驱是:%d\n",getPro(&arr, pos));
} else printf("您还未初始化线性表!\n");
break;
case 8:
if(init ==1 ){
printf("请输入一个位置我帮你求它的后继:\n");
scanf("%d",&pos);
if(pos<1 || pos >= arr.cnt)//求后继不能等于尾位置
printf("输入数据不合法!\n");
else
printf("它的后继是:%d\n",getAfter(&arr, pos));
}else printf("您还未初始化线性表!\n");
break;
case 9:
if(init ==1 ){
printf("请输入你要插入的位置和数值:\n");
scanf("%d %d", &pos, &val);
insert_arr(& arr, pos, val);
printf("插入之后的线性表是:\n");
show_arr(& arr);
} else printf("您还未初始化线性表!\n");
break;
case 10:
if(init ==1 ){
printf("请输入你要删除的位置:\n");
scanf("%d",&pos);
delete_arr(&arr,pos);
printf("删除之后的线性表是:\n");
show_arr(& arr);
} else printf("您还未初始化线性表!\n");
break;
case 11:
if(init ==1 ){
if(ds = 0 ) {
printf("线性表不存在!\n");
ds=0;
}
else {
printf("该线性表是:\n");
show_arr(& arr);
}
}else printf("您还未初始化线性表!\n");
break;
default :
printf("您输入的数字不合法!\n");
break;
}
}while(i>=0);
return 0;
}
void show_menu() {
printf("1----初始化一个线性表\n");
printf("2----销毁线性表\n");
printf("3----清空线性表\n");
printf("4----判断线性表是否为空\n");
printf("5----求线性表的长度\n");
printf("6----获取线性表指定位置元素\n");
printf("7----求前驱\n");
printf("8----求后继\n");
printf("9----在线性表指定位置插入元素\n");
printf("10----删除线性表指定位置元素\n");
printf("11----显示线性表\n");
printf("退出,输入一个负数!\n");
return ;
}
bool init_arr(struct Arr *pArry, int length)//结构体变量可以相互赋值
{
int n;
int val;
pArry->pBase = (int *)malloc(sizeof(int) * length);
if (NULL == pArry->pBase) {
printf("动态内存分配失败!\n");
exit(-1);//终止整个程序
}
pArry->len = length;
pArry->cnt = 0;
printf("请输入你要存储数据的数量:\n");
scanf("%d",&n);
if(n >length) {
printf("你输入的值不合法!\n");
return false ;}
printf("请输入你要存储的值:\n");
for(int i = 0;i < n;i++) {
scanf("%d",&val);
pArry->pBase[i] = val;
pArry->cnt++;
}
printf("链表已经初始化!\n");
return true;//表示函数终止
}
bool is_full(struct Arr * pArr) {
/*if(有效元素个数和线性表的长度相等)
return true;
else
return false;*/
if (pArr->cnt == pArr->len)
return true;
else
return false;
}
bool is_empty(struct Arr * pArr) {
if (0 == pArr->cnt)
return true;
else
return false;
}
void show_arr(struct Arr *pArr) {
if (is_empty(pArr)){
printf("线性表为空!\n");
}
else {
for (int i = 0; i < pArr->cnt; i++) {
printf("%-5d", pArr->pBase[i]);//整个线性表的地址在pBase里面存放的
}
}
printf("\n");
}
bool insert_arr(struct Arr *pArr, int pos, int val) {//pos 的值从1开始
int i;
pArr ->pBase = (int *)realloc(pArr->pBase,sizeof(int)*100);
pArr->len +=100;
if(NULL == pArr->pBase)
printf("插入失败!\n");
if (is_full(pArr))
return false;
if (pos<1)//因为pos是从1开始的,例如有三个元素,你可以在第4个位置插,但不能在第5个位置插,因为没有第四个元素
{
printf("您输入的数值不合法!\n");
return false;
}
for (i = pArr->cnt - 1; i >= pos -
94ee
1; --i) {
pArr->pBase[i + 1] = pArr->pBase[i]; //i赋值给i+1,先移动元素再进行插入,其实就相当于在元素的后面又赋值一个元素,然后把该元素覆盖掉;往后移动就是把小下标赋值给大下标;当前元素个数(pArr->cnt)减1就是最后一个元素的下标;因为当i的值为pos-1时,还需要移动,所以要写 ">=";
}
pArr->pBase[pos - 1] = val;
pArr->cnt++;
return true;
}
bool delete_arr(struct Arr * pArr , int pos ) {
int i;
if(is_empty(pArr))
return false;
if(pos<1 || pos>pArr->cnt)//删除的时候有三个元素删除三个,所以pos不能大于pArr->cnt,而插入是有三个元素可以在第四个前面插入
return false;
//* pVal = pArr ->pBase[pos-1];//将等待删除的元素赋值给pVal,先保存起来
for(i=pos;i<pArr->cnt;++i) {
pArr->pBase[i-1]=pArr->pBase[i];//后面的要往前面移动,所以大的下标赋值给小的下标
}
pArr->cnt--;//其实最后一个元素还存在,只不过是,长度减1了,就没办法再访问了
return true;
}
int getElem(struct Arr * pArr,int pos) {
if (pos<1 || pos > pArr->cnt)
printf("输入信息不合法!\n");
int val= pArr->pBase[pos-1];
return val;
}
int getPro(struct Arr * pArr,int pos) {
// if (pos<1 || pos > pArr->cnt+1)
// printf("输入信息不合法!\n");
int val = pArr->pBase[pos-2];
return val;
}
int getAfter(struct Arr * pArr,int pos) {
//if (pos<1 || pos > pArr->cnt)
// printf("输入信息不合法!\n");
int val = pArr->pBase[pos];
return val;
}
bool destory_arr (struct Arr * pArr) {
free(pArr->pBase);
pArr->pBase=NULL;
return true;
}
相关文章推荐
- 【数据结构与算法】【排序】简单选择排序的代码实现
- 【数据结构与算法】【排序】堆排序的代码实现
- 【数据结构与算法】【排序】快速排序的代码实现
- 【数据结构与算法】【排序】希尔排序的代码实现
- 数据结构之三元组顺序表实现稀疏矩阵运算(参考整理严蔚敏数据结构)
- 算法——数据结构图的最短路径实现JAVA代码
- 数据结构之队列――链式存储结构(php代码实现)
- 看数据结构写代码(6)双向链表的实现
- 【数据结构与算法】【查找】斐波那契查找的代码实现
- 看数据结构写代码(8)顺序栈的实现
- 数据结构之完全二叉树――顺序存储结构(php代码实现)
- 数据结构(一)——顺序表及实现
- 看数据结构写代码(9)链栈的实现
- 数据结构之线性表――链式存储结构之单链表(php代码实现)
- 数据结构中线性表的c语言代码实现
- java数据结构之线性表代码实现
- 数据结构之二叉树――链式存储结构(php代码实现)
- 【数据结构与算法】【查找】哈希表的代码实现
- 数据结构之队列――顺序存储结构(php代码实现――方法一)
- 【数据结构与算法】【排序】冒泡排序的代码实现