所以我正在编写这个程序,将用户输入存储在链表上并将其反转,但我有点迷失。是否有可能为循环类型提出一个循环不变量,它不会返回任何值?例如,位于main内部的循环。
这是一个循环的例子,我用来在main中获取用户输入并将其存储在链表中,当然代码中还有更多内容,但我只展示了相关内容。< / p>
typedef struct node {
char x; // data
struct node* next; // link to next node
} Node;
int main(void){
char c = ' ';
Node* start = NULL;
Node* temp;
while(c!='.'){
c=getchar();
temp=(Node*)calloc(1, sizeof(Node));
temp->x = c;
temp->next = start;
start = temp;
}
是否可以为此设置循环不变量?程序的正确性又是什么意思?我如何在我的案例中对其进行证明?
谢谢!
答案 0 :(得分:0)
循环不变量是关于它们之间关系的正式陈述 程序中的变量在循环之前保持为真 曾经运行(建立不变量)并且在底部再次成立 循环,每次循环(保持不变)
假设这是你想要的。您显示的代码看起来很好,可以将一个节点添加到链表中,所以关于正确性它应该没问题。
char str[100];
int cnt = 0;
int n;
fgets(str,100,stdin);
if(strlen(str) < 99)
str[strlen(str) -1] = '\0';
n = strlen(str);
/* cnt <= n */
while(str[i] != '.')
{
/* cnt <= n */
// Do your stuff
cnt++;
/* cnt <= n */
}
/* cnt <= n */
循环不变量
cnt <= n
答案 1 :(得分:0)
循环不变量是在循环的每次迭代之前和紧接之后必须为真的条件
int main(void)
{
char c = ' ';
Node* start = NULL;
Node* temp = NULL;
while(c!='.'){
/* temp = NULL before each iteration*/
c=getchar();
temp=(Node*)calloc(1, sizeof(Node));
temp->x = c;
temp->next = start;
start = temp;
temp = NULL;
/* temp = NULL after each iteration*/
}
<强> So in this case temp is NULL before and after each iteration of the loop
即可。您可以将此作为证明。
有关详细信息,请参阅http://en.wikipedia.org/wiki/Loop_invariant 和What is a loop invariant?