线性表——顺序表
线性表结构体:
typedef struct Array{ int len; // 记录数组内有效元素个数 int max; // 记录最大元素个数 int *pBase; }Ar, *pAr;
顺序表基本运算:
初始化一个Array
pAr CreatArray(int num) //初始化一个Array { pAr parr = (pAr)malloc(sizeof(Ar)); if (NULL == parr) { printf("动态内存分配失败!程序终止!\n"); exit(-1); } parr->pBase = (int *)malloc(sizeof(int)*num); if (NULL == parr->pBase) { printf("动态内存分配失败!程序终止!\n"); exit(-1); } parr->len = 0; // 置初始化长度为0 parr->max = num; // 置最大长度为num return parr; }
在数组的末尾追加元素
int Append_Val(pAr parr, int val) // 在数组的末尾追加元素 { // 数组满了不能追加 if (Is_Array_Full(parr)) { printf("顺序表已满,追加失败!\n"); return 0; } // 将数据val写入末尾位置,并刷新当前数组长度 parr->pBase[parr->len] = val; parr->len++; return 1; }
数组的排序
void Sort_Array(pAr parr) // 数组的排序 { // 使用冒泡排序算法 int temp; for (int i=0; i<parr->len; i++) for (int j=0; j<parr->len; j++) if (parr->pBase[i] > parr->pBase[j]) { temp = parr->pBase[i]; parr->pBase[i] = parr->pBase[j]; parr->pBase[j] = temp; } return; }
遍历一个数组
void Show_Array(pAr parr) // 遍历一个数组 { for (int i=0; i<parr->len; i++) printf("Array[%d] = %d\n",i+1,parr->pBase[i]); return; }
某一个位置之前插入
int Insert_Array_pre(pAr parr, int length, int val)// 某一个位置之前插入 { int i; if (length<0 || length>parr->len) { printf("元素插入位置无效!插入失败!\n"); return 0; } if ( Is_Array_Full(parr) ) { printf("顺序表已满,插入失败!\n"); return 0; } else parr->len++; for (i=parr->len-1; i>length-1; i--) parr->pBase[i] = parr->pBase[i-1]; parr->pBase[i] = val; return 1; }
删除某一元素,并且将第一次出现的位置下标发送给主函数
int Delete_Val(pAr parr, int * length, int val)// 删除某一元素,并且将第一次出现的位置下标发送给主函数 { int i, flag=0; for (i=0; i<parr->len; i++) { if (val == parr->pBase[i] && 0 == flag) { *length = i+1; // 记录val第一次出现的位置 flag = 1; } if (1 == flag) { parr->pBase[i] = parr->pBase[i+1]; } } if (1 == flag) { parr->len --; return 1; } else return 0; }
删除固定位置,并且将删除的元素发送给主函数
int Delete_Len(pAr parr, int length, int * val) // 删除固定位置,并且将删除的元素发送给主函数 { int i; if (length<0 || length>parr->len) { printf("元素位置不存在,删除失败!\n"); return 0; } *val = parr->pBase[length-1]; for (i=length-1; i<parr->len; i++) { parr->pBase[i] = parr->pBase[i+1]; } parr->len--; return 1; }
判断数组是否为满
int Is_Array_Full(pAr parr) // 判断数组是否为满 { if (parr->max == parr->len) return 1; else return 0; }
判断数组是否为空
int Is_Array_Empty(pAr parr)// 判断数组是否为空 { if (0 == parr->len) return 1; else return 0; }
整体表示:
Array.h文件
1 // 创建一个顺序表 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 typedef struct Array{ 6 int len; // 记录数组内有效元素个数 7 int max; // 记录最大元素个数 8 int *pBase; 9 }Ar, *pAr; 10 11 pAr CreatArray(int num); //初始化一个Array 12 int Append_Val(pAr parr, int val); // 在数组的末尾追加元素 13 void Sort_Array(pAr parr); // 数组的排序 14 void Show_Array(pAr parr); // 展现一个数组 15 int Insert_Array_pre(pAr parr, int length, int val);// 某一个位置之前插入 16 int Delete_Val(pAr parr, int * length, int val);// 删除某一元素,并且将第一次出现的位置下标发送给主函数 17 int Delete_Len(pAr parr, int length, int * val);// 删除固定位置,并且将删除的元素发送给主函数 18 int Is_Array_Full(pAr parr); // 判断数组是否为满 19 int Is_Array_Empty(pAr parr);// 判断数组是否为空
Array.c文件
#include "Array.h" int Is_Array_Full(pAr parr) // 判断数组是否为满 { if (parr->max == parr->len) return 1; else return 0; } int Is_Array_Empty(pAr parr)// 判断数组是否为空 { if (0 == parr->len) return 1; else return 0; } pAr CreatArray(int num) //初始化一个Array { pAr parr = (pAr)malloc(sizeof(Ar)); if (NULL == parr) { printf("动态内存分配失败!程序终止!\n"); exit(-1); } parr->pBase = (int *)malloc(sizeof(int)*num); if (NULL == parr->pBase) { printf("动态内存分配失败!程序终止!n"); exit(-1); } parr->len = 0; // 置初始化长度为0 parr->max = num; // 置最大长度为num return parr; } int Append_Val(pAr parr, int val) // 在数组的末尾追加元素 { // 数组满了不能追加 if (Is_Array_Full(parr)) { printf("顺序表已满,追加失败!\n"); return 0; } // 将数据val写入末尾位置,并刷新当前数组长度 parr->pBase[parr->len] = val; parr->len++; return 1; } void Sort_Array(pAr parr) // 数组的排序 { // 使用冒泡排序算法 int temp; for (int i=0; i<parr->len; i++) for (int j=0; j<parr->len; j++) if (parr->pBase[i] > parr->pBase[j]) { temp = parr->pBase[i]; parr->pBase[i] = parr->pBase[j]; parr->pBase[j] = temp; } return; } void Show_Array(pAr parr) // 展现一个数组 { for (int i=0; i<parr->len; i++) printf("Array[%d] = %d\n",i+1,parr->pBase[i]); return; } int Insert_Array_pre(pAr parr, int length, int val)// 某一个位置之前插入 { int i; if (length<0 || length>parr->len) { printf("元素插入位置无效!插入失败!\n"); return 0; } if ( Is_Array_Full(parr) ) { printf("顺序表已满,插入失败!\n"); return 0; } else parr->len++; for (i=parr->len-1; i>length-1; i--) parr->pBase[i] = parr->pBase[i-1]; parr->pBase[i] = val; return 1; } int Delete_Val(pAr parr, int * length, int val)// 删除某一元素,并且将第一次出现的位置下标发送给主函数 { int i, flag=0; for (i=0; i<parr->len; i++) { if (val == parr->pBase[i] && 0 == flag) { *length = i+1; // 记录val第一次出现的位置 flag = 1; } if (1 == flag) { parr->pBase[i] = parr->pBase[i+1]; } } if (1 == flag) { parr->len --; return 1; } else return 0; } int Delete_Len(pAr parr, int length, int * val) // 删除固定位置,并且将删除的元素发送给主函数 { int i; if (length<0 || length>parr->len) { printf("元素位置不存在,删除失败!\n"); return 0; } *val = parr->pBase[length-1]; for (i=length-1; i<parr->len; i++) { parr->pBase[i] = parr->pBase[i+1]; } parr->len--; return 1; }
简单测试示例:
//main.c #include "Array.h" int main() { int length; pAr parr = CreatArray(5); Append_Val(parr,1); printf("%d ",Delete_Val(parr,&length,1)); Show_Array(parr); return 0; }
RR
本人计算机小白一枚,对编程有浓厚兴趣,在此贴出自己的计算机学习历程,还有很多不足,望多多指教!
读书后发现好多的内容与具体专业有偏差,没来得及完成,虽然“有时间我就会做...”是人生最大的谎言,但有时间我会继续搞定未完成的内容,有始有终,兴趣使然!