C语言链式队列存储实现进程通信模拟(不考虑同步)

大二程序狗一枚,借鉴了老师的框架死磕了好几天BUG写出来的一段代码,欢迎大家评价。也希望能够对有需要的同行们提供帮助,版权所有,侵权必究
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define MAX_MSG_LEN 1024 //消息内容最大长度
#define TRUE 1
#define FALSE 0
/*
**通过消息队列,A和B两个进行实现进程间通信(消息通信),不考虑同步
** 通过链式存储实现
*/

/消息节点结构体/
char d[MAX_MSG_LEN];//消息数组
typedef struct msg
{
char data[MAX_MSG_LEN];//消息的内容
int no;//消息的内部标识符
struct msg * next_msg;//指向下一个消息结点的指针
}msg;
/进程队列的结构体/
typedef struct msg_que
{
msg *front; //队头指向结点的指针
msg *rear; //队尾指向结点的指针
int count;//当前队列长度
}msg_que;
int msg_no=0;//所有消息的编号,包含a发给b的消息和b发给a的消息
/打印菜单函数/
void print_menu()
{
printf(“按1键A进程给B进程发送消息\n”);
printf(“按2键B进程给A进程发送消息\n”);
printf(“按3键显示A的消息队列\n”);
printf(“按4键显示B的消息队列\n”);
printf(“按5键A接收一个消息\n”);
printf(“按6键B接收一个消息\n”);
printf(“按7键A接收所有消息\n”);
printf(“按8键B接收所有消息\n”);
printf(“按9键显示A和B的消息队列\n”);
printf(“按0键退出\n”);
printf(“您的选择: \n”);
}
/初始化消息队列/
msg_que *create_queue()
{
msg_que queue;
queue = (msg_que
)malloc(sizeof(msg_que));
queue->front=NULL;
queue->rear=NULL;
queue->count=0;
return queue;
}
/判断消息队列是否为空/
int is_msg_que_empty(msg_que * que)
{
if((que->front= =NULL)&&(que->rear= =NULL))
return TRUE;
else
return FALSE;
}
//发送一条消息 (元素进队列)
void send_msg(msg_que *que)
{
msg msg1=(msg)malloc(sizeof(msg));
int i,n;
msg1->next_msg=NULL;
printf(“请输入信息的长度:\n”);
scanf("%d",&n);//信息(字符串)的长度,如果是字母,如果是汉字,则实际输入的汉字个数应该为n/2
printf(“请输入信息内容:\n”);
getchar();//抵消回车对字符串输出内容的影响
for(i=0;i<n;i++)
{
scanf("%c",&d[i]);
}//输入消息字符串
d[i]=’\0’;//字符串结束符
strncpy(msg1->data,d,n+1);//信息赋值,将末尾的’\0’复制上,防止乱码
msg_no++;
msg1->no=msg_no;
que->count++;//消息数加一
if(is_msg_que_empty(que))
{
que->front=msg1;
que->rear=msg1;
}
else
{
que->rear->next_msg=msg1;
que->rear=msg1;
}
}
/接收一条消息 (元素出队列)/
msg *receive_msg(msg_que * que)
{
que->count=0;//初始化消息数
msg return_msg_node;//返回一个消息结点的信息
if(is_msg_que_empty(que))
{
printf(“消息队列为空\n”);
}
return_msg_node=que->front;
if (que->front==que->rear)
{
que->front=que->rear=NULL;
}
else
{
que->front=que->front->next_msg;
}
return_msg_node->next_msg=NULL;
printf(“收到一条消息\n”);
que->count–; //消息数减一
return return_msg_node;
}
/接收全部消息 (所有元素出队列)/
msg
receive_all_msg(msg_que * que)
{
if (is_msg_que_empty(que))
{
printf(“没有需要接收的信息\n”);
}
else
{
msg *cursor_msg_pointer;//游标指针
cursor_msg_pointer=que->front;
printf("---------------\n");
/顺序遍历队列每个结点/
while (cursor_msg_pointer!=NULL)
{
cursor_msg_pointer=cursor_msg_pointer->next_msg;
receive_msg(que); //遍历过的消息结点出队列
}
printf("---------------\n");
}
}
/打印消息队列/
void print_msg_que(msg_que * que)
{
if (is_msg_que_empty(que))
{
printf(“没有需要接收的信息\n”);
return;
}
else
{
msg *cursor_msg_pointer;//游标指针
cursor_msg_pointer=que->front;
printf("---------------\n");
/顺序遍历队列每个结点/
while (cursor_msg_pointer!=NULL)
{
//打印当前结点信息
printf("%d %s\n",cursor_msg_pointer->no,cursor_msg_pointer->data);
//后移游标指针
cursor_msg_pointer=cursor_msg_pointer->next_msg;
}
printf("---------------\n");

}
}
int main()
{
char user_opt;
//a的消息队列(a收到的消息)
msg_que * msg_que_a=(msg_que *)malloc(sizeof(msg_que));
msg_que_a->front = msg_que_a->rear=NULL;
msg_que_a->count=0; //初始化队列a的长度,不初始化会输出随机值
//b的消息队列(b收到的消息)
msg_que * msg_que_b=(msg_que *)malloc(sizeof(msg_que));
msg_que_b->front = msg_que_b->rear=NULL;
msg_que_b->count=0;//初始化队列b的长度,不初始化会输出随机值
print_menu();
while(1)
{
scanf("%c", &user_opt);
switch(user_opt)
{
case ‘1’ :
send_msg(msg_que_b);
break;
case ‘2’:
send_msg(msg_que_a);
break;
case ‘3’:
printf(“消息队列a的内容为:\n”);
print_msg_que(msg_que_a);
break;
case ‘4’:
printf(“消息队列b的内容为:\n”);
print_msg_que(msg_que_b);
break;
case ‘5’:
printf(“a队列”);
receive_msg(msg_que_a);
break;
case ‘6’:
printf(“b队列”);
receive_msg(msg_que_b);
break;
case ‘7’:
printf(“a队列\n”);
receive_all_msg(msg_que_a);
break;
case ‘8’:
printf(“b队列\n”);
receive_all_msg(msg_que_b);
break;
case ‘9’:
printf(“消息队列a的内容为:\n”);
print_msg_que(msg_que_a);
printf("\n");
printf(“消息队列b的内容为:\n”);
print_msg_que(msg_que_b);
break;
case ‘0’:
return 0;
break;
}
}
return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值