SIJ2005 2023-12-16 10:05 采纳率: 50%
浏览 3
已结题

C语言问题,有错误,但不知如何解决,请求解答

C语言相关问题
遇到的问题:输入所删掉对应作者后,不能输出。
题目:建立一个链表,每个结点包括:书号、书名、作者、出版社、价格、出版时间。输入一个作者,如果链表中结点所包含的作者等于此作者,则将此结点删去。
代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>
struct author
{
    char num[20];
    char name[20];
    char auth[20];
    char public[20];
    float price;
    char time[20];
    struct author* next;
}auth[10];
int main()
{
    struct author* p, * pt, * head;
    p = NULL;
    head = NULL;
    pt = NULL;
    int i, length, flag = 1;
    char iauth[20] = NULL;
    int find = 0;
    while (flag == 1)
    {
        printf("input length of list(<10)\n");
        scanf("%d", &length);
        if (length < 10)
        {
            flag = 0;
        }
    }
    for (i = 0; i < length; i++)
    {
        p = (struct author*)malloc(sizeof(struct author));
        if (i == 0)
            head = pt = p;
        else
            pt->next = p;
        pt = p;
        printf("num.");
        scanf("%s", p->num);
        printf("name:");
        scanf("%s", p->name);
        printf("author:");
        scanf("%s", p->auth);
        printf("public:");
        scanf("%s", p->public);
        printf("price:");
        scanf("%f", &p->price);
        printf("time:");
        scanf("%s", &p->time);
    }
    p->next = NULL;
    p = head;
    printf("\n num. name author public price time\n");
    while (p != NULL)
    {
        printf("%4s%8s%6s%6s%6f%6s\n", p->num, p->name, p->auth, p->public, p->price, p->time);
        p = p->next;
    }
    printf("input author:");
    scanf("%s", iauth);
    pt = head;
    p = pt;
    if (strcmp(pt->auth, iauth))
    {
        p = pt->next;
        head = pt = p;
        find = 1;
    }
    else
        pt = pt->next;
    while (pt != NULL)
    {
        if (strcmp(pt->auth, iauth))
        {
            p->next = pt->next;
            find = 1;
        }
        else
        {
            p = pt;
            pt = pt->next;
        }
    }
    if (!find)
    {
        printf("not found %s", iauth);
    }
    p = head;
    printf("\nnum name author public price time\n");
    while (p != NULL)
    {
        printf("%4s%8s%6s%6s%6f%6s", p->num, p->name, p->auth, p->public, p->price, p->time);
        p = p->next;
    }
    return 0;
}

  • 写回答

1条回答 默认 最新

  • 七待 The 2023-12-16 10:14
    关注

    删除头节点需要特殊处理,因为它没有前一个节点。
    使用strcmp函数时,当两个字符串相等时,该函数返回0。您的代码中对stremp的使用是错误的。
    初始化字符数组时不应该使用NULL。如果您需要初始化为空字符串,应该使用""。
    scanf("%s",&p->time)中的&是不需要的,因为数组名已经是一个地址。
    以下是修改后的代码

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    struct author {
        char num[20];
        char name[20];
        char auth[20];
        char public[20];
        float price;
        char time[20];
        struct author* next;
    };
    
    int main() {
        struct author *p, *pt, *head, *prev;
        head = NULL;
        int length, flag = 1;
        char iauth[20] = ""; // 初始化为空字符串
        int find = 0;
    
        // 输入链表长度
        while (flag == 1) {
            printf("input length of list(<10)\n");
            scanf("%d", &length);
            if (length < 10) {
                flag = 0;
            }
        }
    
        // 创建链表
        for (int i = 0; i < length; i++) {
            p = (struct author*)malloc(sizeof(struct author));
            if (i == 0)
                head = p;
            else
                pt->next = p;
            pt = p;
    
            printf("num: ");
            scanf("%s", p->num);
            printf("name: ");
            scanf("%s", p->name);
            printf("author: ");
            scanf("%s", p->auth);
            printf("public: ");
            scanf("%s", p->public);
            printf("price: ");
            scanf("%f", &p->price);
            printf("time: ");
            scanf("%s", p->time);
            p->next = NULL;
        }
    
        // 显示链表
        printf("\n num. name author public price time\n");
        for (p = head; p != NULL; p = p->next) {
            printf("%4s %8s %6s %6s %6.2f %6s\n", p->num, p->name, p->auth, p->public, p->price, p->time);
        }
    
        // 删除特定作者的节点
        printf("input author:");
        scanf("%s", iauth);
    
        pt = head;
        prev = NULL;
        while (pt != NULL) {
            if (strcmp(pt->auth, iauth) == 0) { // 当找到匹配的作者时
                if (pt == head) { // 特殊处理头节点
                    head = pt->next;
                } else {
                    prev->next = pt->next;
                }
                free(pt);
                find = 1;
                if (prev != NULL) { // 如果不是删除的头节点
                    pt = prev->next;
                } else { // 如果删除的是头节点
                    pt = head;
                }
            } else {
                prev = pt;
                pt = pt->next;
            }
        }
    
        if (!find) {
            printf("not found %s\n", iauth);
        }
    
        // 显示删除后的链表
        printf("\nnum name author public price time\n");
        for (p = head; p != NULL; p = p->next) {
            printf("%4s %8s %6s %6s %6.2f %6s\n", p->num, p->name, p->auth, p->public, p->price, p->time);
        }
    
        // 清理链表
        p = head;
        while (p != NULL) {
            struct author* temp = p;
            p = p->next;
            free(temp);
        }
    
        return 0;
    }
    
    
    

    这个程序还包含了清理链表的代码,以释放分配的内存......

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月24日
  • 已采纳回答 12月16日
  • 创建了问题 12月16日

悬赏问题

  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?
  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip