while (p != NULL),条件不生效怎么办
时间: 2024-02-25 16:59:02 浏览: 30
如果`while (p != NULL)`这个循环条件不生效,可能是因为链表中的节点指针域没有被正确的赋值为NULL。
为了解决这个问题,可以在链表的最后一个节点的指针域设置为NULL,以确保循环不会进入一个无限循环状态。具体来说,可以在链表的创建和插入操作中,对每个新建的节点的指针域都设置为NULL。
例如,在创建一个新节点之后,可以使用如下代码将其指针域设置为NULL:
```cpp
new_node->next = NULL;
```
这样,在遍历链表时,当指针p指向最后一个节点时,p->next会指向NULL,循环条件就会自动结束。
如果你已经确认链表中每个节点的指针域都已经被正确的赋值了,但循环条件仍然不生效,那么你可以考虑使用其他的循环条件,例如:
```cpp
while (p)
{
// 循环体
p = p->next;
}
```
这种写法相当于判断p是否为NULL,如果为NULL则跳出循环。
相关问题
DLL load failed while importing _imaging: 找不到指定的模块。
根据你提供的引用内容,"DLL load failed while importing _imaging: 找不到指定的模块"错误可能是由于库文件不完整、被覆盖或损坏导致的。你提到在做数据增强算法时更新了Python包或其他东西,这可能导致了错误的发生。解决这个问题的方法是重启编译器,以使添加的内容生效。有时候即使环境中明明存在所需的函数或包名,但由于更新或运行其他东西时的干扰,可能会导致包受损。在这种情况下,可以尝试卸载并重新安装该包来解决问题。\[1\]\[2\]
#### 引用[.reference_title]
- *1* *2* [ImportError: DLL load failed while importing _imaging: 找不到指定的模块。](https://blog.csdn.net/qq_44833724/article/details/123212000)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
#include<stdio.h> #include<unistd.h> main() { int p1,p2,i; int *fp; fp = fopen("to_be_locked.txt" ,"w+"); if (fp==NULL) { printf("Fail to create file"); exit(-1); } while((p1=fork( ))== -1); /*创建子进程p1*/ if (p1==0) { lockf(*fp,1,0); /*加锁*/ for(i=0;i<10;i++) fprintf(fp,"daughter %d\n",i); lockf(*fp,0,0); /*解锁*/ } else { while((p2=fork( ))==-1); /*创建子进程p2*/ if (p2==0) { lockf(*fp,1,0); /*加锁*/ for(i=0;i<10;i++) fprintf(fp,"son %d\n",i); lockf(*fp,0,0); /*解锁*/ } else { wait(NULL); lockf(*fp,1,0); /*加锁*/ for(i=0;i<10;i++) fprintf(fp,"parent %d\n",i); lockf(*fp,0,0); /*解锁*/ } } fclose(fp); } #include<stdio.h> #include<unistd.h> main() { int p1,p2,i; int *fp; fp = fopen("to_be_locked.txt" ,"w+"); if (fp==NULL) { printf("Fail to create file"); exit(-1); } while((p1=fork( ))== -1); /*创建子进程p1*/ if (p1==0) { lockf(*fp,1,0); /*加锁*/ for(i=0;i<10;i++) fprintf(fp,"daughter %d\n",i); lockf(*fp,0,0); /*解锁*/ } else { while((p2=fork( ))==-1); /*创建子进程p2*/ if (p2==0) { lockf(*fp,1,0); /*加锁*/ for(i=0;i<10;i++) fprintf(fp,"son %d\n",i); lockf(*fp,0,0); /*解锁*/ } else { wait(NULL); lockf(*fp,1,0); /*加锁*/ for(i=0;i<10;i++) fprintf(fp,"parent %d\n",i); lockf(*fp,0,0); /*解锁*/ } } fclose(fp); }
这段代码存在一些问题:
1. 在头文件中应该加入stdlib.h,以便使用exit()函数。
2. 指针fp没有初始化,应该改为FILE *fp。
3. lockf()函数需要传入文件描述符,而不是文件指针,可以使用fileno()函数转换。
4. 在子进程执行lockf()函数之前应该先关闭子进程不需要的文件描述符,否则文件锁可能不会如期生效。
5. 父进程应该等待两个子进程完成后再执行。
下面是改正后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
int p1, p2, i;
FILE *fp;
fp = fopen("to_be_locked.txt", "w+");
if (fp == NULL) {
printf("Fail to create file");
exit(-1);
}
while ((p1 = fork()) == -1);
if (p1 == 0) { // 子进程p1
fclose(fp); // 关闭不需要的文件描述符
fp = fopen("to_be_locked.txt", "a"); // 重新打开文件
lockf(fileno(fp), 1, 0); // 加锁
for (i = 0; i < 10; i++)
fprintf(fp, "daughter %d\n", i);
lockf(fileno(fp), 0, 0); // 解锁
fclose(fp);
} else {
while ((p2 = fork()) == -1);
if (p2 == 0) { // 子进程p2
fclose(fp);
fp = fopen("to_be_locked.txt", "a");
lockf(fileno(fp), 1, 0);
for (i = 0; i < 10; i++)
fprintf(fp, "son %d\n", i);
lockf(fileno(fp), 0, 0);
fclose(fp);
} else { // 父进程
wait(NULL); // 等待子进程p1完成
wait(NULL); // 等待子进程p2完成
lockf(fileno(fp), 1, 0);
for (i = 0; i < 10; i++)
fprintf(fp, "parent %d\n", i);
lockf(fileno(fp), 0, 0);
fclose(fp);
}
}
return 0;
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)