如何让指针不要乱指到其他地址以致p != NULL不能正常执行!

kun20031029 2009-04-21 11:33:45
有如下程序
//显示所有页表函数
<p>
void view_pages()
{
jobs *p;
int i;

p=head->next;
if(p==NULL)
cout<<"当前没有用户作业"<<endl;
else
{
cout<<"当前所有的用户作业页表情况"<<endl;
while(p!=NULL)
{
cout<<"作业名:"<<p->jobname<<" 所用块数:"<<p->num<<endl;
cout<<"本作业所点块的序列是:"<<endl;
for(i=0;i<p->num;i++)
{
cout<<p->nums[i]<<" ";
}
cout<<endl;
p=p->next;
}
}
}
</p>
因为p = p->next后,p即使后面没有值了,还总指向一个任意地址,从而造成不能跳出while(p != NULL)这个循环,变成死循环,请问该怎么处理呢?
...全文
141 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kun20031029 2009-04-23
  • 打赏
  • 举报
回复
是我的add函数写的有问题,谢谢楼上的各位了
中才德创 2009-04-22
  • 打赏
  • 举报
回复
事先要规范化一个结束条件的.
zlxadhkust 2009-04-22
  • 打赏
  • 举报
回复
p->next = head->next;
head->next = p;

改成 p->next = head;
head = p;

试试。

我觉得你的代码也没什么不对,虽然逻辑可能不是你想要的,新的节点总是插入在head的下一个位置。而一般来说,要么从前面插,要么从后面插。
kun20031029 2009-04-21
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<iostream.h>
#include<string.h>

#define NULL 0

const int PAGES = 256;//定义总块数
const int WORD = 32;//定义字长

const int WORDNUM = PAGES/WORD;

typedef struct node
{
char jobname[20];
int num;
int nums[PAGES];
struct node *next;
}jobs;

int table[WORDNUM][WORD];
int freenum = 0;
jobs *head;

//初始化函数
void initial()
{
jobs *p;
//初始化位示图
for(int i = 0; i < WORDNUM; i++)
{
for(int j = 0; j < WORD; j++)
{
table[i][j] = 0;
}
}
//初始化作业表头
p = new jobs;
strcpy(p->jobname, "null");
p->num = 0;
p->next = NULL;
head = p;
}

//读入位示图初始数据
int readData()
{
FILE *fp;
char fname[20];
int i,j;

cout<<"请输入初始位示图数据文件名:"<<endl;
cin>>fname;

if((fp = fopen(fname, "r")) != NULL)
{
for(i = 0; i < WORDNUM; i++)
{
for(j = 0; j < WORD; j++)
{
fscanf(fp, "%d", &table[i][j]);
if(table[i][j] == 0)
{
freenum++;
}
}
}
for(i = 0; i < WORDNUM; i++)
{
for(j = 0; j < WORD; j++)
{
cout<<table[i][j]<<" ";
}
cout<<endl;
}
cout<<"总空闲块数:"<<freenum;
return 1;
}
else
{
cout<<"文件不能打开"<<endl;
return 0;
}
}

//新加入作业函数
void add()
{
char jobname[20];
int num, f = 0;
jobs *p;
cout<<"请输入新增的作业名:";
cin>>jobname;
cout<<"新增作业所需页数:";
cin>>num;
if(num <= freenum)
{
freenum -= num;
p = new jobs;
strcpy(p->jobname,jobname);
p->num = num;
int k = 0;

for(int i = 0; (i < WORDNUM) && (f == 0); i++)
{
for(int j = 0; (j < WORD) && (f == 0); j++)
{
if(table[i][j] == 0)
{
p->nums[k] = i*WORD+j;
table[i][j] = 1;
k++;
num--;
}
if(num <= 0)
{
f = 1;
}
}
p->next = head->next;
head->next = p;
}
p->next = head->next;
head->next = p;
cout<<"添加操作成功!"<<endl;
}
else
{
cout<<"错误,当前剩余页数小于所需页数,请稍后重试!"<<endl;
}
}

//完成作业函数
void finish()
{
char jobname[20];
jobs *p, *q;
int n,i,j;
p = head->next;
// cout<<"name="<<p->jobname<<endl;
q = head;
if(p == NULL)
{
cout<<"这里没有作业"<<endl;
}
cout<<"请输入完成的作业名:";
cin>>jobname;

while(p != NULL)
{
if(!strcmp(p->jobname, jobname))
{
freenum += p->num;
for(int k = 0; k < p->num; k++)
{
n = p->nums[k];
i = n/WORD;
j = n%WORD;
table[i][j] = 0;
}
q->next = p->next;
cout<<" 完成操作成功!"<<endl;
delete p;
break;
}
else{
q = p;
p = p->next;
}
}

}

//显示当前位示图函数
void view_table()
{
int i,j;
cout<<"当前位示图"<<endl;
for(i = 0; i < WORDNUM; i++)
{
for(j = 0; j < WORD; j++)
{
cout<<table[i][j]<<" ";
}
cout<<endl;
}
cout<<"总的空闲块数:"<<freenum<<endl;
}

//显示所有页表函数
void view_pages()
{
jobs *p;
p = head->next;
if(p == NULL)
{
cout<<"当前没有用户作业"<<endl;
}
else
{
cout<<"当前所有的用户作业页表情况"<<endl;
}
while(p != NULL)
{
cout<<"作业名:"<<p->jobname<<" 所用块数"<<p->num<<endl;
cout<<"本作业所在点块的序列示:"<<endl;
for(int i = 0; i < p->num; i++)
{
cout<<p->nums[i]<<" ";
}
cout<<endl;
p = p->next;
}
}


void main()
{
int t = 1, choice;
initial();
if(readData())
{
while(t == 1)
{
cout<<endl<<"=================================="<<endl;
cout<<" 页式内存管理系统模拟程序"<<endl;
cout<<"===================================="<<endl;
cout<<"1.加入新作业 2.完成作业 3.显示当前内存位示图 4显示所有作业页表 0.退出"<<endl;
cin>>choice;

switch(choice)
{
case 1:
add();
break;
case 2:
finish();
break;
case 3:
view_table();
break;
case 4:
view_pages();
break;
case 0:
t = 0;
break;
default:
cout<<"选择错误!"<<endl;
}
}
}
}
那我要改那个地方哦,在add函数里改还是initial函数里哦,主要是执行3时,死循环
josephwuxiaameng 2009-04-21
  • 打赏
  • 举报
回复
在你的数据结构初始化时就应该先实现把指针的指向管理好,这样才能避免出现这样的问题。不知道我说的你懂了没?
mengde007 2009-04-21
  • 打赏
  • 举报
回复
初始化没有搞定啊;开始的时候你就应该让next成员为null;
lingyin55 2009-04-21
  • 打赏
  • 举报
回复
赋值的时候如果p->next没有指向值了,加上p->next=NULL;不就行了?

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