m0_73740280 2023-03-06 18:37 采纳率: 86.8%
浏览 11

请问这个链表实现的图书管理系统怎样修改

请问这个链表实现的图书管理系统需要怎样修改?

#include<stdio.h>
#include<stdlib.h>
typedef struct {
    int num;
    char name[20];
    float price;
}Book;
typedef struct Lnode {
    Book data;
    struct Lnode* next;
}Node, * LinkList;
void menu();
int init(LinkList *L);
int insert(LinkList L, int i, Book b);
int del(LinkList *L, int i, Book b);
int search(LinkList L, int i,Book &b);
int update(LinkList &L, Book b);
void create(LinkList *L,int n);
int main() {
    LinkList L;
    Book b;
    int n,t=1,i;
    init(&L);
    void menu();
    while (t) {
        printf("请输入选项:\n");
        scanf("%d", &n);
        switch (n) {
        case 1:
            create(&L,n); break;
        case 2:
            insert(L,i,b); break;
        case 3:
            del(&L, i, b); break;
        case 4:
            search(L,i,b); break;
        case 5:
            update(L, b); break;
        case 0:
            t = 0;
            break;
        default:
            printf("wrong! choose again!");
        }
    }
}
void menu() {
    printf("        图书管理系统              \n");
    printf("1.创建            2.插入         \n");
    printf("3.删除            4.查找         \n");
    printf("4.修改            0.退出           \n");
    printf("只能选 (0-5)\n");

}
int init(LinkList *L) {
    (*L )= new Node;
    if ((*L )= NULL) {
        printf("创建失败!\n");
        return 0;
    }
    (*L)->next = NULL;
    return 1;
}
int insert(LinkList L,int i,Book b){
    LinkList p=L;
    Node s;
    int j=0;
    while(p&&j<i-1){
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)printf("插入位置有误\n");
    s=new Node;
    if(s=NULL)printf("插入失败\n");
    s->data=b;
    s->next=p->next;
    p->next=s;
    return 1;
}
int del(LinkList L,int i,Book b){
    LinkList p=L;
    int j=0;
    while(p&&j<i-1){
        p->next;
        ++j;
    }
    if(!p||!(p->next)||j>i-1)printf("删除失败\n");
    LinkList s=p->next;
    b=s->data;
    p->next=s->next;
    delete(s);
}
int search(LinkList L,int i,Book &b){
    LinkList p=L->next;
    int j=1;
    while(p&&j<i-1){
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)
    printf("查不到!\n");
    b=p->data;
    printf("编号 书名 价格 :\n");
    printf("%d %s %.2f",b.num,b.name,b.price);
    return 1;
}
void create(LinkList &L,int n){
    printf("请输入图书个数:\n");
    scanf("%d",&n);
    Node L=new Node;
    L->next=NULL;
    for(i=n;i>0;i--){
        Node p=new Node;
        printf("请输入第%d个图书编号、书名、价格\n",n+1-i);
        scanf(&p->data);
        p->next=L->next;
        L->next=p;
    }
}




  • 写回答

2条回答 默认 最新

  • 「已注销」 2023-03-06 18:47
    关注

    “Devil组”引证GPT后的撰写:

    • 创建函数create的参数应该改为一个整型n,表示要创建的图书个数,而不是用于循环的变量i。
    • 在创建函数create中,应该先新建一个头结点L,而不是使用之前的*L。创建一个新节点应该用Node p=new Node;而不是Node p。然后再将输入的图书信息存储在p->data中,并将其插入到链表中。
    • 在插入函数insert中,应该先检查插入的位置是否合法。插入函数的参数应该是LinkList L, int i, Book b,而不是LinkList L, int i, Node s。同时,应该使用new来为新建的节点s分配内存,即Node s = new Node;而不是Node s。
    • 在删除函数del中,应该先检查删除的位置是否合法。删除函数的参数应该是LinkList *L, int i, Book &b,而不是LinkList L, int i, Book b。在删除节点后,应该将指针s指向的节点释放掉,即delete(s);。
    • 在查找函数search中,应该先检查查找的位置是否合法。查找函数的参数应该是LinkList L, int i, Book &b,而不是LinkList L, int i, Node p。在找到目标节点后,应该将节点的数据保存到参数b中,而不是p->data。
    • 在主函数中,应该先调用menu函数来输出菜单。同时,在创建链表时应该调用init函数而不是直接在main函数中创建。
    评论

报告相同问题?

问题事件

  • 创建了问题 3月6日

悬赏问题

  • ¥15 微信小程序 用oss下载 aliyun-oss-sdk-6.18.0.min client报错
  • ¥15 ArcGIS批量裁剪
  • ¥15 labview程序设计
  • ¥15 为什么在配置Linux系统的时候执行脚本总是出现E: Failed to fetch http:L/cn.archive.ubuntu.com
  • ¥15 Cloudreve保存用户组存储空间大小时报错
  • ¥15 伪标签为什么不能作为弱监督语义分割的结果?
  • ¥15 编一个判断一个区间范围内的数字的个位数的立方和是否等于其本身的程序在输入第1组数据后卡住了(语言-c语言)
  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥15 抖音看过的视频,缓存在哪个文件