程序改错-3
从键盘任意输入两个符号各异的整数,直到输入的两个整数满足要求为止,然后打印这两个数。
为什么以下两个代码运行结果有区别(第一个正确,第二个错误)
程序正确的运行结果示例:
Input x1, x2:
a,s↙
Input x1, x2:
a,1↙
Input x1, x2:
2,s↙
Input x1, x2:
1,2↙
Input x1, x2:
-1,-2↙
Input x1, x2:
0,3↙
Input x1, x2:
1.2,3.4↙
Input x1, x2:
1.2,5↙
Input x1, x2:
-1,3↙
x1=-1,x2=3
int main()
{
int x1, x2,n,flag = 0;
do{
printf("Input x1, x2:\n");
n = scanf("%d,%d", &x1, &x2);
if(n == 2){
if(x1 * x2 >= 0){
flag = 1;
} else{
flag = 0;
}
} else{
while(getchar() != '\n');
flag = 1;
}
}while (flag);
printf("x1=%d,x2=%d\n", x1, x2);
return 0;
}
int main()
{
int x1, x2,n,flag=0;
do
{
printf("Input x1, x2:\n");
n=scanf("%d,%d", &x1, &x2);
if (n==2)
{
if(x1*x2>=0)
flag=1;
else flag=0;
}
else
flag=1;
}
while (flag);
printf("x1=%d,x2=%d\n", x1, x2);
return 0;
}
第一个代码正确,第二个代码错误,因为在第二个代码中,当输入的两个数不满足要求时,flag的值被设置为1,而在第一个代码中,当输入的两个数不满足要求时,flag的值被设置为0,这样就可以继续循环,直到输入的两个数满足要求为止。
int ListDelete_Sq(struct SqList* L, int i, int* e) {
if (i<1 || i>L->len) return ERROR;
int* p = &(L->elem[i - 1]);
*e = *p;
int* q = L->elem + L->len - 1;
for (++p; p <= q; ++p)
*(p - 1) = *p;
L->len--;
return OK;
}
这里 i 代表链表中的位置,*e 是该位置的数据,这样我们就能知道删除元素的值了,然后我定义*q为链表中最后一个元素的地址,随后重复让链表删除位置后的元素前移,最后链表总长度减一,删除结束。修改链表利用插入和删除操作结合就可以完成,这里没有单独定义方法,具体内容会在下面的总代码体现。