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);

 

}