程序的不正常结束问题

题目要求
建立一个非空的值域为整数的顺序表,从键盘输入一个整数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;

}

}

}

当输入有些数据的时候会不正常结束
QQ图片20200323112559.png
是因为 输入数据的结尾是 0+回车 被读入缓冲区 ,导致 在 scanf("%d",&sn); 将0 赋给了 sn 导致程序结束吗?

还想请教一下这个程序有没有死循环,
我在本地在不正常结束的时候能得到 相要的结果 ,但是到学校的网站上交作业的时候,就会出现一下提示

操作指导:评分超时原因可以使用以下的方法排查:

1、请教师检查用例是否正确。

2、请学生检查代码是否存在死循环等错误。

3、当前提交人数较多,网络繁忙、请稍后再试。。

以上是 程序的不正常结束问题 的全部内容, 来源链接: utcz.com/p/194283.html

回到顶部