带表头结点的链表进行栈操作
2016-11-09 21:43
218 查看
#include <stdio.h>
#include <stdlib.h>
/*定义结构体,用户自定义*/
struct node
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
enum return_result{EMPTY_OK,EMPTY_NO,PUSH_OK,PUSH_NO,POP_OK,POP_NO};
/*分配单元*/
void is_malloc_ok(Link new_node)
{
if(new_node == NULL)
{
printf("malloc error!\n");
exit(-1);
}
}
void create_newnode(Link * top)
{
*top = (Link) malloc(sizeof(Node));
is_malloc_ok(*top);
}
void create_stack(Link *top)
{
*top = (Link) malloc(sizeof(Node));
is_malloc_ok(*top);
}
/*初始化函数*/
void init_stack(Link *top )
{
(*top)->next = NULL;
}
/*判断栈是否为空,由于链表,故不用判断栈满*/
int is_stack_empty(Link top)
{
if(top->next == NULL)
{
return EMPTY_OK;
}else
{
return EMPTY_NO;
}
}
/*入栈操作*/
int push_stack(Link*top,Link new_node,int num)
{
create_newnode(&new_node);
new_node->num=num+1;
new_node->next=((*top)->next);
((*top)->next)=new_node;
return PUSH_OK;
}
/*出栈操作*/
int pop_stack(Link*top)
{
int temp;
if ( is_stack_empty(*top) == EMPTY_OK )
{
printf("the stack is empty!\n");
return POP_NO;
}
else
{
temp = (*top)->next->num;
free((*top)->next);
(*top)->next = (*top)->next->next;
return temp;
}
}
int main()
{
Link top = NULL;//定义栈指针
Link new_node = NULL;//定义新结点
int i;
int temp;
create_stack(&top);
init_stack(&top);
for (i=0;i<10;i++)
{
create_stack(&new_node);
is_malloc_ok(new_node);
if(push_stack(&top,new_node,i) == PUSH_OK);
{
printf("PUSH_OK\n");
}
}
for ( i = 0 ; i <= 10 ; i++ )
{
temp = pop_stack(&top);
if(temp != POP_NO)
{
printf("%d\n",temp);
}
}
return 0;
}
#include <stdlib.h>
/*定义结构体,用户自定义*/
struct node
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
enum return_result{EMPTY_OK,EMPTY_NO,PUSH_OK,PUSH_NO,POP_OK,POP_NO};
/*分配单元*/
void is_malloc_ok(Link new_node)
{
if(new_node == NULL)
{
printf("malloc error!\n");
exit(-1);
}
}
void create_newnode(Link * top)
{
*top = (Link) malloc(sizeof(Node));
is_malloc_ok(*top);
}
void create_stack(Link *top)
{
*top = (Link) malloc(sizeof(Node));
is_malloc_ok(*top);
}
/*初始化函数*/
void init_stack(Link *top )
{
(*top)->next = NULL;
}
/*判断栈是否为空,由于链表,故不用判断栈满*/
int is_stack_empty(Link top)
{
if(top->next == NULL)
{
return EMPTY_OK;
}else
{
return EMPTY_NO;
}
}
/*入栈操作*/
int push_stack(Link*top,Link new_node,int num)
{
create_newnode(&new_node);
new_node->num=num+1;
new_node->next=((*top)->next);
((*top)->next)=new_node;
return PUSH_OK;
}
/*出栈操作*/
int pop_stack(Link*top)
{
int temp;
if ( is_stack_empty(*top) == EMPTY_OK )
{
printf("the stack is empty!\n");
return POP_NO;
}
else
{
temp = (*top)->next->num;
free((*top)->next);
(*top)->next = (*top)->next->next;
return temp;
}
}
int main()
{
Link top = NULL;//定义栈指针
Link new_node = NULL;//定义新结点
int i;
int temp;
create_stack(&top);
init_stack(&top);
for (i=0;i<10;i++)
{
create_stack(&new_node);
is_malloc_ok(new_node);
if(push_stack(&top,new_node,i) == PUSH_OK);
{
printf("PUSH_OK\n");
}
}
for ( i = 0 ; i <= 10 ; i++ )
{
temp = pop_stack(&top);
if(temp != POP_NO)
{
printf("%d\n",temp);
}
}
return 0;
}
相关文章推荐
- 带表头结点的链表进行栈操作(练习)
- C语言单链表的基本操作(带表头结点)
- 2.14在带头结点的单链表中进行Length操作
- 数据结构学习笔记(二) 链表之带表头结点的双循环链表基本操作
- 对链表进行创建、结点的删除和插入操作
- 试编写在无头结点的单链表上实现线性表的插入操作的算法,并和带头结点的单链表上的插入操作的算法进行比较
- 数据结构学习笔记(二) 链表之带表头结点的单链表及其基本操作
- 链表操作 对链表进行输入,插入,删除结点,按关键字进行查找操作 C语言
- 数据结构学习笔记(二) 链表之带表头结点的单循环链表基本操作
- func2-3-1.c 不带头结点的单链表的扩展操作
- 链表操作(删除链表中的一个结点)
- 用C语言编写一个双链表,每个结点存储学生的编号以及姓名,遍历这个双链表,并将学号按照从小到大进行排序
- 单链表、带头结点的单链表、循环单链表 以及其操作实现
- 不带头结点的单链表插入操作隐含的错误、、
- bo2-3.c 带有头结点单链表的基本操作
- c语言实现--不带头结点的单链表操作
- 链表操作(插入一个结点和删除一个结点)
- 使用有头结点的链表进行逆置
- 银行项目(使用链表进行操作)
- 对 带头结点的单链表 的操作