修改的 创建队列程序 C语言。 队列元素 是堆分配内存,而非指针

来源:互联网 发布:阿里云公司 编辑:程序博客网 时间:2024/06/08 02:22
/*构造一个空队列*/Queue *InitQueue()  {Queue *pqueue = (Queue *)malloc(sizeof(Queue));if(pqueue!=NULL){pqueue->front = NULL;pqueue->rear = NULL;pqueue->size = 0;//pqueue->status=1;//初始化为send数据}return pqueue;}/*销毁一个队列*/void DestroyQueue(Queue *pqueue){if(IsEmpty(pqueue)!=1)ClearQueue(pqueue);free(pqueue);}/*清空一个队列*/void ClearQueue(Queue *pqueue){while(IsEmpty(pqueue)!=1){DeQueue(pqueue,NULL,NULL);}}/*判断队列是否为空*/int IsEmpty(Queue *pqueue){if(pqueue->front==NULL&&pqueue->rear==NULL&&pqueue->size==0)return 1;elsereturn 0;}/*返回队列大小*/int GetSize(Queue *pqueue){return pqueue->size;}/*将新元素入队*/PNode EnQueue(Queue *pqueue,Item item,int sid){int length = 0;PNode pnode = (PNode)malloc(sizeof(Node));if(pnode != NULL){// 这里一定要+1length = strlen(item)*sizeof(char)+1;//pnode->data = item;pnode->data = (Item)malloc(length);memset(pnode->data, 0, length);memcpy(pnode->data, item, length);pnode->next = NULL;pnode->status = sid;if(IsEmpty(pqueue)){pqueue->front = pnode;}else{pqueue->rear->next = pnode;}pqueue->rear = pnode;pqueue->size++;}return pnode;}/*队头元素出队*/PNode DeQueue(Queue *pqueue,Item pitem,int *sid){PNode pnode = pqueue->front;if(IsEmpty(pqueue)!=1&&pnode!=NULL){if(pitem!=NULL){//*pitem = pnode->data;memcpy(pitem, pnode->data, strlen(pnode->data));free(pnode->data);*sid = pnode->status;}pqueue->size--;pqueue->front = pnode->next;free(pnode);if(pqueue->size==0)pqueue->rear = NULL;}return pqueue->front;}/*遍历队列*/  void QueueTraverse(Queue* pqueue)  {  PNode pnode = pqueue->front;  int i = pqueue->size;  while(i--)  {    printf("遍历队列第 %d 个元素 为: %s\n", i, pnode->data);pnode = pnode->next;  }  }  



头文件

#ifndef Queue_H#define Queue_Htypedef char* Item;typedef struct node * PNode;typedef struct node{Item data;PNode next;int status;//status=1 表明是send 数据,=2为recv数据}Node;typedef struct{PNode front;PNode rear;int size;}Queue;/*构造一个空队列*/Queue *InitQueue(); /*销毁一个队列*/void DestroyQueue(Queue *pqueue);/*清空一个队列*/void ClearQueue(Queue *pqueue);/*判断队列是否为空*/int IsEmpty(Queue *pqueue);/*返回队列大小*/int GetSize(Queue *pqueue);/*将新元素入队*/PNode EnQueue(Queue *pqueue,Item item,int sid);/*队头元素出队*/PNode DeQueue(Queue *pqueue,Item pitem,int *sid);/*遍历队列,并对各项数据调用visit函数*/  void QueueTraverse(Queue* pqueue); #endif