数据结构顺序表实现学习

#include"SeqList.h"



void InitSeqList(SeqList *list)//初始化顺序表
{
list->base = (Elemtype *)malloc(sizeof(Elemtype) * SEQLIST_INIT_SIZE);
assert(list->base != NULL);//用assert进行检测,检查是否创建成功
list->capacity = SEQLIST_INIT_SIZE;//初始化容量
list->size = 0;//初始化当前位置
}


void push_back(SeqList *list, Elemtype x)// 1. 尾插实现
{
if (list->size >= list->capacity)
{
printf("顺序表已满,无法进行尾插!\n");
return;
}
list->base[list->size] = x;
list->size++;
}


void push_front(SeqList *list, Elemtype x)// 2. 头插实现
{
if (list->size >= list->capacity)
{
printf("顺序表已满,不能进行头插!\n");
return;
}
for (int i = list->size; i > 0; --i)
{
list->base[i] = list->base[i - 1];
}
list->base[0] = x;
list->size++;
}


void show_list(SeqList *list)// 3. 显示实现
{
for (int i = 0; i < list->size; ++i)
{
printf("%d ", list->base[i]);
}
printf("\n");
}


void pop_back(SeqList *list)// 4.尾部删除实现
{
if (list->size == 0)
{
printf("线性表已空,不能尾部删除!\n");
return;
}
list->size--;
}


void pop_front(SeqList *list)// 5. 头部删除
{
if (list->size == 0)
{
printf("顺序表已空,不能进行头删!\n");
return;
}
for (int i = 0; i < list->size - 1; i++)
{
list->base[i] = list->base[i + 1];
}
list->size--;
}


void insert_pos(SeqList *list, int pos, Elemtype x)// 6. 按位置插入的函数实现
{
if (pos < 0 || pos > list->size)
{
printf("位置非法,不能进行按位置插入.\n");
return;
}
for (int i = list->size; i > pos; --i)
{
list->base[i] = list->base[i - 1];
}
list->base[pos] = x;
list->size++;
}


int find(SeqList *list, Elemtype key)// 7.对顺序表中的数据进行查找
{
for (int i = 0; i < list->size; i++)
{
if (list->base[i] == key)
{
return i;
}
}
return -1;
}


int length(SeqList *list)// 8. 求顺序表的长度
{
return list->size;
}


void delete_pos(SeqList *list, int pos)// 9. 按位置进行删除
{
if (pos < 0 || pos > list->size)
{
printf("输入的位置非法,不能进行删除.\n");
return;
}
for (int i = pos; i < list->size - 1; i++)
{
list->base[i] = list->base[i + 1];
}
list->size--;
}


//此处删除利用到了前面所写的函数,首先查找要删除的数据在表中的位置,接着一个按位置删除的函数进行删除
void delete_val(SeqList *list, Elemtype x)// 10. 按值进行删除
{
int pos = find(list, x);//此处找到位置
if (pos == -1)
{
printf("顺序表中不存在要删除的数据.\n");
return;
}
delete_pos(list, pos);//若存在要删除的数据,则调用按位置删除的函数
}


void sort(SeqList *list)// 11. 排序
{
for (int i = 0; i < list->size; i++)
{
for (int j = 0; j < list->size - i - 1; ++j)
{
if (list->base[j] > list->base[j + 1])
{
Elemtype temp = list->base[j];
list->base[j] = list->base[j + 1];
list->base[j + 1] = temp;
}
}
}
}
//在这个逆置之中用到了一个中间变量,当然也可以重新申请一个空间用来进行交换,但是当数据特多的时候就是不好的了,所以可行不可取!
void inverse(SeqList *list)// 12. 逆置
{
if (list->size == 0 || list->size == 1)
return;
Elemtype low = 0, high = list->size - 1;
while (low < high)
{
Elemtype temp;
temp = list->base[low];
list->base[low] = list->base[high];
list->base[high] = temp;
low++;
high--;
}
}
//清除和摧毁是有区别的,清除是表的 size 变成0; 摧毁是将整个表摧毁,清除之后还可以继续插入数据,摧毁之后就不可以插入了;
void clear(SeqList *list)// 13. 清除
{
list->size = 0;
}


void destroy(SeqList *list)// 14. 摧毁顺序表
{
free(list->base);
list->capacity = 0;
list->size = 0;

}

