顺序表的基本功能实现
- 线性表是数据结构的基础结构。数据结构+算法=程序,今天结束了C++的书本自学,扎进数据结构和算法的世界里。
- 线性表分为顺序存储(顺序表),链式存储(链表),索引存储,散列存储等。
- 顺序表:用一组地址连续的存储单元依次存储线性表的数据元素。即逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,结构简单。但缺点也显然:在作插入或删除操作时,需要移动大量元素。
- 关于数据结构,最重要的是会画图,明白逻辑结构和物理结构。不急不燥,代码不是一气呵成的,需要长久的练习和耐心。
- 下面是顺序表的实现代码:
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
#define LIST_INIT_SIZE 100
#define LIST_INC_SIZE 10
typedef struct Sqlist{
int* ptr;
int length;
int listSize;
}sqlist;
void init_sqlist(sqlist& LA);
void setElem(sqlist& LA);
void print_sqlist(sqlist& LA);
void insert_sqlist(sqlist& LA,int index,int elem);
void deleteElem_sqlist(sqlist& LA,int index);
void updateElem_sqlist(sqlist& LA,int index);
void searchElem_sqlist(sqlist& LA,int index);
void init_sqlist(sqlist& LA)
{
LA.ptr=(int*)malloc(sizeof(int)*LIST_INIT_SIZE);
if(!LA.ptr) exit(1);
LA.length=0;
LA.listSize=LIST_INIT_SIZE;
}
void setElem(sqlist& LA)
{
int m,n;
cout<<"请输入要录入的数据个数:(0~100以内)"<<endl;
cin>>n;
for(int i=0;i<n;i++)
{
cout<<"请输入第"<<i+1<<"数据:";
cin>>m;
*(LA.ptr+i)=m;
LA.length++;
}
}
void print_sqlist(sqlist& LA)
{
for(int i=0;i<LA.length;i++)
{
cout<<*(LA.ptr+i)<<'\t';
}
cout<<endl;
}
void insert_sqlist(sqlist& LA,int index,int elem)
{
if(index<0||index>LA.length)
{
cout<<"非法的index!"<<endl;
exit(1);
}
if(LA.length>=LIST_INIT_SIZE)
{
cout<<"线性表溢出需要扩展容量!"<<endl;
int* newBase=(int*)realloc(LA.ptr,(LA.listSize+LIST_INC_SIZE)*sizeof(int));
if(!newBase) exit(1);
LA.ptr=newBase;
LA.listSize+=LIST_INC_SIZE;
}
if(index==0)
{
for(int i=0;i<LA.length;i++)
{
*(LA.ptr+LA.length-i)=*(LA.ptr+LA.length-i-1);
}
*(LA.ptr)=elem;
LA.length++;
}
else if(index==LA.length)
{
for(int i=index;i<LA.length;i++)
{
*(LA.ptr+LA.length)=elem;
}
*(LA.ptr+LA.length)=elem;
LA.length++;
}
else
{
for(int i=index,j=0;i<LA.length;i++,j++)
{
*(LA.ptr+LA.length-j)=*(LA.ptr+LA.length-1-j);
}
*(LA.ptr+index)=elem;
LA.length++;
}
}
void deleteElem_sqlist(sqlist& LA,int index)
{
if(index<0||index>LA.length)
{
cout<<"非法的index!"<<endl;
exit(1);
}
if(index==0)
{
for(int i=index;i<LA.length;i++)
{
*(LA.ptr+i)=*(LA.ptr+i+1);
}
LA.length--;
}
else if(index==LA.length)
{
LA.length--;
}
else
{
for(int i=index,j=0;i<LA.length;i++,j++)
{
*(LA.ptr+index+j)=*(LA.ptr+index+j+1);
}
LA.length--;
}
}
void searchElem_sqlist(sqlist& LA,int index)
{
if(index<0||index>LA.length-1)
{
cout<<"非法的index!"<<endl;
exit(1);
}
cout<<"下标"<<index<<"的元素值为:"<<*(LA.ptr+index)<<endl;
}
void updateElem_sqlist(sqlist& LA,int index)
{
int upNum;
searchElem_sqlist(LA,index);
cout<<"请输入你要更新的值:";
cin>>upNum;
*(LA.ptr+index)=upNum;
}
int main()
{
int index,elem;
sqlist LA;
init_sqlist(LA);
setElem(LA);
print_sqlist(LA);
for(;;)
{
cout<<"请输入插入的下标和元素值:";
cin>>index>>elem;
insert_sqlist(LA,index,elem);
print_sqlist(LA);
cout<<"请输入删除元素的下标:";
cin>>index;
deleteElem_sqlist(LA,index);
print_sqlist(LA);
cout<<"请输入要更新的元素下标:";
cin>>index;
updateElem_sqlist(LA,index);
print_sqlist(LA);
cout<<"请输入要查找的元素下标:";
cin>>index;
searchElem_sqlist(LA,index);
print_sqlist(LA);
}
return 0;
}