程序的不正常结束问题
题目要求
建立一个非空的值域为整数的顺序表,从键盘输入一个整数item,编程实现删除表中所有值为item的数据元素。
(1) 建立长度至少为10的顺序表;
(2) 从键盘输入一个整数item,删除表中所有与item相同的元素,删除成功显示“OK”,不成功显示“ERROR”。
(3) 显示顺序表的内容;
(4) 要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ERROR 0
#define OK 1
#define FALSE -1
#define TRUE 1
#define MAX 100
typedef struct Sq {
int elem[MAX] ;
int length ; //长度;
} List;
int menu_select(); //菜单驱动程序
int InitList(List *L); //初始化顺序表
void TraveList(List L); //显示顺序表
void CreateList(List *L); //创建顺序表
void Delete(List *L , int item); //删除元素
// 选择输出的内容;
int menu_select() //菜单驱动程序
{
int sn;
printf("实验一运行系统\n"); //显示菜单
printf("==============================\n");
printf("1、顺序表的建立\n");
printf("2、顺序表的删除\n");
printf("3、顺序表的输出\n");
printf("0、退出实验一运行系统\n");
printf("==============================\n");
printf("请选择0--3:");
for ( ; ; ) //菜单功能选择
{
scanf("%d", &sn);
getchar(); //吃掉回车;
if (sn < 0 || sn > 3)
printf("\n输入选择错误,请重新选择 0--3:");
else
break;
}
return sn; //返回命令;
}
int InitList(List *L) { //初始化顺序表;
L->length = 0; //初始化长度;
return 1; // ???
}
/*
TODO: 输出顺序表的内容
功能:输出顺序表的内容,每个元素之间用空格隔开,顺序表为1 2 3 4
5 6
则输出:1 2 3 4 5 6 输出完成后进行换行。
参数:List L 是需要操作的顺序表
返回值:无
*/
void TraveList(List L) { // 传值的方式输入;
int i=0;
while(i!=L.length)
{
printf ( "%d " , L.elem[i] );
i++;
}
printf("\n");
}
/*
TODO: 创建顺序表
功能:提示("请输入元素值:"),建立长度至少为10,元素均为int型的顺序表;
创建顺序表按0 + 回车,完成创建,如输入: 1 2 3 4 5 6 0 回车
则生成顺序表:1 2 3 4 5 6
参数:List *L 是需要操作的单链表
返回值:无。
*/
void CreateList(List *L) { // 传入地址的方式 ;
int loop = 1;
int i = 0;
int e;
printf("请输入元素值:");
while(scanf("%d",&e),e|| i<10 ) {
L->elem[i]=e;
printf(" L->elem[i]=%d\n",L->elem[i]);
i++; // 加完了之后再判段,就是 真实的值;
}
L->length=i;
}
/*
TODO: 删除表中与Item值相同的元素
功能:从键盘输入一个整数item,删除表中与Item数字相同的元素
比如:表为:6 5 4 3 2 1,录入2,则删除2,新的顺序表为:6 5 4 3 1 // 顺序不变;
参数:List *L 是需要操作的表,item是指定删除元素的数值
返回值:空
*/
void Delete(List *L , int item) {
int *p1, *p2;
int len = L->length;
p1 = &L->elem[0]; // p1 指向数组开头
for (p2 = p1; p2 < (L->elem + len); p2++) { // 用p2遍历整个数组
if (*p2 != item) { // 检查数据合法
*p1++ = *p2; // 将合法数据搬运到p1,并且p1移位,准备下次接收
} else {
L->length--; // 舍弃不合法的数据,并将数组长度减短
}
}
if(L->length==len)
printf("ERROR");
else
printf("OK");
}
void main() {
List L;
int item;
for (;;) {
switch (menu_select()) { //选择进行得序号;
case 1:
InitList(&L);
CreateList(&L);
break;
case 2:
printf("顺序表的删除\n");
printf("请输入要删除的标的元素item:");
scanf("%d", &item);
Delete(&L, item);
break;
case 3:
printf("顺序表的输出\n");
TraveList(L);
break;
case 0:
printf("再见!\n");
return;
}
}
}
当输入有些数据的时候会不正常结束
是因为 输入数据的结尾是 0+回车 被读入缓冲区 ,导致 在 scanf("%d",&sn); 将0 赋给了 sn 导致程序结束吗?
还想请教一下这个程序有没有死循环,
我在本地在不正常结束的时候能得到 相要的结果 ,但是到学校的网站上交作业的时候,就会出现一下提示
操作指导:评分超时原因可以使用以下的方法排查:
1、请教师检查用例是否正确。
2、请学生检查代码是否存在死循环等错误。
3、当前提交人数较多,网络繁忙、请稍后再试。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论