**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************


#include"SeqList.h"


void InitSeqList(SeqList *list)//初始化顺序表
{
list->base = (Elemtype *)malloc(sizeof(Elemtype) * SEQLIST_INIT_SIZE);
assert(list->base != NULL);//用assert进行检测,检查是否创建成功
list->capacity = SEQLIST_INIT_SIZE;//初始化容量
list->size = 0;//初始化当前位置
}


void push_back(SeqList *list, Elemtype x)// 1. 尾插实现
{
if (list->size >= list->capacity)
{
printf("顺序表已满,无法进行尾插!\n");
return;
}
list->base[list->size] = x;
list->size++;
}


void push_front(SeqList *list, Elemtype x)// 2. 头插实现
{
if (list->size >= list->capacity)
{
printf("顺序表已满,不能进行头插!\n");
return;
}
for (int i = list->size; i > 0; --i)
{
list->base[i] = list->base[i - 1];
}
list->base[0] = x;
list->size++;
}


void show_list(SeqList *list)// 3. 显示实现
{
for (int i = 0; i < list->size; ++i)
{
printf("%d ", list->base[i]);
}
printf("\n");
}


void pop_back(SeqList *list)// 4.尾部删除实现
{
if (list->size == 0)
{
printf("线性表已空,不能尾部删除!\n");
return;
}
list->size--;
}


void pop_front(SeqList *list)// 5. 头部删除
{
if (list->size == 0)
{
printf("顺序表已空,不能进行头删!\n");
return;
}
for (int i = 0; i < list->size - 1; i++)
{
list->base[i] = list->base[i + 1];
}
list->size--;
}


void insert_pos(SeqList *list, int pos, Elemtype x)// 6. 按位置插入的函数实现
{
if (pos < 0 || pos > list->size)
{
printf("位置非法,不能进行按位置插入.\n");
return;
}
for (int i = list->size; i > pos; --i)
{
list->base[i] = list->base[i - 1];
}
list->base[pos] = x;
list->size++;
}


int find(SeqList *list, Elemtype key)// 7.对顺序表中的数据进行查找
{
for (int i = 0; i < list->size; i++)
{
if (list->base[i] == key)
{
return i;
}
}
return -1;
}


int length(SeqList *list)// 8. 求顺序表的长度
{
return list->size;
}


void delete_pos(SeqList *list, int pos)// 9. 按位置进行删除
{
if (pos < 0 || pos > list->size)
{
printf("输入的位置非法,不能进行删除.\n");
return;
}
for (int i = pos; i < list->size - 1; i++)
{
list->base[i] = list->base[i + 1];
}
list->size--;
}


//此处删除利用到了前面所写的函数,首先查找要删除的数据在表中的位置,接着一个按位置删除的函数进行删除
void delete_val(SeqList *list, Elemtype x)// 10. 按值进行删除
{
int pos = find(list, x);//此处找到位置
if (pos == -1)
{
printf("顺序表中不存在要删除的数据.\n");
return;
}
delete_pos(list, pos);//若存在要删除的数据,则调用按位置删除的函数
}


void sort(SeqList *list)// 11. 排序
{
for (int i = 0; i < list->size; i++)
{
for (int j = 0; j < list->size - i - 1; ++j)
{
if (list->base[j] > list->base[j + 1])
{
Elemtype temp = list->base[j];
list->base[j] = list->base[j + 1];
list->base[j + 1] = temp;
}
}
}
}
//在这个逆置之中用到了一个中间变量,当然也可以重新申请一个空间用来进行交换,但是当数据特多的时候就是不好的了,所以可行不可取!
void inverse(SeqList *list)// 12. 逆置
{
if (list->size == 0 || list->size == 1)
return;
Elemtype low = 0, high = list->size - 1;
while (low < high)
{
Elemtype temp;
temp = list->base[low];
list->base[low] = list->base[high];
list->base[high] = temp;
low++;
high--;
}
}
//清除和摧毁是有区别的,清除是表的 size 变成0; 摧毁是将整个表摧毁,清除之后还可以继续插入数据,摧毁之后就不可以插入了;
void clear(SeqList *list)// 13. 清除
{
list->size = 0;
}


void destroy(SeqList *list)// 14. 摧毁顺序表
{
free(list->base);
list->capacity = 0;
list->size = 0;
}


