模拟PV操作,该如何定义啊?! 高手解答!!!

johnelf 2008-10-28 09:47:39
这是自己刚写的一个模拟PV操作的程序 风格很烂 大家伙见谅 还请指出错误!!! 感激不尽~~~

#include <iostream>
using namespace std;

extern int s = 3;// 这个是信号量的设置 无所谓了

typedef struct PCB
{
int num;
struct PCB *next;
}PCB,*ready,*stuck;

void Init(PCB *p)
{
p = (PCB*)malloc(sizeof(PCB));
p->next = NULL;
}

ready e; //这里我是没办法才这么写的
stuck k; // 主要是这两个队列的头指针该如何解决!!!!!!!!!!!!!!!!!

void AddR(int ip)
{

if(e->next == NULL) //就在这开始崩溃 ,后面没运行呢
{
PCB *t;
t = (PCB*)malloc(sizeof(PCB)); //如果就绪为空 直接插入
t->num = ip;
t->next = NULL;
e->next = t;
}
else
{
PCB *temp = (PCB*)malloc(sizeof(PCB));
temp->num = ip; //不为空...头插法 后面的加入到阻塞队列的操作和这个类似就不鳌述了
temp->next = e->next;
e->next = temp;

}


}

void weakup(int ip)//这个是唤醒操作 将阻塞队列的一个置到就绪队列
{
PCB *r = k;
PCB *t;
t = r;

while(r->num != ip)//在阻塞队列里找匹配的进程
{
t = r;
r = r->next;

}

t->next = r->next; //从这个队列中出去要找的进程

if(e->next == NULL) //如果队列为空 直接插进去(就绪队列)
{
e->next = r;
e->next = NULL;
}
else //否则...头插法
{
r->next = e->next;
e->next = r;
}



}

void AddS(int ip) //这个是把进程加入到阻塞队列
{
PCB *r = k;

if(r->next == NULL)
{
PCB *t;
t = (PCB*)malloc(sizeof(PCB));
t->num = ip;
t->next = NULL;
r->next = t;
}
else
{
PCB *temp = (PCB*)malloc(sizeof(PCB));
temp->num = ip;
temp->next = r->next;
r->next = temp;

}


}




void P() //p操作
{
int ip;
cout<<"请输入要申请的进程号:";
cin>>ip;

s--;
if(s >= 0)
{
cout<<"分配成功"<<endl;
AddR(ip);

}
else
{
cout<<"分配失败,加入阻塞队列"<<endl;

AddS(ip);
}

}

void V() //V操作
{
int ip;
cout<<"请输入要释放的进程号:";
cin>>ip;

s++;
if(s <= 0)
{
weakup(ip);

}
else
{
if(e->next ==NULL)
cout<<"无法释放,就绪队列为空!"<<endl;
else
{
PCB *t,*pre; //如果部位空 在就绪队列里找出来 删了它!!!
t = e;
pre = t;

t = t->next;

while(t->num != ip);
{
pre = t;
t = t->next;
}

pre->next = t->next;

t->next = NULL;

free(t);

cout<<"进程号为"<<ip<<"资源被释放"<<endl;

}


}

}

int main()
{
Init(e);
Init(k);


int con;
cout<<endl;
cout<<"请选择操作: "<<"1.创建进程,2.结束进程,0.退出"<<endl;;
cout<<"请输入选择:";
cin>>con;

while(con)
{
switch(con){

case 1: P(); break;
case 2: V(); break;

}

}




return 0;
}

...全文
303 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
johnelf 2008-10-28
  • 打赏
  • 举报
回复
谢谢大家 我看看....
大写的池 2008-10-28
  • 打赏
  • 举报
回复
ls 正解 楼主仔细考虑下按值传递参数与按引用传递
hngsc_0 2008-10-28
  • 打赏
  • 举报
回复
你把分配的内存地址赋值给了临时指针变量~~
或者用指针引用

void Init(PCB *&p)
{
p = (PCB*)malloc(sizeof(PCB));
p->next = NULL;
}
hngsc_0 2008-10-28
  • 打赏
  • 举报
回复
修改为

void Init(PCB **p)
{
*p = (PCB*)malloc(sizeof(PCB));
(*p)->next = NULL;
}


调用的地方再修改下
Init(&e);
chenzhp 2008-10-28
  • 打赏
  • 举报
回复
ready e; //这里我是没办法才这么写的 【至少要为这个指针分配空间吧?】
stuck k; // 主要是这两个队列的头指针该如何解决!!!!!!!!!!!!!!!!!

void AddR(int ip)
{

if(e->next == NULL) //就在这开始崩溃 ,后面没运行呢【e连地址都没有,访问next肯定会出错啊】
johnelf 2008-10-28
  • 打赏
  • 举报
回复
自己先顶起!!!
帅得不敢出门 2008-10-28
  • 打赏
  • 举报
回复
编码风格还行.
johnelf 2008-10-28
  • 打赏
  • 举报
回复
先谢谢各位 已经编译通过了
呵呵 这个传参的问题相当于建立一个节点结构体时用typedef重新命名为Node 和*Linklist
初始化时传参用的就是Init_LInklist(Linklist &L)
跟这里的传参是一个道理 而我的相当于是Node* 而不是Node* & 对吧
如果只是传Node* 是不会改变变量L的值的,因为Init_LInklist(Linklist L)相当于一个变量的值!只有值!传给了这个函数
所以要想初始化这种类型,必须给它传一个相对应引用就是说让初始化改变相对应的地址的值,这样才能成功 对吧?!

请指正...
hjzwl1018 2008-10-28
  • 打赏
  • 举报
回复
初学者必须遇到的问题——函数传参,:-)。仔细琢磨琢磨值传递跟引用传递。
Ninstein 2008-10-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zmlovelx 的回复:]
编码风格还行.
[/Quote]
代码比较没有风格 :)
帅得不敢出门 2008-10-28
  • 打赏
  • 举报
回复
总结性的谈一谈函数传参的知识。(c/c++初学的一定要看)
http://www.sudu.cn/info/html/edu/C/20070403/236111.html
johnelf 2008-10-28
  • 打赏
  • 举报
回复
能否具体讲下 谢谢

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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