您的位置:首页 > 理论基础 > 数据结构算法

数据结构-顺序表代码实现

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: