标题:程序的删除功能有问题,不知怎么改
只看楼主
听阳光洒下
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2013-11-10
结帖率:90.91%
已结贴  问题点数:10 回复次数:8 
程序的删除功能有问题,不知怎么改
#include<stdio.h>
#include<stdlib.h>
typedef struct student{
long no;
char name[20];
char sex[2];
int age;
}STUDENT;
#define MAXSIZE 100
STUDENT stu[MAXSIZE];
void create(STUDENT stu[],int n);
void output(STUDENT stu[],int n);
void search(STUDENT stu[],int n);
void insert(STUDENT stu[],int *pn);
void del(STUDENT stu[],int *pn);
int main()
{int n;
STUDENT stu[MAXSIZE];
int cord;
printf("\n请输入学生记录个数n=");
scanf("%d",&n);
create(stu,n);
while(1)
{printf("\n----------学生信息管理主菜单----------\n");
printf("\t1.显示学生信息\n");
printf("\t2.查找学生信息\n");
printf("\t3.插入学生信息\n");
printf("\t4.删除学生信息\n");
printf("\t5.退出\n\n");
printf("\t\t请选择(1~5):");
scanf("%d",&cord);
printf("\n-----------------------------------------\n");
switch(cord){
    case 1: output(stu,n);break;
    case 2: search(stu,n);break;
    case 3: insert(stu,&n);break;
    case 4: del(stu,&n);break;
    case 5: return 0;
    default:printf("\n输入有误,请重新输入!\n");}
}
 }
void create(STUDENT stu[],int n)
{int i;
for(i=0;i<n;i++)
{printf("\n学号:",stu[i].no);
scanf("%ld",&stu[i].no);
printf("姓名:",stu[i].name);
scanf("%s",stu[i].name);
printf("性别:",stu[i].sex);
scanf("%s",&stu[i].sex);
printf("年龄:",stu[i].age);
scanf("%d",&stu[i].age);} }
void output(STUDENT stu[],int n)
{int i=1;
STUDENT *p;
printf("\n序号\n学号\n姓名\n性别\n年龄 \n");
for(p=&stu[0];p<stu+n;p++)
{printf("%d\t",i++);
printf("%ld\t",p->no);
printf("%s\t",p->name);
printf("%s\t",p->sex);
printf("%d\t",p->age);
printf("\n");}
}
void search(STUDENT stu[],int n)
{int i;
long x;
printf("\n请输入待查找的学号");
scanf("%ld",&x);
for(i=0;i<n;i++)
if(stu[i].no==x) break;
if(i<n) printf("%ld\t%s\t%s\t%d\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].age);
else printf("\n查找失败!" );
return;}
void insert(STUDENT stu[],int *pn)
{int i;
if(*pn==100)
{printf("顺序表已满,不能插入!");
return;}
else
  {i=*pn;
  printf("\n请依次输入");
  printf("\n学号  姓名  性别  年龄\n");
  scanf("%ld%s%s%d",&stu[i].no,stu[i].name,&stu[i].sex,&stu[i].age);
  *pn=*pn+1;}
  return;}
 void del(STUDENT stu[],int *pn)
  {int i;
  long n;
  if(*pn==0)
  {printf("此顺序表为空表,无法删除!");
  return;}
  else
   {i=*pn;
    printf("请输入要删除的学号:");
   scanf("%ld",&n);
   if(n==stu[i].no)
   {printf("删除成功!\n");
   *pn=*pn-1;}
   else
   printf("所输入学号不在该顺序表内,删除失败!\n");} }
删除不管输入在不在顺序表内的学号都显示最后的这句话:"所输入学号不在该顺序表内,删除失败!,求高手帮忙改一下最后的删除部分的程序。
搜索更多相关主题的帖子: include search create insert 
2013-11-11 09:14
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
你这个删除函数。。。。

想想 i等于几?stu[i]里面是什么?


[fly]存在即是合理[/fly]
2013-11-11 10:09
pinglideyu
Rank: 3Rank: 3
来 自:武汉工程大学
等 级:论坛游侠
威 望:1
帖 子:735
专家分:140
注 册:2007-1-7
得分:2 
问题1:printf("\n请输入学生记录个数n=");
这个n写在这里表示什么意思?总数吗?

问题2:void insert(STUDENT stu[],int *pn);
 void del(STUDENT stu[],int *pn);
在insert()函数中,由于你的第二个参数是传址,n的值已经变化。在del()中,if(n==stu[i].no)永远不是你想要的
所以,printf("所输入学号不在该顺序表内,删除失败!\n");会一直出现。。。。

~~我的明天我知道~~
2013-11-11 10:22
听阳光洒下
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2013-11-10
得分:0 
回复 3楼 pinglideyu
问题1:n是学生总数
2013-11-11 12:15
听阳光洒下
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2013-11-10
得分:0 
回复 3楼 pinglideyu
所以第二个应该怎么改呢?
2013-11-11 12:20
流年!
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:107
注 册:2013-11-7
得分:0 
把void del()改成如下 再在头部添加头文件 #include <string.h>
void del(STUDENT stu[],int *pn)
{
    int i;
    long n;
    if(*pn==0)
    {
        printf("此顺序表为空表,无法删除!");
        return;
    }
    else
    {
        i=*pn;
        printf("请输入要删除的学号:");
        scanf("%ld",&n);
        int j=0;
        for( j=0;j<i;j++)
        {
            if(n==stu[j].no)
            {
                printf("删除成功!n");
                //*pn=*pn-1;
                for(int k=j;k<i;k++)
                {
               
                    stu[k].no=stu[k+1].no;
                    stu[k].age=stu[k+1].age;
                    strcpy(stu[k].name,stu[k+1].name);
                    strcpy(stu[k].sex,stu[k+1].sex);
                    //stu[k].name=stu[k+1].name;
                    //stu[k].sex=stu[k+1].sex;
                    *pn-=1;
                }
                return ;
            }
            
        }
        printf("所输入学号不在该顺序表内,删除失败!n");
    }
}
2013-11-11 15:13
听阳光洒下
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2013-11-10
得分:0 
回复 6楼 流年!
原来的问题解决了,可是又出现新的问题,就是比如有两个人的信息,删除了一个之后应该还剩一个才对,但是删除之后再选择显示学生信息的时候却一个都没有了
2013-11-11 15:58
流年!
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:107
注 册:2013-11-7
得分:8 
哦,里面那个循环越界了,这样应该ok了
void del(STUDENT stu[],int *pn)
{
    int i;
    long n;
    if(*pn==0)
    {
        printf("此顺序表为空表,无法删除!");
        return;
    }
    else
    {
        i=*pn;
        printf("请输入要删除的学号:");
        scanf("%ld",&n);
        int j=0;
        for( j=0;j<i;j++)
        {
            if(n==stu[j].no)
            {
                printf("删除成功!n");
                //*pn=*pn-1;
                for(int k=j;k<i-1;k++)
                {
               
                    stu[k].no=stu[k+1].no;
                    stu[k].age=stu[k+1].age;
                    strcpy(stu[k].name,stu[k+1].name);
                    strcpy(stu[k].sex,stu[k+1].sex);
                    //stu[k].name=stu[k+1].name;
                    //stu[k].sex=stu[k+1].sex;
                    
                }
                *pn-=1;
                return ;
            }
            
        }
        printf("所输入学号不在该顺序表内,删除失败!n");
    }
}
2013-11-11 17:18
听阳光洒下
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2013-11-10
得分:0 
回复 8楼 流年!
已经可以了。万分感谢
2013-11-11 18:16



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




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

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