C队列操作问题

人若无名 2012-12-29 12:38:57
队列是全局变量,我把队列的操作函数单独封装起来(取队列头节点,队列尾插等),在队列结尾插入一个节点实现的时候,我是将一个节点(传递的是指针)直接赋值给队列队尾的next指针。我想这样的话,如果在主函数里这个节点被重新赋值,那么队列里的节点也变化了吧?或者说主函数里这个节点被释放掉了,队列里的节点也消失了吧?
我想把节点存在队列里,不想让他变化。改怎么实现?

我的代码如下(我的代码应该回出现上面说的问题吧,改怎么改?):

typedef struct task_node
{
tServiceHandler req; //保存的reqest套接字
tDatabase db; //保存数据库文件
char task[MAX_BUF_LEN]; //存放接收到的字符传请求,由HandleOneRequest解析
task_node *next;
}task_node; //定义event节点

/*
* Queue Type
*/
typedef struct Queue
{
task_node *qHead;
task_node *qTail;
int SumOfNode;

}pth_task_Queue;

/* 将一个任务放到队尾 */
int PutTask(task_node *tasknode, pth_task_Queue *pQ)
{
if(pQ == NULL || tasknode == NULL)
return FAILURE;
tasknode-> next = NULL;
if(pQ -> qHead == NULL)
pQ -> pHead = tasknode;
if(pQ -> pTail == NULL)
pQ -> pTail = tasknode;
else
{
pQ -> qTail -> next = tasknode;
pQ-> qTail = tasknode;
}
pQ -> SumOfNode += 1 ;
return SUCCESS;
}
...全文
221 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
prajna 2012-12-29
  • 打赏
  • 举报
回复
malloc出来的节点会不会随着函数的结束而释放呢? 你將數據放到隊列裏,數據縂要從隊列出來吧,這個時候就可以释放掉這個節點了. 还得每次都传递不同的节点名称。 task_node* tasknode= (task_node*) malloc(sizeof(task_node)); 每次都用 這個tasknode装数据, 每次都 PutTask(tasknode, pQ); 出隊的時候free(pQ->qHead);
人若无名 2012-12-29
  • 打赏
  • 举报
回复
在PutTask函数里malloc一个节点吗? malloc出来的节点会不会随着函数的结束而释放呢? 如果在组函数里 好像不好 每次都创建一个节点,应为这样还得每次都传递不同的节点名称。
引用 4 楼 gumh 的回复:
你每次都創建一個新的節點就好了. 節點出隊的時候,再釋放掉節點的内存空間.
prajna 2012-12-29
  • 打赏
  • 举报
回复
你每次都創建一個新的節點就好了. 節點出隊的時候,再釋放掉節點的内存空間.
人若无名 2012-12-29
  • 打赏
  • 举报
回复
是这样的,我的主函数是一个循环,不断的监听一个事件,如果该事件发生,主函数将相关数据分装到一个节点里,并调用PutTask函数将节点放到队列里。如果我第一次放置了一个节点到队里里(调用我上面的函数PutTask,将队尾指针指向这个节点),但是第二次循环里我监听到一个事件发生,这个节点在主函数里就被重新赋值了(新的数据封装进去了,然后又调用PutTask函数...)这样的话,第一次队列队尾指针指向的那个节点也跟着变化了,怎么弄? 不知道大家明白我意思没有。
prajna 2012-12-29
  • 打赏
  • 举报
回复
我想这样的话,如果在主函数里这个节点被重新赋值,那么队列里的节点也变化了吧? 是的 或者说主函数里这个节点被释放掉了,队列里的节点也消失了吧? 不應該在主函数里释放掉这个节点,要通過隊列,將這個節點先出隊,然後釋放,否則隊列裏的這個釋放掉的節點的指針,就成爲無效指針了. 我想把节点存在队列里,不想让他变化。改怎么实现? 不想让他变化,你就不要去操作這個節點就好了, 如果主函数里要改變這個接點,你可以把這個節點copy一份,然後改變這個copy就好了。
东大坡居士 2012-12-29
  • 打赏
  • 举报
回复

typedef struct task_node
 {
     tServiceHandler req;  //保存的reqest套接字
     tDatabase  db; //保存数据库文件
     char task[MAX_BUF_LEN]; //存放接收到的字符传请求,由HandleOneRequest解析
     task_node *next;
 }task_node;  //定义event节点
 //在你的定义中加一个标志位,加入队列的时候赋一个值,表示不允许改变!需要判断此标志位才能改变

69,371

社区成员

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

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