顺序表
概念
线性表的顺序表示
指的是用一组地址连续的储存单元依次存储线性表
的数据元素,这种表示也称作线性表的顺序存储结构
或顺序映像
。通常,称这种存储结构的线性表为顺序表(SequentialList)
。
特点
1.存储地址连续。
2.随机存取
3.存储密度大
4.(初始化)浪费空间
5.不可自由扩充
6.删除插入操作移动繁琐
实例 : 简单图书管理系统
存储结构
//数据元素
typedef struct
{
char no[20];
char name[20];
float price;
}Book;
//顺序表
typedef struct{
Book *book;
int length;
}SqList;
顺序表初始化
int InitList(SqList &L)
{
L.book=new Book[MAXSIZE];
if(!L.book){return OVERFLOW;}
L.length=0;
return OK;
}
插入
int ListInsert(SqList &L,int i,Book b)
{
if((i<1)||(i>L.length+1)){return ERROR;}
if(L.length==MAXSIZE){return ERROR;}
for(int j=L.length;j>=i-1;j--)
{
L.book[j+1]=L.book[j];
}
L.book[i-1]=b;
++L.length;
return OK;
}
删除
int ListDelete(SqList &L,int i)
{
if((i<1)||(i>L.length)){return ERROR;}
for(int j=i-1;j<L.length;j++)
{
L.book[j]=L.book[j+1];
}
--L.length;
return OK;
}
原码
#include <iostream>
#include <string.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
//书元素
typedef struct
{
char no[20];
char name[20];
float price;
}Book;
//书表
typedef struct{
Book *book;
int length;
}SqList;
//顺序表初始化
int InitList(SqList &L)
{
L.book=new Book[MAXSIZE];
if(!L.book){return OVERFLOW;}
L.length=0;
return OK;
}
//取值(第i本书)
int GetBook(SqList L,int i,Book &b)
{
if(i<1||i>L.length) {return ERROR;}
b=L.book[i-1];
return OK;
}
//查找
int LocateBook(SqList L,Book b)
{
for(int i=0;i<L.length;i++)
{
if(strcmp(L.book[i].no,b.no)==0) {return i+1;}
}
return ERROR;
}
//插入
int ListInsert(SqList &L,int i,Book b)
{
if((i<1)||(i>L.length+1)){return ERROR;}
if(L.length==MAXSIZE){return ERROR;}
for(int j=L.length;j>=i-1;j--)
{
L.book[j+1]=L.book[j];
}
L.book[i-1]=b;
++L.length;
return OK;
}
//删除
int ListDelete(SqList &L,int i)
{
if((i<1)||(i>L.length)){return ERROR;}
for(int j=i-1;j<L.length;j++)
{
L.book[j]=L.book[j+1];
}
--L.length;
return OK;
}
void in_book(Book &t)
{
cout<<"
ISBN:";cin>>t.no;cout<<"书名:";cin>>t.name;cout<<"价格:";cin>>t.price;
}
void out_book(Book b)
{
cout<<"ISBN "<<b.no<<" |书名 "<<b.name<<" |价格 "
<<b.price<<endl;
return;
}
void display(SqList &L)
{
int i=0;
while(i<L.length)
{
out_book(L.book[i]);
i++;
}
return;
}
void add_book(SqList &L)
{
int i=L.length+1;
int n=1;
while(n)
{
Book t;
cout<<" [数据录入]"<<endl;
in_book(t);
ListInsert(L,i,t);
++i;
cout<<" 是[1]否[0]继续?"<<endl;
cin>>n;
}
}
void del_book(SqList &L)
{
Book b;
cout<<" [删除数据]
ISBN:"<<endl;
cin>>b.no;
ListDelete(L,LocateBook(L,b));
return;
}
void search_book(SqList &L)
{
Book b,m;
cout<<" [查找数据]
ISBN:"<<endl;
cin>>b.no;
GetBook(L,LocateBook(L,b),m);
out_book(m);
return;
}
void edi_book(SqList &L)
{
Book b,m,t;
cout<<" [修改数据]
ISBN:"<<endl;
cin>>b.no;
GetBook(L,LocateBook(L,b),m);
out_book(m);
in_book(t);
L.book[LocateBook(L,b)-1]=t;
return;
}
int main()
{
SqList List;
InitList(List);
//增
add_book(List);
display(List);
//删
del_book(List);
display(List);
//查
search_book(List);
//改
edi_book(List);
display(List);
}
运行结果