Lansional 2022-12-07 14:22 采纳率: 91.5%
浏览 51
已结题

建立一个链表,每个结点包括……,输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,将此结点删去

问题遇到的现象和发生背景

建立一个链表,每个结点包括……,输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,将此结点删去
还有一个年龄19没删掉,循环执行到尾结点的前驱结点循环就终止了,怎么解决?

用代码块功能插入代码,请勿粘贴截图
#pragma warning(disable : 4996) 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN (sizeof(struct Student))


typedef struct Student
{
    long num;
    char name[20];
    char sex[10];
    int age;
    struct Student* next;
}student;


int main()
{
    student* creat(int n);
    student* del(student * head, int a_ge);
    void print(student * head);
    void fr(student * head);
    student* head;
    int n, age;
    printf("please enter the number of students:");
    scanf("%d", &n);
    head = creat(n);

    printf("please enter an age:");
    scanf("%d", &age);
    printf("\n");
    del(head, age);
    printf("modified student data:\n");
    print(head);
    fr(head);
    return 0;
}

student* creat(int n)
{
    int i;
    student* head, * node, * end;   //头结点, 普通结点, 尾指针
    head = (student*)malloc(LEN);
    if (head == NULL)
    {
        printf("out of memory, the request failed!\n");
        exit(-1);
    }
    memset(head, 0, LEN);
    end = head;    //尾指针指向头结点,空表
    printf("please enter the student number, name, gender, age :\n");
    for (i = 0; i < n; i++)
    {
        node = (student*)malloc(LEN);
        if (node == NULL)
        {
            printf("out of memory, the request failed!\n");
            exit(-1);
        }
        memset(node, 0, LEN);
        end->next = node;
        end = node;
        scanf("%ld %s %s %d", &node->num, node->name, node->sex, &node->age);
        printf("\n");
    }
    return head;
}



student* del(student* head, int a_ge)
{
    student* p;  
    student* pt;  //中间变量
    for (p = head; p->next != NULL; p = p->next)   //p开始指向头结点,循环结束条件:当p指向尾结点的前驱结点
    {
        if (p->next->age == a_ge)     //若p的后驱结点等于输入的数值
        {
            pt = p->next;       
            p->next = pt->next;    //删除满足条件的结点
            free(pt);
            pt = NULL;
        }
    }
    return head;
}


void print(student* head)
{
    student* p;
    for (p = head->next; p != NULL; p = p->next)
    {
        printf("%ld\t%s\t%s\t%d\n", p->num, p->name, p->sex, p->age);
    }
}



void fr(student* head)
{
    student* p;
    for (p = head; p != NULL;)
    {
        p = p->next;
        free(p);
        p = NULL;
    }
}

运行结果及报错内容
please enter the number of students:4
please enter the student number, name, gender, age :
101 Ma m 20

102 Li f 23

103 Zhang m 19

104 Wang m 19

please enter an age:19

modified student data:
101     Ma      m       20
102     Li      f       23
104     Wang    m       19

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-12-07 15:11
    关注

    修改如下,供参考:

    #pragma warning(disable : 4996) 
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define LEN (sizeof(struct Student))
    typedef struct Student
    {
        long num;
        char name[20];
        char sex[10];
        int  age;
        struct Student* next;
    }student;
    int main()
    {
        student* creat(int n);
        student* del(student * head, int a_ge);
        void print(student * head);
        void fr(student * head);
        student* head;
        int n, age;
        printf("please enter the number of students:");
        scanf("%d", &n);
        head = creat(n);
        printf("please enter an age:");
        scanf("%d", &age);
        printf("\n");
        del(head, age);
        printf("modified student data:\n");
        print(head);
        fr(head);
        return 0;
    }
    student* creat(int n)
    {
        int i;
        student* head, * node, * end;   //头结点, 普通结点, 尾指针
        head = (student*)malloc(LEN);
        if (head == NULL)
        {
            printf("out of memory, the request failed!\n");
            exit(-1);
        }
        memset(head, 0, LEN);
        end = head;    //尾指针指向头结点,空表
        printf("please enter the student number, name, gender, age :\n");
        for (i = 0; i < n; i++)
        {
            node = (student*)malloc(LEN);
            if (node == NULL)
            {
                printf("out of memory, the request failed!\n");
                exit(-1);
            }
            memset(node, 0, LEN);
            end->next = node;
            end = node;
            scanf("%ld %s %s %d", &node->num, node->name, node->sex, &node->age);
            printf("\n");
        }
        return head;
    }
    student* del(student* head, int a_ge)
    {
        student* p;
        student* pt;  //中间变量
        for (p = head; p->next != NULL; )// p = p->next)   修改
        {
            if (p->next->age == a_ge)     //若p的后驱结点等于输入的数值
            {
                pt = p->next;
                p->next = pt->next;    //删除满足条件的结点
                free(pt);
                pt = NULL;
            }
            else                  //修改
                p = p->next;      //修改
        }
        return head;
    }
    void print(student* head)
    {
        student* p;
        for (p = head->next; p != NULL; p = p->next)
        {
            printf("%ld\t%s\t%s\t%d\n", p->num, p->name, p->sex, p->age);
        }
    }
    void fr(student* head)
    {
        student* p;
        for (; head != NULL;)  //for(p = head; p != NULL;) 修改
        {
            p = head;
            head = head->next;  //p = p->next; 修改
            free(p);
            p = NULL;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算