这里用一张图进行说明。灵魂画手作画,并不是在实际内存中的准确形式,只是用来帮助理解。
#include
#include
#include
#define MAXSIZE 100//设置最大空间
#define INSERT 10//如果空间不足以插入新数据,那么需要追加空间
typedef struct library
{
char Bname[20];//书名
float price; //价格
char Bnum[20]; //编号
}Book;
typedef struct
{
Book *elem;
int length; //当前表长
int listsize;//表的最大长度
}SqList;
1.初始化
//初始化空表
void InitList(SqList *L,int max)
{
L->elem=(Book*)malloc(sizeof(Book)*MAXSIZE); //申请内存空间
(*L).length=0; //初始化当前长度为0
(*L).listsize=max; //定义所需线性表的最大长度。
}
2.初始录入信息
//初始录入信息
void InputList(Book *e)
{
printf("请输入图书编号:");
scanf("%s",e->Bnum);
getchar(); //我用的是VS2012,用getchar()来吃掉回车
printf("请输入图书名称:");
scanf("%s",e->Bname);
getchar();
printf("请输入图书价格:");
scanf("%f",&e->price);
getchar();
}
3.插入与删除信息
//任意位置插入
void InsertList(SqList *L,Book *e,int i)//因为是要改变线性表,
{ //所以传入地址而不是值
Book *newnode;
int j;
if(i<1||i>(*L).length)
{
printf("ERROR\n"); //这里的i表示的是第几个,所以注意插入
exit(0);
} //的位置是elem[i-1]哦
if((*L).length>=(*L).listsize)
{
//用realloc()追加空间,不过只要你预先申请的空间足够大,
//这一步基本上用不到
newnode=(Book*)realloc(L->elem,sizeof(Book)*(L->length+INSERT));
L->elem=newnode;
L->listsize+=INSERT;
}
for(j=L->length;j>=i;j--)
{
L->elem[j]=L->elem[j-1]; //在插入的位置后将前面的元素往后平移
} //所以我们从后往前遍历
L->elem[i-1]=*e;
L->length++;
}
//任意位置删除
void DeleteList(SqList *L,int i)
{
int j;
Book *e=(Book*)malloc(sizeof(Book));
if(i<1||i>(*L).length)
{
printf("ERROR\n");
exit(0);
}
*e=L->elem[i-1];
for(j=i;j<L->length;j++)
{
L->elem[j-1]=L->elem[j];//在删除的元素之后,将后面的元素往前平移。
} //因此从被删除的位置的后一位开始遍历
free(e);
L->length--;
}
4.修改信息
void Update(SqList *L,char Bnum[])//这里我们是通过编号进行检索的,
{ //这里也可以修改成按书名或者位置检索
int i;
for(i=0;i<L->length;i++)
{
if(!strcmp(Bnum,L->elem[i].Bnum))
break;
}
printf("请输入图书编号:");
scanf("%s",L->elem[i].Bnum);
getchar();
printf("请输入图书名称:");
scanf("%s",L->elem[i].Bname);
getchar();
printf("请输入图书价格:");
scanf("%f",&(L->elem[i].price));
getchar();
}
5.查找元素
尽情的遍历吧!
//按编号查找
void SearchNum(SqList L,char Bnum[])//此处不需要修改线性表,所以不必传址
{
int i;
for(i=0;i<L.length;i++)
{
if(!strcmp(Bnum,L.elem[i].Bnum))
break;
}
printf("编号:%s\n",L.elem[i].Bnum);
printf("书名:%s\n",L.elem[i].Bname);
printf("价格:%.2f\n",L.elem[i].price);
}
//按书名查找
void SearchName(SqList L,char Bname[])
{
int i;
for(i=0;i<L.length;i++)
{
if(!strcmp(Bname,L.elem[i].Bname))
break;
}
printf("编号:%s\n",L.elem[i].Bnum);
printf("书名:%s\n",L.elem[i].Bname);
printf("价格:%.2f\n",L.elem[i].price);
}
//按位置查找
void SearchLocation(SqList L,int location)
{
if(location<1||location>L.length)
printf("error!\n");
printf("编号:%s\n",L.elem[location-1].Bnum);
printf("书名:%s\n",L.elem[location-1].Bname);
printf("价格:%.2f\n",L.elem[location-1].price);
}
6.打印书籍信息
//打印输出
void PrintList(SqList L)
{
int i;
if(L.length==0)
return ;
for(i=0;i<L.length;i++)
{
printf("编号:%s\n",L.elem[i].Bnum);
printf("书名:%s\n",L.elem[i].Bname);
printf("价格:%.2f\n",L.elem[i].price);
}
}
7.主函数
界面就直接printf出来,任何选择的操作利用while循环配合switch语句实现。
配合实例理解会更深,更容易掌握知识。
int main()
{
int size,i,N;
int choice,location;
char num[20];
char name[20];
Book *e=(Book*)malloc(sizeof(Book));
SqList L;
printf("\t\t--------欢迎使用图书管理系统(线性表顺序存储版)------- \n");
printf("\t\t| 1.创建图书线性表 |\n");
printf("\t\t| 2.录入书籍信息 |\n");
printf("\t\t| 3.插入书籍信息 |\n");
printf("\t\t| 4.按编号查找 |\n");
printf("\t\t| 5.按书名查找 |\n");
printf("\t\t| 6.按位置查找 |\n");
printf("\t\t| 7.删除书籍信息 |\n");
printf("\t\t| 8.修改书籍信息 |\n");
printf("\t\t| 9.打印书籍信息 |\n");
printf("\t\t| 10.求表长度 |\n");
printf("\t\t| 0.退出系统 |\n");
printf("\t\t------------------------------------------------------\n");
while(1)
{
printf("请选择操作:");
scanf("%d",&choice);
getchar();
switch (choice)
{
case 0: exit(0);
break;
case 1: printf("请输入线性表的大小:");
scanf("%d",&size);
getchar();
InitList(&L,size);
if(L.elem)
printf("初始化完成\n");
break;
case 2: printf("请输入录入数量:");
scanf("%d",&N);
getchar();
for(i=0;i<N;i++)
{
InputList(&L.elem[i]);
L.length++;
}
break;
case 3: printf("请输入插入到第i个位置:");
scanf("%d",&i);
getchar();
printf("请输入图书编号:");
scanf("%s",e->Bnum);
getchar();
printf("请输入图书名称:");
scanf("%s",e->Bname);
getchar();
printf("请输入图书价格:");
scanf("%f",&(e->price));
getchar();
InsertList(&L,e,i);
break;
case 4: printf("请输入要查找的编号:");
scanf("%s",num);
getchar();
SearchNum(L,num);
break;
case 5: printf("请输入要查找的书名:");
scanf("%s",name);
getchar();
SearchName(L,name);
break;
case 6: printf("请输入要查找的位置是第几个:");
scanf("%d",&location);
getchar();
SearchLocation(L,location);
break;
case 7: printf("请输入删除第几个书籍信息:");
scanf("%d",&i);
getchar();
DeleteList(&L,i);
break;
case 8: printf("请输入要修改的书籍编号:");
scanf("%s",num);
getchar();
Update(&L,num);
break;
case 9: PrintList(L);
break;
case 10:printf("表长为:%d\n",L.length);
}
}
getchar();
return 0;
}
比起链式存储结构,顺序存储结构查找修改比较方便,但是由于内存空间是预先分配的,容易导致资源利用率低、内存空间的浪费,而且插入和删除操作不方便。
本人也是第一次发表文章,必然存在不足之处,请大佬们指点。
本文仅供参考,不值得照搬。