最近在准备考研复试,科目是数据结构,参考书为严蔚敏版数据结构教材以及王道数据结构考研辅导书,想做一点学习记录,代码是看了视频之后学习到了思路然后自己写的,可能会存在不足或者错误,本着交流学习的心,有任何建议或者错误,请提出宝贵的意见,感谢!
今天主要是使用了动态分配的方式写了顺序表的一些基本操作,最后做了一点封装,可以在控制台操作
Project: sequence_list(数据结构-顺序表)
Date: 2024/01/30
Author: Lasthai
InitList(sequence_table &L) 参数:顺序表L 功能:初始化 时间复杂度:O(1)
increasesize(sequence_table &L,int increase_len) 参数:顺序表L,增大长度 功能:增加顺序表的长度
ListInsert(sequence_table &L,int pos,int element) 参数:顺序表L,位置pos,元素element 功能:位置pos(从0开始)处插入元素element 时间复杂度:O(n)
push_element(sequence_table &L,int element) 参数:顺序表L,元素element 功能:末尾插入元素element 时间复杂度:O(1)
ListDelete(sequence_table &L,int pos,int &element) 参数:顺序表L,位置pos,被删除的元素element 功能:删除位置pos(从0开始)处元素并回代值 时间复杂度:O(n)
locateElem(sequence_table L ,int element) 参数:顺序表L,元素e 功能:返回第一个等于element的元素的位置 时间复杂度:O(n)
get_value(sequence_table L,int pos)参数:顺序表L,位置pos 功能:返回位置pos的元素值 时间复杂度:O(n)
print_Elem(sequence_table L)参数:顺序表L 功能:遍历L,并输出
List_reverse(sequence_table &L) 参数:顺序表L 倒置函数 将原顺序表直接倒置
Destroy_List(sequence_table &L)参数:顺序表L 功能:清空顺序表
顺序表的定义
静态分配
//静态分配定义
struct sequence_table
{
int data[init_maxsize];
int length;
};
void InitList(sequence_table &L)//静态分配的初始化
{
for (int i = 0; i < init_maxsize; i++)
{
L.data[i]=0;
}
L.length=0;
}
动态分配
//动态分配定义
struct sequence_table
{
int *data;
int length;
int Max_size;
};
//动态分配的初始化
void InitList(sequence_table &L)
{ //手动开辟堆空间,后期手动free
L.data=(int*)malloc(sizeof(int)*init_maxsize);
L.length=0;
L.Max_size=init_maxsize;
}
基本操作
//**基本操作*********************************************************************************************
//在pos位置插入数据elemen(pos从0开始)
bool ListInsert(sequence_table &L,int pos,int element)
{
if (L.length==L.Max_size )
{
printf("The table is full\n");
return false;
}
if (pos<0 || pos>L.Max_size)//判断插入位置非法
{
printf("Invalid pos\n");
return false;
}
else if(pos<=L.length)//如果插入位置已有插入元素,需要先把元素后移
{
for (int i = L.length; i >= pos ; i--)
{
L.data[i]=L.data[i-1];
}
}
L.data[pos]=element;
L.length++;
return true;
}
//尾插元素element
bool push_element(sequence_table &L,int element)
{
if (L.length==L.Max_size )
{
printf("The table is full\n");
return false;
}
L.data[L.length]=element;
L.length++;
}
//删除pos位置的元素,并记录删除元素的值
bool ListDelete(sequence_table &L,int pos,int &element)
{
element=L.data[pos];
if (pos<0 || pos>=L.length)//判断位置非法
{
printf("Invalid pos\n");
return false;
}
for (int i = pos; i < L.length; i++)
{
L.data[i]=L.data[i+1]; //元素前移把要删除的元素位置直接覆盖
}
L.length--;
return true;
}
//获取顺序表当前长度
int get_List_Len(sequence_table L)
{
return L.length;
}
//按值查找位置并返回(位置从0开始)
int locateElem(sequence_table L ,int element)
{
for (int i = 0; i < L.length; i++)//依次遍历找到值后返回下标
{
if (L.data[i]==element)
{
return i;
}
}
return -1;//未找到则返回-1
}
//按位查值并返回(pos从0开始)
int get_value(sequence_table L,int pos)
{
if (pos<0||pos>=L.length)
{
return -1;
}
return L.data[pos];
}
//判空
bool is_empty(sequence_table L)
{
if (L.length==0)
{
return true;
}
}
//输出表中元素
void print_Elem(sequence_table L)
{
for (int i = 0; i < L.length; i++)
{
printf("the %d element :%d\n",i,L.data[i]);
}
}
//清空表
void Destroy_List(sequence_table &L)
{
L.length=0;
}
//元素反转
void List_reverse(sequence_table &L)
{
int *temp;
int j=0;
temp=(int*)malloc(sizeof(int)*L.length);
for (int i = 0; i < L.length; i++)//定义temp暂存数据
{
temp[i]=L.data[i];
}
for (int i = L.length-1; i >= 0; i--)//倒序把数据存回去
{
L.data[i]=temp[j];
j++;
}
free(temp);
j=0;
}
控制台界面封装
//界面功能封装*******************************************************************************************
//建表
void create_table(sequence_table &L)
{
int element;
printf("Please input value to create: press 000 to stop\n");
while (1)
{
scanf("%d",&element);
if (element==000)
{
return;
}
push_element(L,element);
}
}
//插入元素
void Insert(sequence_table &L)
{
int pos,value;
printf("Please input inserting_position and value:\n");
printf("format:1 2\n");
scanf("%d %d",&pos,&value);
ListInsert(L,pos,value);
}
//删除元素
void Delete(sequence_table &L)
{
int pos,value;
printf("Please input deleting_position:\n");
scanf("%d",&pos);
ListDelete(L,pos,value);
printf("%d was deleted\n",value);
}
//查找值位置
void Search_pos(sequence_table L)
{
int value,pos;
printf("Please input value to find the position\n");
scanf("%d",&value);
pos=locateElem(L,value);
printf("the position of value:%d is %d",value,pos);
}
//查找位置值
void search_value(sequence_table L)
{
int value,pos;
printf("Please input position to find value\n");
scanf("%d",&pos);
value=get_value(L,pos);
printf("the value of the %d is %d",pos,value);
}
void menu()
{
printf("**********1.create 2.insert**********\n");
printf("**********3.delete 4.search for pos**********\n");
printf("**********5.search for value 6.print**********\n");
printf("**********7.clear 8.reverse**********\n");
printf("**********9.Exit **********\n");
}
//**************************
实现效果
全部代码
/*
Project: sequence_list(数据结构-顺序表)
Date: 2024/01/30
Author: Lasthai
InitList(sequence_table &L) 参数:顺序表L 功能:初始化 时间复杂度:O(1)
increasesize(sequence_table &L,int increase_len) 参数:顺序表L,增大长度 功能:增加顺序表的长度
ListInsert(sequence_table &L,int pos,int element) 参数:顺序表L,位置pos,元素element 功能:位置pos(从0开始)处插入元素element 时间复杂度:O(n)
push_element(sequence_table &L,int element) 参数:顺序表L,元素element 功能:末尾插入元素element 时间复杂度:O(1)
ListDelete(sequence_table &L,int pos,int &element) 参数:顺序表L,位置pos,被删除的元素element 功能:删除位置pos(从0开始)处元素并回代值 时间复杂度:O(n)
locateElem(sequence_table L ,int element) 参数:顺序表L,元素e 功能:返回第一个等于element的元素的位置 时间复杂度:O(n)
get_value(sequence_table L,int pos)参数:顺序表L,位置pos 功能:返回位置pos的元素值 时间复杂度:O(n)
print_Elem(sequence_table L)参数:顺序表L 功能:遍历L,并输出
List_reverse(sequence_table &L) 参数:顺序表L 倒置函数 将原顺序表直接倒置
Destroy_List(sequence_table &L)参数:顺序表L 功能:清空顺序表
*/
#include<stdio.h>
#include<malloc.h>
#define init_maxsize 10
// //静态分配定义
// struct sequence_table
// {
// int data[init_maxsize];
// int length;
// };
// void InitList(sequence_table &L)//静态分配的初始化
// {
// for (int i = 0; i < init_maxsize; i++)
// {
// L.data[i]=0;
// }
// L.length=0;
// }
//动态分配定义
struct sequence_table
{
int *data;
int length;
int Max_size;
};
//动态分配的初始化
void InitList(sequence_table &L)
{ //手动开辟堆空间,后期手动free
L.data=(int*)malloc(sizeof(int)*init_maxsize);
L.length=0;
L.Max_size=init_maxsize;
}
//增大顺序表的容量,增加值increase_len
void increasesize(sequence_table &L,int increase_len)
{
sequence_table temp_L=L;
//int *temp_L=L.data;
//temp_L=L;
//L.data=(sequence_table*)malloc(sizeof*(sequence_table)*L.Max_size+increase_len);
L.data=(int*)malloc(sizeof(int)*(L.Max_size+increase_len));
for (int i = 0; i < L.length; i++)
{
//未验证是否可以赋值
L.data[i]=temp_L.data[i];
//L.data[i]=temp_L[i];
}
L.Max_size=L.Max_size+increase_len;
}
//**基本操作*********************************************************************************************
//在pos位置插入数据elemen(pos从0开始)
bool ListInsert(sequence_table &L,int pos,int element)
{
if (L.length==L.Max_size )
{
printf("The table is full\n");
return false;
}
if (pos<0 || pos>L.Max_size)//判断插入位置非法
{
printf("Invalid pos\n");
return false;
}
else if(pos<=L.length)//如果插入位置已有插入元素,需要先把元素后移
{
for (int i = L.length; i >= pos ; i--)
{
L.data[i]=L.data[i-1];
}
}
L.data[pos]=element;
L.length++;
return true;
}
//尾插元素element
bool push_element(sequence_table &L,int element)
{
if (L.length==L.Max_size )
{
printf("The table is full\n");
return false;
}
L.data[L.length]=element;
L.length++;
}
//删除pos位置的元素,并记录删除元素的值
bool ListDelete(sequence_table &L,int pos,int &element)
{
element=L.data[pos];
if (pos<0 || pos>=L.length)//判断位置非法
{
printf("Invalid pos\n");
return false;
}
for (int i = pos; i < L.length; i++)
{
L.data[i]=L.data[i+1]; //元素前移把要删除的元素位置直接覆盖
}
L.length--;
return true;
}
//获取顺序表当前长度
int get_List_Len(sequence_table L)
{
return L.length;
}
//按值查找位置并返回(位置从0开始)
int locateElem(sequence_table L ,int element)
{
for (int i = 0; i < L.length; i++)//依次遍历找到值后返回下标
{
if (L.data[i]==element)
{
return i;
}
}
return -1;//未找到则返回-1
}
//按位查值并返回(pos从0开始)
int get_value(sequence_table L,int pos)
{
if (pos<0||pos>=L.length)
{
return -1;
}
return L.data[pos];
}
//判空
bool is_empty(sequence_table L)
{
if (L.length==0)
{
return true;
}
}
//输出表中元素
void print_Elem(sequence_table L)
{
for (int i = 0; i < L.length; i++)
{
printf("the %d element :%d\n",i,L.data[i]);
}
}
//清空表
void Destroy_List(sequence_table &L)
{
L.length=0;
}
//元素反转
void List_reverse(sequence_table &L)
{
int *temp;
int j=0;
temp=(int*)malloc(sizeof(int)*L.length);
for (int i = 0; i < L.length; i++)//定义temp暂存数据
{
temp[i]=L.data[i];
}
for (int i = L.length-1; i >= 0; i--)//倒序把数据存回去
{
L.data[i]=temp[j];
j++;
}
free(temp);
j=0;
}
//****************************************************************************************************
//界面功能封装*******************************************************************************************
//建表
void create_table(sequence_table &L)
{
int element;
printf("Please input value to create: press 000 to stop\n");
while (1)
{
scanf("%d",&element);
if (element==000)
{
return;
}
push_element(L,element);
}
}
//插入元素
void Insert(sequence_table &L)
{
int pos,value;
printf("Please input inserting_position and value:\n");
printf("format:1 2\n");
scanf("%d %d",&pos,&value);
ListInsert(L,pos,value);
}
//删除元素
void Delete(sequence_table &L)
{
int pos,value;
printf("Please input deleting_position:\n");
scanf("%d",&pos);
ListDelete(L,pos,value);
printf("%d was deleted\n",value);
}
//查找值位置
void Search_pos(sequence_table L)
{
int value,pos;
printf("Please input value to find the position\n");
scanf("%d",&value);
pos=locateElem(L,value);
printf("the position of value:%d is %d",value,pos);
}
//查找位置值
void search_value(sequence_table L)
{
int value,pos;
printf("Please input position to find value\n");
scanf("%d",&pos);
value=get_value(L,pos);
printf("the value of the %d is %d",pos,value);
}
void menu()
{
printf("**********1.create 2.insert**********\n");
printf("**********3.delete 4.search for pos**********\n");
printf("**********5.search for value 6.print**********\n");
printf("**********7.clear 8.reverse**********\n");
printf("**********9.Exit **********\n");
}
//**********************************************************************************************
int main()
{
int e=-1;
int choice;
sequence_table L;
InitList(L);
while (1)
{
int p;
menu();
while (1)//此循环用来判断非数字的字符
{
printf("Enter your choice:");
if (scanf("%d",&choice))
break;
else
{
printf("Invalid input!Please enter a number.\n");
while (getchar()!='\n');//清楚缓存
}
}
switch (choice)
{
case 1:create_table(L); break;
case 2:Insert(L); break;
case 3:Delete(L); break;
case 4:Search_pos(L); break;
case 5:search_value(L); break;
case 6:print_Elem(L); break;
case 7:Destroy_List(L); break;
case 8:List_reverse(L);break;
case 9: free(L.data);
return 0;
default:printf("input error!!!,Please enter again:\n");
}
}
free(L.data);
return 0;
}