数据结构是个很难学的东西。首先概念上十分抽象,不容易理区分和理解;其次初学者实现起来很困难,书上一般给的程序不是伪代码,就是不完整的代码,想要上机做实验有很大问题。所以学习过程中稍微遇上点麻烦就很容易放弃。鉴于自己在学习数据结构的痛苦经历特地分享一下自己的完整代码,希望能对新手提供一些微小的帮助。
#include <stdio.h>
#include <stdlib.h>
typedef enum {true, false} bool;
typedef struct Arr{
int *pBase;
int len;
int cnt;
}Array, *pArray;
//函数声明
void init_arr(pArray parr, int len);//生成一个顺序表
bool is_empty(pArray parr);//判断顺序表是否为空
bool is_full(pArray parr);//判断顺序表是否为满
bool append_arr(pArray parr, int val);//追加一个元素
void show_arr(pArray parr);//打印顺序表
bool insert_arr(pArray parr, int pos, int val);//在第pos的位置插入val
bool delete_arr(pArray parr, int pos, int *pVal);//删除第pos个元素
int get(pArray parr, int pos);//得到第pos个元素值
void inversion(pArray parr);//倒转顺序表
void sort_arr(pArray parr);//顺序表的排序
int main(int argc, const char * argv[]) {
Array arr;
int val, getval;
init_arr(&arr, 6);
append_arr(&arr, 13);
append_arr(&arr, 4);
append_arr(&arr, 34);
append_arr(&arr, 6);
show_arr(&arr);
insert_arr(&arr, 2, 99);
show_arr(&arr);
if (delete_arr(&arr, 2, &val)==true) {
printf("删除成功,删除的数据为:%d\n", val);
}else{
printf("删除失败");
}
show_arr(&arr);
getval = get(&arr, 4);
printf("得到的值为:%d\n", getval);
inversion(&arr);
show_arr(&arr);
sort_arr(&arr);
show_arr(&arr);
return 0;
}
void init_arr(pArray parr, int len){
parr->pBase = (int *)malloc(sizeof(int)*len);
if (parr->pBase == NULL) {
printf("内存分配失败\n");
exit(-1);
}else{
parr->len = len;
parr->cnt = 0;
}
return;
}
bool is_empty(pArray parr){
if (parr->cnt == 0) {
return true;
}else
return false;
}
bool is_full(pArray parr){
if (parr->cnt == parr->len) {
return true;
}else
return false;
}
bool append_arr(pArray parr, int val){
if (is_full(parr) == true) {
return false;
}else{
parr->pBase[parr->cnt] = val;
parr->cnt++;
}
return true;
}
void show_arr(pArray parr){
if (is_empty(parr) == true) {
printf("顺序表为空!\n");
exit(-1);
}else{
for (int i=0; i<parr->cnt; i++) {
printf("%d ", parr->pBase[i]);
}
}
printf("\n");
return;
}
bool insert_arr(pArray parr, int pos, int val){
if (is_full(parr) == true) {
return false;
}
if (pos<1 || pos>parr->cnt+1) {
return false;
}
for (int i = parr->cnt-1; i>=pos-1; i--) {
parr->pBase[i+1] = parr->pBase[i];
}
parr->pBase[pos-1] = val;
(parr->cnt)++;
return true;
}
bool delete_arr(pArray parr, int pos, int *pVal){
if (is_empty(parr) == true) {
return false;
}
if (pos<1 || pos>parr->cnt) {
return false;
}
*pVal = parr->pBase[pos-1];
for (int i=pos; i<parr->cnt; i++) {
parr->pBase[i-1]=parr->pBase[i];
}
(parr->cnt)--;
return true;
}
int get(pArray parr, int pos){
if (is_empty(parr) == true) {
return false;
}
if (pos<1 || pos>parr->cnt) {
return false;
}
return parr->pBase[pos-1];
}
void inversion(pArray parr){
if (is_empty(parr) == true) {
printf("顺序表为空!\n");
exit(-1);
}else{
int i = 0;
int j = parr->cnt-1;
int t;
while (i<j) {
t = parr->pBase[i];
parr->pBase[i] = parr->pBase[j];
parr->pBase[j] = t;
i++;
j--;
}
}
return;
}
void sort_arr(pArray parr){
int i, j, t;
for (i=0; i<parr->cnt; i++) {
for (j=i+1; j<parr->cnt; j++) {
if (parr->pBase[i] > parr->pBase[j]) {
t = parr->pBase[i];
parr->pBase[i] = parr->pBase[j];
parr->pBase[j] = t;
}
}
}
return;
}