IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> c实现进程管理(链表) -> 正文阅读

[数据结构与算法]c实现进程管理(链表)

#include <stdio.h>
#include <stdlib.h>

struct Jincheng{
    int pid;
    int priority; //优先级
    int size;
    int state; //标志进程状态,0为不在内存 1为内存 2为挂起
    char info[20];
    struct Jincheng *next;
};
int index = 0;
Jincheng *yunxing,*guaqi;
//打印链表中所有pid值 
void printfPid(Jincheng *list){
	Jincheng *p = list->next;
	printf("(");
	while(p != NULL){
		printf("%d ",p->pid);
		p=p->next;
	}
	printf(")\n");
}
//根据pid找值 
Jincheng *getElem(Jincheng *list,int pid){
	Jincheng *p = list;
	 while (p->next != NULL) {
        if (p->next->pid == pid) {
            return p;
        }
        p = p->next;
    }
    return NULL;
}
//不存在0 存在1 
int existInYunxing(Jincheng *yunxing,int pid){
    int result = 0;
    Jincheng *s = yunxing->next;
    while (s != NULL) {//遍历执行状态的链表
        if (s->pid == pid) {//存在,直接返回
            result = 1;
            break;
        }
        s = s->next;
    }
    return result;
}
//不存在0 存在1 
int existInGuaqi(Jincheng *guaqi,int pid){
    int result = 0;
    Jincheng *s = guaqi->next;
    while (s != NULL) {//遍历执行状态的链表
        if (s->pid == pid) {//存在,直接返回
            result = 1;
            break;
        }
        s = s->next;
    }
    return result;
}
void create(Jincheng *yunxing){
	if(index >= 20){
		printf("内存已满,需挂起或杀死进程");
		return;
	}else{
		Jincheng *p = (Jincheng*)malloc(sizeof(Jincheng));
		printf("请输入进程的ID\n");
		scanf("%d",&p->pid); 
		if(existInYunxing(yunxing,p->pid)){
			printf("已存在该pid");
			return;
		}else{
		printf("请输入进程的优先级\n");
		scanf("%d",&p->priority); 
		printf("请输入进程的大小\n");
		scanf("%d",&p->size); 
		printf("请输入进程的内容\n");
		scanf("%s",&p->info); 
		p->state = 1;
		p->next=NULL;
		Jincheng *q = yunxing;
		while(q->next != NULL){
			q = q->next;
		}
		q->next = p; //插入运行链表 最后一个 
		index = index + 1; 
	}
	}
}

void run(Jincheng *yunxing){
	Jincheng *q = yunxing->next;
	if(q == NULL){
		printf("没有正在运行的进程");
		return;
	}
	while(q!=NULL){ //循环遍历链表 
		printf("pid:%d	",q->pid);
		printf("priority:%d	",q->priority);
		printf("size:%d	",q->size);
		printf("state:%d ",q->state);
		printf("info:%s\n",q->info);
		q = q->next; 
	}
}

void huanchu(Jincheng *yunxing,Jincheng *guaqi){
	Jincheng *q = yunxing->next;
	Jincheng *p = guaqi;
	if (index == 0) {
        printf("无可换出的进程\n");
        return;
    }  
    printf("可以换出的进程有: ");
    printfPid(yunxing);
    int h;
    printf("请输入需要换出进程的id: ");
    scanf("%d",&h);
    //查看该线程是否在运行队列中
    if (existInYunxing(yunxing, h)) {
        //存在,找到该线程的位置(返回的是前一个结点的地址
        Jincheng *s = getElem(yunxing,h);
        s->next->state = 2;
        //将该线程存入挂起队列中
        while (p->next != NULL) {
            p = p->next;
        }
        
        p->next = s->next;//插入
        s->next = s->next->next;
        p->next->next = NULL;//将该线程的next重置为空
        index = index - 1;
        printf("成功换出\n");
    }else{
        printf("该线程不存在或已处于挂起状态\n");
    }
}

void kill(Jincheng *yunxing){
	int pid;
	if (index == 0) {
        printf("没有运行的进程可供杀死\n");
        return;
    }
    printf("可以杀死的进程有: ");
    printfPid(yunxing);
    printf("请输入你想杀死进程id: ");
    scanf("%d",&pid);
    if(existInYunxing(yunxing,pid)){
    	Jincheng *p = getElem(yunxing,pid);
    	Jincheng *q = p->next;
    	p->next = p->next->next; //移除节点
		index = index - 1;
		free(q);
		printf("进程已经杀死"); 
	}else{
		printf("该进程不存在或者已经挂起");
	}
}

void jihuo(Jincheng *yunxing,Jincheng *guaqi){
	int pid;
	Jincheng *p = yunxing;
	Jincheng *g = guaqi;
	if(g->next == NULL){
		printf("没有进程可以激活");
	}else{
		printf("可以激活进程有: ");
		printfPid(guaqi);
		printf("请输入你想激活的进程: ");
		scanf("%d",&pid);
		if(existInGuaqi(guaqi,pid)){
		Jincheng *s = getElem(guaqi,pid);
        s->next->state = 1;
        //将该线程存入运行队列中
        while (p->next != NULL) {
            p = p->next;
        }
        p->next = s->next;//插入
        s->next = s->next->next;
        p->next->next = NULL;//将该线程的next重置为空
        index = index + 1;
        printf("进程已经激活");
		}else{
			printf("没有进程可激活");
		}
	}
}


int main(){
	yunxing = (Jincheng*)malloc(sizeof(Jincheng));
	yunxing->next = NULL;
	guaqi = (Jincheng*)malloc(sizeof(Jincheng));
	guaqi->next = NULL; 
    int n = 1;
    int num;
    while(n){
        printf("\n****************************************");
        printf("\n*  进程管理系统  *");
        printf("\n****************************************");
        printf("\n      1.创建新的进程  2.查看运行进程  ");
        printf("\n      3.换出某个进程  4.杀死运行进程  ");
        printf("\n      5.激活某个进程  6.退出系统  ");
        printf("\n****************************************");
        printf("\n  请选择(1-6) \n");
        scanf("%d",&num);
        switch(num){
        	case 1: create(yunxing);break;
        	case 2: run(yunxing);break;
        	case 3: huanchu(yunxing,guaqi);break;
        	case 4: kill(yunxing);break;
        	case 5: jihuo(yunxing,guaqi);break;
        	case 6: exit(0);
        	default:n=0; 
		}
        
    }
return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:19:45  更:2022-04-01 00:23:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:27:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码