while (p != nullptr) { if (p == nullptr) { break; } cout << "新闻标题:" << p->data.name << "新闻号:" << p->data.num << " 新闻内容:" << p->data.n << endl; p = p->next; }为什么一直都跳不出循环?
时间: 2023-12-12 15:02:36 浏览: 62
在这段代码中,while循环的条件是p不为nullptr,但是在循环内部又有一个if语句判断p是否为nullptr,并且在if语句中使用了break语句。这会导致当p为nullptr时跳出循环,但是在循环内部p已经被移动到了下一个节点,因此在下一个循环中p不为nullptr,循环会继续执行,直到出现nullptr为止。
为了解决这个问题,可以将if语句中的判断条件改为p->next == nullptr,这样当p移动到链表的最后一个节点时,p->next为nullptr,循环会自动跳出。同时可以去掉if语句中的break语句,这样可以保证循环中的所有语句都会被执行。修改后的代码如下:
```
while (p != nullptr) {
cout << "新闻标题:" << p->data.name << "新闻号:" << p->data.num << " 新闻内容:" << p->data.n << endl;
p = p->next;
}
```
相关问题
while (p) { cout << "新闻标题:" << p->data.name << "新闻号:" << p->data.num << " 新闻内容:" << p->data.n << endl; p = p->next; if (p == nullptr) { break; } }
这段代码与之前的代码逻辑相同,只是在循环体内部将 if 判断语句移到了循环体的末尾,也就是说在循环体的最后判断 p 是否为 nullptr,如果是则跳出循环。这样做是可以避免在循环体内部重复判断 p 是否为 nullptr,从而简化代码。但是需要注意的是,由于循环条件已经限制了 p 不为 nullptr,因此在循环体内部其实不需要再次判断 p 是否为 nullptr,直接执行 p = p->next; 就可以了。所以,这段代码可以简化为以下形式:
```
while (p != nullptr) {
cout << "新闻标题:" << p->data.name << "新闻号:" << p->data.num << " 新闻内容:" << p->data.n << endl;
p = p->next;
}
```
这样既简洁又不会影响代码的功能。
#include<iostream> #include<algorithm> #include<string> #include<cmath> using namespace std; struct node { char n = 0; node* next = nullptr; }; node* shuru(string a) { node* head = new node{ 0,NULL}; node* p; int m; m= a.length(); p = head; for(int i=m-1;i>=0;i--) { node* q = new node; p->next = q; q->n = a[i]; p = q; q->next = nullptr; } return head; } void show(node* m) { m = m->next;//head是默认值,不show while (m!=nullptr) { cout << m->n; m = m->next; } } node* add(node* a, node* b) { node* add, * head = new node{ 0,NULL }, * tail; node* p, * q; p = a; q = b; tail = head; if ((a->n == '-' && b->n != '-') || (b->n == '-' && a->n != '-')) { } else if (a->n != '-' && b->n != '-') { int carry = 0; while (1) { int val = 0; if (p) { val += p->n - '0'; p = p->next; } if (q) { val += q->n - '0'; q = q->next; } /*if (p && q == nullptr) { val += p->n - '0'; p = p->next; } if (q && p == nullptr) { val += q->n - '0'; q = q->next; }*/ val = val + carry; if (val == 0) break; add = new node{ val % 10+'0' ,NULL}; carry = val / 10; tail->next = add; tail = add; } return head; } else { add = new node{ '-',NULL }; tail->next = add; } } int main() { int a; cin >> a; for (int i = 0; i <a; i++) { string m, n; cin >> m >> n; show(add(shuru(m), shuru(n))); } }为什么输出很奇怪
这段代码的输出很奇怪是因为在输出结果时,没有换行符。可以在 `show` 函数中添加一个换行符,如下所示:
```c++
void show(node* m) {
m = m->next;
while (m != nullptr) {
cout << m->n;
m = m->next;
}
cout << endl; // 添加换行符
}
```
这样就可以在输出结果后换行,使输出结果更加清晰易读。
阅读全文