请问这个顺序表写的图书信息管理系统怎么修改,目前调试出来问题在insert
//////////////////////////////////////////////////////////////////////////
//(1)编译预处理命令
#include "stdio.h"
#include "stdlib.h"//分配内存
#include "conio.h"
#include "string.h"
//////////////////////////////////////////////////////////////////////////
//(2)自定义数据类型(typedef)
//先定义图书数据的数据类型
typedef struct {
int no;//number
char name[32];//name
float price;//price
}STD;
//再定义顺序表数据类型:
typedef struct {
STD *data; //data是一个指向STD类型的指针变量
int listSize;//表容量
int length;//实际数据个数
}SQList;
//////////////////////////////////////////////////////////////////////////
//(3)各个函数的声明
int menu();
int initSqList(SQList *L,int max);//初始化
int dispSqList(SQList L);
int insertSqList(SQList *L, int i, STD x);
int deleteSqList(SQList *L, int i, STD *x);
int locateSqList(SQList L, STD x);
int updateSqList(SQList L, int i, STD x);
int createSqList(SQList *L,int max,STD x);
//////////////////////////////////////////////////////////////////////////
//(4)主函数的定义
int main()
{
int t=1,n, maxSize;// float fs=.0f;有时候不做这个浮点初始化操作程序会报错
SQList L;STD s;
while(t){
n=menu( );//显示主菜单
switch(n){
//初始化图书数据
case 1:
printf("请输入需要创建的图书数量:");
scanf("%d",&maxSize);
initSqList(&L, maxSize);
break;
//插入图书数据
case 2:
printf("请输入需要插入图书的编号、书名、价格,用空格隔开:\n");
scanf("%d%s%f",&s.no,s.name, &s.price);
int pos;
printf("请输入插入位置:\n");
scanf("%d",&pos);
insertSqList(&L,pos,s);
break;
//删除图书数据
case 3:
printf("请输入删除图书书名:\n");
scanf("%s",s.name);
pos=locateSqList(L,s);
if(pos==L.length+1)
printf("不存在该图书数据\n");
else
{
deleteSqList(&L, pos, &s);
printf("删除的图书数据为:%d %10s %7.2f\n", s.no,s.name, s.price);
}
break;
//显示图书数据
case 4:
dispSqList(L);
break;
//更新图书数据
case 5:
printf("请输入需要修改的图书编号、名称、价格,用空格隔开:\n");
scanf("%d%s%f",&s.no,s.name,&s.price);
n=locateSqList(L,s);
updateSqList(L,n,s);
break;
case 6:
createSqList(&L,maxSize,s);
break;
//退出
case 0:
t = 0;
break;
//错误处理
default:
printf("输入有误!\n");
}
}
}
//////////////////////////////////////////////////////////////////////////
//(5)各个函数的定义
int menu(){
int n;
//system("cls");//清屏
printf("****welcome to book management system****\n");
printf(" 1、initialize 2、insert\n");
printf(" 3、delete 4、display\n");
printf(" 5、update 6、create\n");
printf(" 7、exit\n");
printf("*****************************************\n");
printf("choose function(0-6):");
scanf("%d",&n);
return n;
}
//初始化操作:1.分配内存 2.给结构体变量赋值(length,listsize)
int initSqList(SQList *L,int max){
L->data=(STD*)malloc(max*sizeof(STD));
if(L->data=NULL){
printf("申请内存失败!");
exit(0);
}
L->listSize=max;
L->length=0;
return 1;
}
int dispSqList(SQList L){
if(L.data=0){
printf("没有信息!");
}
printf("编号 书名 价格\n ");
printf("%d",L.length);
for(int i=0;iprintf("%d %s %f\n",L.data[i].no,L.data[i].name,L.data[i].price);
}
return 1;
}
int insertSqList(SQList *L, int i, STD x){
if(i<1){
printf("1error");
return 0;
}
if(L->length>=L->listSize){
printf("2error");
return 0;
}
if(L->length=0){
L->data[L->length]=x;
++L->length;
return 1;
}
printf("%d",L->length);
/*else {
for(int k=L->length;k>=i-1;k--){
L->data[k+1]=L->data[k];
}
L->data[i-1]=x;
++L->length;
return 1;
}*/
}
int deleteSqList(SQList *L, int i, STD *x){
if(i<1||i>L->length)return 0;
if(L->listSize>=L->length)return 0;
*x=L->data[i-1];
for(int k=i-1;klength;k++){
L->data[k]=L->data[k+1];
}
L->length=L->length-1;
return 1;
}
int locateSqList(SQList L, STD x){
if(L.length==0)return 0;
for(int i=0;i1;i++){
if(strcmp(L.data[i].name,x.name)==0&&L.data[i].no==x.no&&L.data[i].price==x.price)return i+1;
}
}
int updateSqList(SQList L, int i, STD x){
if(i<1||i>L.length-1)return 0;
if(L.length==0)return 0;
L.data[i-1]=x;
return 1;
}
int createSqList(SQList *L,int maxSize,STD x){
int n=0;
char c;
initSqList(L, maxSize);
for(int i=0;iprintf("input %d\n",i+1);
scanf("%d%s%f",&x.no,x.name,&x.price);
getchar();
insertSqList(L,++i,x);
}
return 1;
}
修改完善如下,供参考:
//////////////////////////////////////////////////////////////////////////
//(1)编译预处理命令
#include "stdio.h"
#include "stdlib.h"//分配内存
#include "conio.h"
#include "string.h"
#define MaxSize 100 // 修改
//////////////////////////////////////////////////////////////////////////
//(2)自定义数据类型(typedef)
//先定义图书数据的数据类型
typedef struct {
int no;//number
char name[32];//name
float price;//price
}STD;
//再定义顺序表数据类型:
typedef struct {
STD *data; //data是一个指向STD类型的指针变量
int listSize;//表容量
int length;//实际数据个数
}SQList;
//////////////////////////////////////////////////////////////////////////
//(3)各个函数的声明
int menu();
int initSqList(SQList *L);//初始化 int initSqList(SQList *L,int max); 修改
int dispSqList(SQList L);
int insertSqList(SQList *L, int i, STD x);
int deleteSqList(SQList *L, int i);
int locateSqList(SQList L, STD x);
int updateSqList(SQList L, int i, STD x);
int createSqList(SQList *L);//int createSqList(SQList *L,int max,STD x); 修改
//////////////////////////////////////////////////////////////////////////
//(4)主函数的定义
int main()
{
int t=1,n, maxSize;// float fs=.0f;有时候不做这个浮点初始化操作程序会报错
SQList L; STD s;
initSqList(&L); //修改 初始化图书数据表
while(t){
n=menu( );//显示主菜单
switch(n){
case 1:
createSqList(&L); //修改
break;
//插入图书数据
case 2:
printf("请输入需要插入图书的编号、书名、价格,用空格隔开:\n");
scanf("%d%s%f",&s.no,s.name, &s.price);
int pos;
printf("请输入插入位置:\n");
scanf("%d",&pos);
insertSqList(&L,pos,s);
break;
//删除图书数据
case 3:
printf("请输入删除图书书名:\n");
scanf("%s",s.name);
s.no = -1;
pos=locateSqList(L,s);
if(pos == -1) //if(pos==L.length+1)
printf("不存在该图书数据\n");
else
{
printf("删除的图书数据为:%d %10s %7.2f\n",
L.data[pos].no,L.data[pos].name,L.data[pos].price);
deleteSqList(&L, pos);
}
break;
//显示图书数据
case 4:
dispSqList(L);
break;
//更新图书数据
case 5:
do{
printf("请输入需要修改的图书 1.编号 或 2.名称\n");
scanf("%d", &maxSize);
switch(maxSize){
case 1:
printf("请输入编号:");
scanf("%d", &s.no);
strcpy(s.name,"\0");
break;
case 2:
printf("请输入书名:");
scanf("%s", s.name);
s.no = -1;
break;
default: break;
}
}while (maxSize != 1 && maxSize != 2);
n=locateSqList(L,s);
if (n == -1)
printf("不存在该图书\n");
else{
printf("请输入新的图书编号 名称 价格\n");
scanf("%d%s%f",&s.no,s.name,&s.price);
updateSqList(L,n,s);
}
break;
//退出
case 6:
t = 0;
break;
//错误处理
default:
printf("输入有误!\n");
}
}
}
//////////////////////////////////////////////////////////////////////////
//(5)各个函数的定义
int menu(){
int n;
//system("cls");//清屏
printf("****welcome to book management system****\n");
printf(" 1、create 2、insert\n"); //修改
printf(" 3、delete 4、display\n");
printf(" 5、update 6、exit\n"); //修改
//printf(" 7、exit\n"); //修改
printf("*****************************************\n");
printf("choose function(1-6):");
scanf("%d",&n);
return n;
}
//初始化操作:1.分配内存 2.给结构体变量赋值(length,listsize)
int initSqList(SQList *L){
L->data=(STD*)malloc(MaxSize*sizeof(STD));
if(L->data == NULL){ //if(L->data=NULL) 修改
printf("申请内存失败!");
exit(0);
}
L->listSize=MaxSize; // 修改
L->length=0;
return 1;
}
int dispSqList(SQList L){
if(L.length == 0){ //if(L.data=0) 修改
printf("没有信息!");
return 0; //修改
}
printf("编号 书名 价格\n ");
printf("%d\n",L.length);
for(int i=0;i<L.length;i++){
printf("%d %s %f\n",L.data[i].no,L.data[i].name,L.data[i].price);
}
return 1;
}
int insertSqList(SQList *L, int i, STD x){
if(i < 1 || i > L->length + 1){
printf("1error\n");
return 0;
}
if(L->length>=L->listSize){
printf("2error\n");
return -1;
}
for(int k=L->length;k > i-1;k--)
L->data[k]=L->data[k-1];
L->data[i-1]=x;
++L->length;
return 1;
}
int deleteSqList(SQList *L, int i){
for(int k = i;k < L->length - 1;k++){
L->data[k]=L->data[k+1];
}
L->length--;
return 1;
}
int locateSqList(SQList L, STD x){
int i;
if(L.length == 0)
return -1; //return 0;
for(i=0;i<L.length;i++){
if(strcmp(L.data[i].name,x.name)==0||L.data[i].no==x.no)
//if(strcmp(L.data[i].name,x.name)==0&&L.data[i].no==x.no&&L.data[i].price==x.price)
return i; //i+1;
}
if (i >= L.length)
return -1;
}
int updateSqList(SQList L, int i, STD x){
L.data[i]=x;
return 1;
}
int createSqList(SQList *L){ //修改
int n = L->length, maxSize;
STD x;
if (L->length >= L->listSize){
printf("表已满!\n");
return 0;
}
else{
printf("请输入需要创建的图书数量:");
scanf("%d",&maxSize);
for(int i = n;i < n + maxSize;i++){
printf("input %d\n",i+1);
scanf("%d%s%f",&x.no,x.name,&x.price);
getchar();
if (insertSqList(L,i+1,x) == -1) {
printf("表已满!\n");
break;
}
}
}
return 1;
}
“Devil组”引证GPT后的撰写:
在函数insertSqList中有几个地方存在语法错误:
在第22行,应该使用比较运算符==来判断 L->length 是否等于0,而不是赋值运算符=。
在第23行,应该使用递增运算符++,而不是递减运算符--。
在第25行,应该使用花括号来包裹if语句体内的多个语句。