**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************


#include<stdio.h>
#include"SeqList.h"


void main()
{
SeqList mylist;
InitSeqList(&mylist);
Elemtype Item;//待操作元素
int select = 1;//选项
int pos;//位置
while (select)
{
printf("**************************************************************\n");
printf("* [1]  push_back  尾插           [2]  push_front  头插       *\n");
printf("* [3]  show_list  显示           [4]  pop_back    尾删       *\n");
printf("* [5]  pop_front  头删           [6]  insert_pos  按位置插入 *\n");
printf("* [7]  find       查找           [8]  length      求表长     *\n");
printf("* [9]  delete_pos 按位删除       [10] delete_val  按值删除   *\n");
printf("* [11] sort       排序           [12] inverse     逆置       *\n");
printf("* [13] clear      清除           [14] destroy     摧毁       *\n");
printf("* [0]  quit_system退出                                       *\n");
printf("**************************************************************\n");
printf("请选择: >");
scanf_s("%d", &select);
if (select == 0)
break;
switch (select)
{
case 1:
//尾插
printf("请输入要插入的数据(-1结束).>");
while (scanf_s("%d", &Item), Item != -1)//while循环可以实现多个数据的输入,并且此处有个逗号表达式值得注意
{
push_back(&mylist, Item);
}
break;
case 2:
//头插
printf("请输入要插入的数据(-1结束).>");
while (scanf_s("%d", &Item), Item != -1)//while循环可以实现多个数据的输入,并且此处有个逗号表达式值得注意
{
push_front(&mylist, Item);
}
break;
case 3:
//显示顺序表
show_list(&mylist);
break;
case 4:
pop_back(&mylist);//尾部删除
break;
case 5:
pop_front(&mylist);//头部删除
break;
case 6:
printf("请输入要插入的数据:>");
scanf_s("%d", &Item);
printf("请输入插入的位置:>");
scanf_s("%d", &pos);
insert_pos(&mylist, pos, Item);//按位置插入
break;
case 7:
printf("请输入需要查找的数据:>");
scanf_s("%d", &Item);
pos = find(&mylist, Item);//查找数据在顺序表中的位置
if (pos == -1)
{
printf("%d在顺序表中不存在.\n", Item);
}
else
{
printf("顺序表中%d在下标为%d的位置.\n", Item, pos);
}
break;
case 8:
printf("顺序表的长度为%d.\n", length(&mylist));
break;
case 9:
printf("请输入需要删除数据的位置.>");
scanf_s("%d", &pos);
delete_pos(&mylist, pos);
break;
case 10:
printf("请输入要删除的数据.>");
scanf_s("%d", &Item);
delete_val(&mylist, Item);
break;
case 11:
sort(&mylist);
break;
case 12:
inverse(&mylist);
break;
case 13:
clear(&mylist);
break;
case 14:
destroy(&mylist);
break;
default:
printf("输入的信息有错误,请重新输入.\n");
break;
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用c++实现顺序表:多文件编程,层次清晰,函数有注释 SeqList();//构造函数,存储的元素个数设为0 bool setLength(size_t length);//设置已经存储的元素个数 bool addElement(ElemType element);//把某个元素添加到顺序表末尾 bool addElement(ElemType element , size_t n);//插入一个元素,使其成为第n个元素,其余元素后移 bool delElement();//删除所有的元素 bool delElement(size_t n);//删除第n个元素 bool delElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,把这个元素删除 bool replaceElement(ElemType element , size_t n);//使用一个元素,替换掉第n个元素 bool swapElement(size_t n1 , size_t n2);//把第n1个元素和第n2个元素交换 ElemType* getElement();//得到数组头的指针 ElemType* getElement(size_t n);//得到第n个元素的指针 size_t getLength();//得到存储的元素个数 size_t getMaxSize();//得到顺序表容量 bool showElementDetail();//输出所有的元素细节 bool showElementDetail(size_t n);//输出第n个元素的细节 bool showElementDetail(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,输出元素所有细节 size_t findElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素位置 static int inputAInt(int min = 0,int max = 9,int defaultValue = -1);//从键盘读取,限制为一个min到max间的整数,非法情况返回defaultValue void startControlLoop();//打开控制界面 ~SeqList();//析构函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值