您的位置:首页 > 理论基础 > 数据结构算法

数据结构顺序表实现学习

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;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: