标题:在删除数组的一个结构后怎么内容改变了是什么原因?
只看楼主
堕落之地
Rank: 1
等 级:新手上路
帖 子:57
专家分:5
注 册:2019-3-11
结帖率:100%
已结贴  问题点数:10 回复次数:4 
在删除数组的一个结构后怎么内容改变了是什么原因?

#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct {
    char no[8];   //8位学号
    char name[20]; //姓名
    int price;     //成绩
}Student;
Student *le=NULL;
typedef  struct {
  Student  *elem;     //指向数据元素的基地址
  int  length;       //线性表的长度                                                   
 }SqList;
 typedef struct {
   
 };
int main(){
    int a,i,n,c;
    static int x;   
    //Student *new;
    printf("\n********************************\n\n");
    puts("1. 构造顺序表");
    puts("2. 录入学生信息");
    puts("3. 显示学生信息");
    puts("4. 输入姓名,查找该学生");
    puts("5. 显示某位置该学生信息");
    puts("6. 在指定位置插入学生信息");
    puts("7. 在指定位置删除学生信息");
    puts("8. 统计学生个数");
    puts("0. 退出");
    printf("\n********************************\n\n");
    while(1){
        printf("请输入选项:");
        scanf("%d",&a);
        switch(a){
        case 1://创建顺序表
            printf("请输入学生总人数:");
            scanf("%d",&x);
            le=(Student *)malloc(sizeof(Student)*x);//Student *le[MAX]=(Student *)malloc(sizeof(Student)*x);不能用?
            if(le!=NULL)//Student *le=(Student *)malloc(sizeof(Student)*x);不能用仅在这个大括号中有用。在别的大括号不能用
            printf("创建顺序表完毕\n");
            else printf("创建失败\n");
            break;
      
        case 2:{
            printf("请输入学生信息:");
            for(i=0;i<x;i++){
                    printf("请输入第%d输入姓名:",i+1);
                if(le!=NULL)
                scanf("%s",(le+i)->name);
                printf("请输入第%d输入学号:",i+1);
                scanf("%s",(le+i)->no);
                printf("请输入第%d输入分数:",i+1);
                scanf("%d",&(le+i)->price);
                printf("第%d个输入完毕\n",i+1);
            }
            break;
            }
        case 3:{
            for(i=0;i<x;i++){
            printf("姓名:%s 学号:%s 成绩:%d\n",(*(le+i)).name,(*(le+i)).no,(*(le+i)).price);
            }
            printf("显示完毕\n");
            break;
           
        }
        case 4:{
            char str[MAX];
            int flag=1;
            printf("输入姓名查找信息:");
            scanf("%s",str);
           
                if(flag<x+1){
                flag++;
                for(i=0;i<x;i++)
                    if(strcmp(str,(le+i)->name)==0){
                        printf("姓名:%s 学号:%s 成绩:%d\n",(*(le+i)).name,(*(le+i)).no,(*(le+i)).price);
                        break;   
                        }
                    }else printf("没有这个学生的信息\n");
                }break;
           
        case 5:{
            printf("请输入想要查找的位置:");
            //scanf("%d",&i);
            while(1){
                scanf("%d",&i);
                if(i>0 && i<x+1){
                printf("姓名:%s 学号:%s 成绩:%d\n",(*(le+i-1)).name,(*(le+i-1)).no,(*(le+i-1)).price);
                break;
                }
                else
                    printf("你输入的位置不正确输入范围在[1——%d],请重新输入:",x);      
            }break;
        }
        case 6:{
            printf("请输入想要插入的位置:");
            scanf("%d",&c);
            x++;
            a=x;
            le=realloc(le,sizeof(Student)*x);
            if(c>0 && c<x){
                for(a=a-1;a>c-1;a--){
                    strcpy((*(le+a)).name,(*(le+a-1)).name);
                    strcpy((*(le+a)).no,(*(le+a-1)).no);
                    strcpy(&((le+a)->price),&((le+a-1)->price));   
                }
                printf("请输入姓名:");
                scanf("%s",(*(le+c-1)).name);
                printf("请输入学号:");
                scanf("%s",(*(le+c-1)).no);
                printf("请输入分数:");
                scanf("%d",&(*(le+c-1)).price);
                printf("输入完毕\n");
            }
            else
                printf("输入数值非法\n");
                break;
        }
        case 7:{
            printf("请输入想要删除的位置:");
            scanf("%d",&c);
            a=x;
            x--;
            le=realloc(le,sizeof(Student)*x);
            if(c>0 && c<a){
                for(c=c-1;c<a-1;c++){
                strcpy((le+c)->name,(le+c+1)->name);
                strcpy((le+c)->no,(le+c+1)->no);
                strcpy(&(le+c)->price,&(le+c+1)->price);
                }
                printf("删除完毕\n");break;
            }else
                printf("输入位置非法\n");
                break;
        }
        case 8:{
            printf("总共有:%d个学生\n",x);break;
        }
        case 0:{free(le);
            printf("你已成功退出\n");
            exit(0);
        }
        default:
            if(le!=NULL)
                free(le);
            printf("输入非法导致退出!\n");exit(0);}}}
删除后一个数组成员时在再显示内容变了,这是什么原因?
搜索更多相关主题的帖子: name Student printf 输入 scanf 
2019-03-22 22:46
ZJYTY
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:92
专家分:700
注 册:2018-12-20
得分:10 
程序代码:
case 7:{
                       printf("请输入想要删除的位置:");
                       scanf("%d",&c);
                       a=x;
                       le=realloc(le,sizeof(Student)*x);
                       x--;
                       if(c>0 && c<a){
                           for(c=c-1;c<a-1;c++){
                               (le+c)->price = (le+c+1)->price;
                               strcpy((le+c)->name,(le+c+1)->name);
                               strcpy((le+c)->no,(le+c+1)->no);
                               //strcpy(&(le+c)->price,&(le+c+1)->price);
                           }
                           printf("删除完毕\n");break;
                       }else
                           printf("输入位置非法\n");
                       break;
                   }

原代码在重新申请空间的时候大小不够

-------------------------------若有不当之处,敬请谅解-------------------------------
2019-03-23 10:11
堕落之地
Rank: 1
等 级:新手上路
帖 子:57
专家分:5
注 册:2019-3-11
得分:0 
回复 2楼 ZJYTY
用realloc函数不增大只减小大小时会减低原来的储存精度?
2019-03-23 13:24
ZJYTY
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:92
专家分:700
注 册:2018-12-20
得分:0 
回复 3楼 堕落之地
不明白你说的储存精度是什么

-------------------------------若有不当之处,敬请谅解-------------------------------
2019-03-23 15:32
堕落之地
Rank: 1
等 级:新手上路
帖 子:57
专家分:5
注 册:2019-3-11
得分:0 
回复 4楼 ZJYTY
就是realloc函数返回的指针变小了,所以要丢掉一部分数据
2019-03-23 16:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-493734-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.297451 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved