Python,C,C++ and JAVA programs for CBSE, ISC, B.Tech and I.T Computer Science and MCA students

The Programming Project: C Program #15

Thursday, March 21, 2013

C Program #15


/*Dynamic Implementation of Stack With Basic operations!*/

#include<stdio.h>
#include<malloc.h>
#define TRUE 1
#define FALSE 0

struct stack
                        {
                        int item;
                        struct stack *right;
                        };
typedef struct stack node;
node *push(node *);
node *push1(node *,int);
void display(node *);
int Isempty(node *);
void top2bottomu(node *);
void top2bottom(node *);
void pop(node *);
int pop1(node *);
void duplicate(node *);
void filestack(node *, FILE *fp);
void stack2(node *);
int Isequal(node *,node *);
int length(node*);
int main()
{
int choice;
FILE *fp;
fp=fopen("data.txt","w");
node *root,*data,*root1,*data1,*root2,*data2;
root=(node *)malloc(sizeof(node));
root->right=NULL;
data=root;
root1=(node *)malloc(sizeof(node));
root1->right=NULL;
data1=root1;
root2=(node *)malloc(sizeof(node));
root2->right=NULL;
data2=root2;
            do
            {
                        printf("\n Press 1 to push a element:");
                        printf("\n Press 2 for bottom to top:");
                        printf("\n Press 3 to check for empty:");
                        printf("\n Press 4 to print elements from top to bottom,stack becoming empty:");
                        printf("\n Press 5 to pop:");
                        printf("\n Press 6 to print elements from top to bottom,stack unchanged:");
                        printf("\n Press 7 to duplicate the top element of the stack:");
                        printf("\n Press 8 to read from a file and print in reverse order:");
                        printf("\n Press 9 to push element in second stack:");
                        printf("\n Press 10 to display second stack:");
                        printf("\n Press 11 to check if two stacks are equal:");
                        printf("\n Enter choice:");
                        printf("\n Type 12 to exit:");
                        scanf("%d",&choice);
                        switch(choice)
                                    {
                                                case 1:
                                                data=push(data);
                                                data->right=NULL;
                                                break;
                                                case 2:
                                                display(root);
                                                break;
                                                case 3:
                                                if(Isempty(root))
                                                            printf("\n Stack is empty:\n");
                                                else
                                                            printf("\n Stack is not empty:\n");
                                                break;
                                                case 4:
                                                top2bottom(root);
                                                data=root;
                                                break;
                                                case 5:
                                                pop(root);
                                                data=root;
                                                break;
                                                case 6:
                                                top2bottomu(root);
                                                break;
                                                case 7:
                                                duplicate(root);
                                                break;
                                                case 8:
                                                filestack(root1,fp);
                                                break;
                                                case 9:
                                                data2=push(data2);
                                                data2->right=NULL;
                                                break;
                                                case 10:
                                                display(root2);
                                                break;
                                                case 11:
                                                if(Isequal(root,root2))
                                                            printf("\n Stack are equal:\n");
                                                else
                                                            printf("\n Stack are not equal:\n");
                                                break;
                                                default:
                                                break;

                                    }
                        }
                        while(1<=choice && choice<=11);
            return 0;
 }
int Isequal(node *data1,node *data2)
            {
            int flag=FALSE,i;
            if(Isempty(data1) || Isempty(data2))
                        {
                        if(Isempty(data1) && Isempty(data2))
                                    return (TRUE);
                        else
                                    return (FALSE);
                        }
            else
                        {
                         if(length(data1)!=length(data2))
                         //         {printf("{%d,%d}\n",length(data1),length(data2));
                                    return (FALSE);//}
                         else
                                    {
                                    for(i=0;i<=length(data1);i++)
                                                {
                                                if(data1->item!=data2->item)
                                                            flag=TRUE;
                                                data1=data1->right;
                                                data2=data2->right;
                                                }
                                    if(flag==FALSE)
                                                return (TRUE);
                                    else
                                                return (FALSE);
                                    }
                         }
            }
