5、数据结构笔记之五链栈实现
“人生就像奕棋,一步失误,全盘皆输。”
对栈和队列进行了定义。这次我们来看下如何使用代码来实现链栈和链队列。
1. 定义结构体
#defineMAX_STACKS10
typedefstruct {
intkey;
/*otherfields */
}element;
typedefstructstack *stack_pointer;
typedefstructstack {
elementitem;
stack_pointerlink;
};
stack_pointer top[MAX_STACKS];
两个结构体,其中一个结构包含在另一个结构体中。
定义了链栈中节点上限数量为10.
2. 链栈的插入
void add(stack_pointer *top,elementitem)
{
stack_pointertemp = (stack_pointer)malloc(sizeof(stack));
if(IS_EMPTY(temp)){
fprintf(stderr,"Thememory is full\n");
exit(1);
}
temp->item= item;
temp->link=*top;
*top =temp;
}
函数需要输入top 指向栈顶元素。需要入栈的元素,element。
3. 链栈的删除
删除节点函数,返回栈顶元素,并改变top,使其指向包含在其链域中的地址。典型调用item=deletenode(&top[stack_no]);
element deletenode(stack_pointer *top){
stack_pointertemp = *top;
elementitem;
if (IS_EMPTY(temp)){
fprintf(stderr,"Thestack is empty\n");
exit(1);
}
item= temp->item;
*top =temp->link;
free(temp);
returnitem;
}
4. 链栈输出
为便于调式,输出整个链栈中的值。
void print_node( stack_pointertop){
if (IS_EMPTY(top)){
fprintf(stderr,"Thestack is empty\n");
exit(1);
}
for(top;top;top=top->link)
{
printf("%d ",top->item);
}
}
5. 链栈综合
如下代码实现一个综合性的测试:
void main()
{
inti;
elementtemp ;
for(i=0;i<10;i++)
{
top[i]= NULL;
}
for(i=0;i<10;i++)
{
temp.key= i;
add(&header,temp);
}
printf("afteradd 10 nodes\n");
print_node(header);
printf("\n");
for(i=0;i<4;i++)
{
deletenode(&header);
}
printf("afterdelete 4 nodes\n");
print_node(header);
printf("\n");
for(i=0;i<6;i++)
{
deletenode(&header);
}
printf("afterdelete left 6 nodes\n");
print_node(header);
}
6. 链栈源码
方便大家编译,所有代码复制如下:
#include"stdio.h"
#include"stdlib.h"
#defineIS_EMPTY(ptr)(!(ptr))
#defineIS_FULL(ptr) (!(ptr))
#defineMAX_STACKS10
typedefstructelement{
intkey;
/*otherfields */
}element;
typedefstructstack *stack_pointer;
typedefstructstack {
elementitem;
stack_pointerlink;
}stack;
stack_pointer top[MAX_STACKS];
stack_pointer header =NULL;
void add(stack_pointer *top,elementitem)
{
stack_pointertemp = (stack_pointer)malloc(sizeof(stack));
if(IS_EMPTY(temp)){
fprintf(stderr,"Thememory is full\n");
exit(1);
}
temp->item= item;
temp->link=*top;
*top =temp;
header= temp;
}
element deletenode(stack_pointer *top){
stack_pointertemp = *top;
elementitem;
if (IS_EMPTY(temp)){
fprintf(stderr,"Thestack is empty\n");
exit(1);
}
item= temp->item;
header= temp->link;
free(temp);
returnitem;
}
void print_node( stack_pointertop){
if (IS_EMPTY(top)){
fprintf(stderr,"Thestack is empty\n");
exit(1);
}
for(top;top;top=top->link)
{
printf("%d ",top->item);
}
}
void main()
{
inti;
elementtemp ;
for(i=0;i<10;i++)
{
top[i]= NULL;
}
for(i=0;i<10;i++)
{
temp.key= i;
add(&header,temp);
}
printf("afteradd 10 nodes\n");
print_node(header);
printf("\n");
for(i=0;i<4;i++)
{
deletenode(&header);
}
printf("afterdelete 4 nodes\n");
print_node(header);
printf("\n");
for(i=0;i<6;i++)
{
deletenode(&header);
}
printf("afterdelete left 6 nodes\n");
print_node(header);
}