//头文件
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
#define TypeEle int
//定义顺序表
//静态分配(数组)
typedef struct{
TypeEle data[MaxSize]; //存储数据
TypeEle length; //当前长度
}SqList;
//动态分配(指针)
typedef struct{
TypeEle *data; //头指针
TypeEle MSize; //最大容量(类似于长方体中的长)
TypeEle length; //当前长度
}SeqList;
//初始化顺序表
bool InitList(SqList & L,TypeEle MaxSizeC){ //参数 需初始化表名(静态),表的最大存储长度
for(int i=0;i<MaxSizeC;i++){
L.data[i] = 0;
}
L.length = 0;
return true;
}
bool InitList2(SeqList & L2, TypeEle MaxSizeC){ //参数 需初始化表名(动态),表的最大存储长度
L2.data = (TypeEle *)malloc(MaxSize *sizeof(TypeEle));
//malloc() 分配一块连续的内存空间,并返回一个指针
// sizeof() 求类型所占内存大小 (类似于长方体中的宽)
// MaxSize *sizeof(TypeEle) 整个表所占内存大小(类似于求长方体面积)
// (TypeEle *)将malloc()返回的指针强制装换为与表指针一致类型
L2.MSize = MaxSizeC;
L2.length = 0;
return true;
}
//销毁顺序表
bool DestoryList(SqList & L){
for(int i=0;i<L.length;i++){
L.data[i] = 0;
}
L.length = 0;
return true;
}
bool DestoryList2(SeqList & L2){
free(L2.data);
L2.length = 0;
L2.MSize =0;
return true;
}
//判断是否为空
//求长度
TypeEle ListEmpty(SqList L){
return L.length ;
}
TypeEle ListEmpty2(SeqList L2){
return L2.length ;
}
//输出
void DispList(SqList L){
for(int i = 0;i<L.length;i++){
printf("静态表第%d个数据是 %d\n",i+1,L.data[i]);
}
}
void DispList2(SeqList L2){
for(int i = 0;i<L2.length;i++){
printf("动态表第%d个数据是 %d\n",i+1,L2.data[i]);
}
}
//按序查找
TypeEle GetElem(SqList L,TypeEle i){
if(i<1 || i > L.length){
printf("请输入正确位序\n");
return -1;
}
return L.data[i];
}
TypeEle GetElem2(SeqList L2,TypeEle i){
if(i<1 || i > L2.length){
printf("请输入正确位序\n");
return -1;
}
return L2.data[i];
}
//按值查找(第一个相同的元素)
TypeEle LocateElem(SqList L,TypeEle e){ //参数 表名,插入位序,插入值
for(TypeEle i = 0 ;i<L.length;i++){
if(L.data[i] == e)
return i+1;
}
printf("没有相同元素\n");
return 0;
}
TypeEle LocateElem2(SeqList L2,TypeEle e){
for(TypeEle i = 0 ;i<L2.length;i++){
if(L2.data[i] == e)
return i+1;
}
printf("没有相同元素\n");
return 0;
}
//插入数据元素
void InsertList(SqList & L,TypeEle i,TypeEle e){ //参数 表名,插入位序,插入值
if(i<1 || i > L.length){
printf("请输入正确位序\n");
return ;
}
for(TypeEle j = L.length ;j>i;j--){ //插入位序后的所有元素向后移一位
L.data[j] = L.data[j-1];
}
L.data[i-1] = e;
L.length ++;
printf("插入数值后一位为 %d\n",L.data[i]);
}
void InsertList2(SeqList & L2,TypeEle i,TypeEle e){ //参数 表名,插入位序,插入值
if(i<1 || i > L2.length){
printf("请输入正确位序\n");
return ;
}
if(L2.MSize == L2.length){
printf("当前表已满,插入失败");
return ;
}
for(TypeEle j = L2.length ;j>i;j--){ //插入位序后的所有元素向后移一位
L2.data[j] = L2.data[j-1];
}
L2.data[i-1] = e;
L2.length ++;
printf("插入数值后一位为 %d\n",L2.data[i]);
}
//删除数据元素
//按位删除
TypeEle DeleteElem(SqList & L,TypeEle i) { //参数 表名,删除位序,返回被删除元素
if(i<1 || i > L.length){
printf("请输入正确位序\n");
return 0;
}
TypeEle e =0;
for(TypeEle j=i-1;j<L.length;j++ ){
L.data[j] = L.data[j+1];
}
L.length --;
return e;
}
TypeEle DeleteElem2(SeqList & L2,TypeEle i) { //参数 表名,删除位序,返回被删除元素
if(i<1 || i > L2.length){
printf("请输入正确位序\n");
return 0;
}
TypeEle e =0;
for(TypeEle j=i-1;j<L2.length;j++ ){
L2.data[j] = L2.data[j+1];
}
L2.length --;
return e;
}
//按值删除(第一个相同的元素)
TypeEle DeleteOne(SqList & L,TypeEle e) { //参数 表名,删除位序,返回被删除元素位序
TypeEle i = LocateElem(L,e) ;
TypeEle E = DeleteElem(L,i);
printf("第一个%d元素被删除\n",E);
}
TypeEle DeleteOne2(SeqList & L2,TypeEle e) { //参数 表名,删除位序,返回被删除元素位序
TypeEle i = LocateElem2(L2,e) ;
TypeEle E = DeleteElem2(L2,i);
printf("第一个%d元素被删除\n",E);
}
int main(){
//定义表
SqList L;
SeqList L2;
// 初始化表
bool init = InitList(L,MaxSize);
if(init)
printf("初始化成功!!\n");
else printf("初始化失败!!!\n");
bool init2 = InitList2(L2,MaxSize);
if(init2)
printf("初始化成功!!\n");
else printf("初始化失败!!!\n");
// 插入数值
for (int i =0;i<MaxSize-3;i++){
L.data[i]=i;
L2.data[i]=i+1;
L.length ++;
L2.length ++;
}
printf("插入成功!!!\n");
// 求当前长度
printf("当前长度为%d\n",ListEmpty(L));
printf("当前长度为%d\n",ListEmpty2(L2));
// 输出
DispList(L);
printf("----------------\n");
DispList2(L2);
printf("-------------------------------------------\n");
// 按位插入 表名,插入位序,插入值
InsertList(L,0,33333);
InsertList2(L2,4,44444);
//输出
DispList(L);
printf("----------------\n");
DispList2(L2);
printf("-------------------------------------------\n");
//按位删除 名,删除位序,返回被删除元素
TypeEle e1 = DeleteElem(L,2);
printf("被删除元素为%d\n",e1);
TypeEle e2=DeleteElem2(L2,0);
printf("被删除元素为%d\n",e2);
//按值删除 表名,删除位序,返回被删除元素位序
TypeEle i1=DeleteOne(L,2);
printf("被删除元素位序为%d\n",i1);
TypeEle i2=DeleteOne2(L2,2);
printf("被删除元素位序为%d\n",i2);
//输出
DispList(L);
printf("----------------\n");
DispList2(L2);
printf("-------------------------------------------\n");
// 销毁
bool des = DestoryList(L);
if(des)
printf("销毁成功!!\n");
else printf("销毁失败!!!\n");
bool des2 = DestoryList2(L2);
if(des2)
printf("销毁成功!!\n");
else printf("销毁失败!!!\n");
return 0;
}
/*----------------总结------------------
1、main函数 int main()
2、define取别名,需用“# ”声明
3、注意位序与下标的区别
4、free()参数得是指针
所以释放动态指针时是 free(L2.data),而不是free(L2)
5、定义方法传参得给出类型
void as(int a,int b) 正确
void as1( a,int b) 错误
6、无返回值函数也可使用 “return”,只是不可以加返回值
*/