数据结构顺序表实现学习
2016-04-25 22:07
621 查看
#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;
}
}
}
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;
}
}
}
相关文章推荐
- 算法与数据结构(JAVA)-排序算法总结
- 数据结构 用两个栈来模拟一个队列
- 数据结构二叉树的应用
- hdoj1012
- 树-二叉树中某个节点的下一个节点
- 不明觉厉的数据结构题
- JAVA数据结构-数组&简单排序
- C语言创建和操作单链表数据结构的实例教程
- 数据结构与算法——不相交集类的C++实现
- 数据结构算法——单链表的三种插入
- PythonCookBook-数据结构和算法
- numpy narray数据结构的一些常用方法--argsort,sort, 以及内置的sorted方法
- 数据结构 利用循环队列层次遍历一棵二叉树 递归实现
- 数据结构-堆
- ubus数据结构和接口介绍
- 【数据结构】二叉树的原理及实现学习总结
- 数据结构1
- 检测单链表是否有环
- 重学数据结构系列之——总结
- 数据结构之栈和队列