#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 10
enum ret_val
{
MALLOC_OK = 100,
MALLOC_NO,
CREATE_OK,
CREATE_NO,
PUSH_OK,
PUSH_NO,
POP_OK,
POP_NO,
EMPTY_OK,
EMPTY_NO,
};
typedef struct quece_node
{
int num;
char name[SIZE];
struct quece_node * next;
struct quece_node * prior;
}*Quece;
typedef struct node
{
int num;
char name[SIZE];
}Node;
int is_malloc_ok(Quece quece) //内存分配
{
if(NULL == quece)
{
return MALLOC_NO;
}
return MALLOC_OK;
}
int create_node(Quece *quece) //创建结点
{
*quece = (Quece)malloc(sizeof(struct quece_node));
if(MALLOC_OK == is_malloc_ok(*quece))
{
return CREATE_OK;
}
return CREATE_NO;
}
int create_quece_link(Quece *quece) //创建链队
{
if(CREATE_OK == create_node(quece))
{
(*quece)->next = (*quece)->prior = *quece;
return CREATE_OK;
}
return CREATE_NO;
}
int push_quece_link(Quece quece, Node node) //进队
{
Quece new_node = NULL;
if(CREATE_NO == create_node(&new_node))
{
return PUSH_NO;
}
else
{
new_node->num = node.num;
strcpy(new_node->name, node.name);
new_node->next = quece;
quece->prior->next = new_node;
new_node->prior = quece->prior;
quece->prior = new_node;
return PUSH_OK;
}
}
void make_empty(Quece quece) //置空
{
Quece p = NULL;
p = quece->next;
while(p != quece)
{
p->next->prior = quece;
quece->next = p->next;
free(p);
p = quece->next;
}
}
int is_empty(Quece quece) //是否为空
{
if(quece->next == quece || quece->prior == quece)
{
printf("quece is NULL!\n");
return EMPTY_OK;
}
return EMPTY_NO;
}
int pop_quece_link(Quece quece, Node *num) //出队
{
Quece p =NULL;
if(EMPTY_OK == is_empty(quece))
{
return POP_NO;
}
else
{
p = quece->next;
num->num = p->num;
strcpy(num->name, p->name);
quece->next = p->next;
p->next->prior = quece;
free(p);
return POP_OK;
}
}
void release_quece(Quece *quece) //释放
{
make_empty(*quece);
free(*quece);
*quece = NULL;
}
void display(Quece quece) //遍历
{
Quece p = NULL;
if(quece == NULL)
{
printf("quece is no exit!\n");
return ;
}
else if(quece->next == quece)
{
printf("quece is NULL!\n");
return ;
}
else
{
p = quece->next;
while(p != quece)
{
printf("%3d",p->num);
printf("%3s\n", p->name);
p = p->next;
}
}
}
int main()
{
Quece quece = NULL;
Node node;
int i;
if(CREATE_NO == create_quece_link(&quece)) //创建链队
{
return 0;
}
printf("please input name:\n");
for(i = 0; i < 5; i++)
{
node.num = i + 1;
scanf("%s", node.name);
if(PUSH_OK == push_quece_link(quece, node)) //进队
{
printf("push quece is success!\n");
}
else
{
printf("push quece is fail!\n");
}
}
make_empty(quece); //置空
printf("pop quece:\n");
for(i = 0; i < 5; i++)
{
if(POP_OK == pop_quece_link(quece, &node)) //出队
{
printf("%3d", node.num);
printf("%3s\n", node.name);
}
else
{
printf("pop quece is fail!\n");
}
}
release_quece(&quece); //释放
display(quece); //遍历
return 0;
}
(20220221)链式队列实现
最新推荐文章于 2024-11-01 14:28:11 发布