Yester07 2022-03-18 16:59 采纳率: 48.5%
浏览 23
已结题

顺序表的delete函数写错了,希望有人能指正一下


#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "windows.h"
#include "stdlib.h"
#include "string.h"
#define status int;
#define MAXSIZE 20//顺序表最大长度

/*定义顺序表*/
typedef struct
{
    int sno[MAXSIZE];
    char name[MAXSIZE][10];
    char gender[MAXSIZE];
    int score[MAXSIZE];
    int length;
}sqlist;

/*初始化顺序表*/
void initlist(sqlist* l)
{
    l->length = 0;
    printf("initialization succeeded\n");
}


void creatlist(sqlist* l, int a[],char b[][10], char c[], int d[], int n)
{
    if (n > MAXSIZE)
    {
        printf("room is not enough\n");
        exit(0);
    }
    for (int k = 0; k < n; k++)
    {
        l->sno[k] = a[k];
        strcpy(l->name[k] , b[k]);
        l->gender[k] = c[k];
        l->score[k] = d[k];
    }
    l->length = n;
    printf("linear list is created successfully\n");
}

void list_insert(sqlist* l, int pos, int sno, char name[], char gender, int score)
{
    if (pos > l->length || pos < 1)
    {
        printf("over_range\n");
        exit(0);
    }
    if (l->length + pos > MAXSIZE)
    {
        printf("room is not enouth\n");
        exit(0);
    }
    for (int i = l->length - 1; i >= pos-1; i--)
    {
        l->sno[i + 1] = l->sno[i];
        strcpy(l->name[i + 1],l->name[i]);
        l->gender[i + 1] = l->gender[i];
        l->score[i + 1] = l->score[i];
    }
    l->sno[pos-1] = sno;
    strcpy(l->name[pos - 1], name);
    l->gender[pos-1] = gender;
    l->score[pos-1] = score;
    l->length++;
    printf("insert successfully\n");
}

void list_findfail(sqlist *l)
{
    int cnt=0;
    if (l)
    {
        for (int i = 0; i < l->length; i++)
        {
            if (l->score[i] < 60)
                cnt++;
        }
    }
    printf("total number of failed students is %d\n", cnt);
}

void list_delete(sqlist* l, int pos)
{
    if (l)
    {
        if (pos<1 || pos>l->length)
        {
            printf("range_error\n");
            exit(0);
        }
        for (int i = pos - 1; i < l->length; i++)
        {
            l->sno[i] = l->sno[i + 1];
            strcpy(l->name[i], l->name[i + 1]);
            l->gender[i] = l->gender[i + 1];
            l->score[i] = l->score[i + 1];
        }
        l->length--;
        printf("delete successfully\n");
    }
}

void list_deletefail(sqlist* l)
{
        for (int i = 0; i < l->length; i++)
        {
            if (l->score[i] < 60)
             list_delete(l, i + 1);
        }
        printf("delete successfully\n");
}

void list_print(sqlist* l)
{
    int i = 0;
    if (l)
    {
        printf("Sno\tName\t\tGender\tScore\n");
        for (; i < l->length; i++)
        {
            printf("%d\t%s\t%c\t%d\n", l->sno[i], l->name[i], l->gender[i], l->score[i]);
        }
    }
}

int main()
{
    int menu;
    sqlist l;
    int sno[5] = { 1001,1002,1004,1005,1006 }, score[5] = { 88,66,90,77,24 };
    char name[5][10] = { "ChenChen","WangGang","ShangFang","ChengPing","WangPing" }, gender[5] = { 'M','M','F','F','M' };
    exe:
    printf("MENU:\n1.初始化空表\t2.创建循序表\t3.打印循序表\n4.插入李明\t5.删除\t6.统计不及格人数\n7.删除不及格学生信息\t8.退出\n");
    printf("please input your command:\n");
    scanf("%d", &menu);
    if (menu == 1)
    {
        initlist(&l);
        printf("\n\n\n");
        goto exe;
    }
    if (menu == 2)
    {
        creatlist(&l, sno, name, gender, score, 5);
        printf("\n\n\n");
        goto exe;
    }
    if (menu == 3)
    {
        list_print(&l);
        printf("\n\n\n");
        goto exe;
    }
    if (menu == 4)
    {
        list_insert(&l, 3, 1003, "LiMing", 'M', 42);
        printf("\n\n\n");
        goto exe;
    }
    if (menu == 5)
    {
        int POS;
        printf("please input the position number:\n");
        scanf("%d", &POS);
        list_delete(&l, POS);
        printf("\n\n\n");
        goto exe;
    }
    if (menu == 6)
    {
        list_findfail(&l);
        printf("\n\n\n");
        goto exe;
    }
    if (menu == 7)
    {
        list_deletefail(&l);
        printf("\n\n\n");
        goto exe;
    }
    if (menu == 8)
    {
        goto exit;
    }
    exit:
    return 0;
}

这个是删除之前的表

img

这个是删除之后的表,那个性别变成了?,这是为什么呢?

img

求解决,我觉得应该是delete函数出现问题了。

  • 写回答

1条回答 默认 最新

  • 浪客 2022-03-18 17:34
    关注

    for (int i = pos - 1; i < l->length -1 ; i++)

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

报告相同问题?

问题事件

  • 系统已结题 3月26日
  • 已采纳回答 3月18日
  • 创建了问题 3月18日

悬赏问题

  • ¥100 关于#VijeoCitect#的问题,如何解决?(标签-ar|关键词-数据类型)
  • ¥30 数字信号处理实验报告
  • ¥15 一个矿井排水监控系统的plc梯形图,求各程序段都是什么意思
  • ¥15 ensp路由器启动不了一直报#
  • ¥50 安卓10如何在没有root权限的情况下设置开机自动启动指定app?
  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了
  • ¥15 数学建模数学建模需要
  • ¥15 已知许多点位,想通过高斯分布来随机选择固定数量的点位怎么改