int length(node *data)
            {
            int k=0;
            while(data->right!=NULL)
                        {
                        k++;
                        data=data->right;
                        }
            return(k-1);
            }
void filestack(node *data, FILE *fp)
            {
            node *p;
            p=data;
            fclose(fp);
            fp=fopen("data.txt","w");
            int n,i,x;
            printf("\n Enter the number of elements to be entered in file:");
            scanf("%d",&n);
            for(i=1;i<=n;i++)
                        {
                        printf("\n Enter the %d# elemet:",i);
                        scanf("%d",&x);
                        fprintf(fp,"%d ",x);
      }
            fclose(fp);
            fp=fopen("data.txt","r");
            printf("\n Elements in the file:");
            for(i=1;i<=n;i++)
                        {
                        fscanf(fp,"%d",&x);
                        printf("%d ",x);
                        data=push1(data,x);
                        data->right=NULL;
                        }
            fclose(fp);
            printf("\n Elements from the file in reverse order:");
            top2bottomu(p);
            printf("\n");
            }
node *push1(node *data,int x)
            {
  //        node *p;
            while(data->right!=NULL)
                        data=data->right;
            data->item=x;
            data->right=(node *)malloc(sizeof(node));
            data=data->right;
            return(data);
            }
void duplicate(node *data)
            {
            node *p,*q;
            q=(node *)malloc(sizeof(node));
            p=data;
            int x;
            while(p->right->right!=NULL)
                        p=p->right;
            x=p->item;
            p->right->item=x;
            p->right->right=q;
            q->right=NULL;
   }
void top2bottom(node *data)
            {
                        while(!Isempty(data))
                                    {
                                    pop(data);
                                    }
            }
void pop(node *data)
            {
            node *p;
            if(Isempty(data))
                        {
                                    printf("\n Stack is empty, cannot be popped:\n");
                        }
            else
                        {
                                    if(data->right->right==NULL)
                                                {
                                                printf("\nElement popped out is %d \n",data->item);
                                                p=data;
                                                free(data);
                                                p->right=NULL;
                                                }
                                    else
                                                {
                                                while(data->right->right->right!=NULL)
                                                            data=data->right;
                                                            p=data->right;
                                                            printf("\nElement popped out is %d \n",p->item);
                                                            free(p);
                                                            data->right->right=NULL;

                                                }
                        }
            }
void top2bottomu(node *data)
            {
            node *q;
            q=data;
            int k=0,i,*a;
            while(data->right!=NULL)
                        {
                        k++;
                        data=data->right;
                        }
            //printf("%d.....\n",k);
            a=(int*)malloc(k*sizeof(int));
            for(i=0;i<k;i++)
                        {
                        *(a+i)=q->item;
                        q=q->right;
                        }
            for(i=k-1;i>=0;i--)
                        printf("%d ",*(a+i));

   free(a);
            printf("\n");
            }
int Isempty(node *data)
            {
                        if(data->right==NULL)
                                    return (TRUE);
                        else
                                    return (FALSE);
            }
node *push(node *data)
            {
  //        node *p;
            while(data->right!=NULL)
                        data=data->right;
            printf("\n Enter the element to be inserted:");
            scanf("%d",&data->item);
            data->right=(node *)malloc(sizeof(node));
            data=data->right;
            return(data);
            }
void display(node *data)
            {
                        if(Isempty(data))
                                    printf("\n Stack is empty, nothing to display:\n");
            else{    while(data->right!=NULL)
                                    {
                                    printf("%d ",data->item);
                                    data=data->right;
                                    }
                         }
            printf("\n");
            }
int pop1(node *data)
            {
            node *p;
            if(Isempty(data))
                        {
                                    printf("\n Stack is empty, cannot be popped:\n");
                        }
            else
                        {
                                    if(data->right->right==NULL)
                                                {
            p=data;
                                                p->right=NULL;
            return(data->item);
                                                }
                                    else
                                                {
                                                while(data->right->right->right!=NULL)
                                                            data=data->right;
                                                            p=data->right;
                                                            data->right->right=NULL;
                                                            return(p->item);
                                                            }
                        }
            }

No comments:

Post a Comment