Monday, June 27, 2011

Modify STACK EXAMPLE to create A DYNAMIC QUEUE


DYNAMIC QUEUE using DYNAMIC STACK

//TITLE         DYNAMIC QUEUE by modifying DYNAMIC STACK
//AUTHOR        VINAY CHOUDHARY
//DATE          26 OCT 2009


//This is a C program for DYNAMIC queue using stack functions

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

#define NUM 5

/*
*pos  :    we will use "pos" to point to top element in array,            used in pop, value updates in push.
*arr  :    pointer to array which is allocated memory at run-time.Can be replaced by static array. Just comment out part where we are using malloc() for array in push().
num   :    "num" tells how much data is present.
*next :    "*next" is pointer to next stack element.
*/

typedef struct blk{
     int *pos;                 
     int *arr;                 
     int num;         
     struct blk *next;   
}stack;

/*
PUSH FUCTION : we pass head as pointer and data here. Head is stored in backup for returning new value when stack is created for first time, else it contains old head value.

In loop above we check if head exists and go to last stack,which has next == null. There we check if head(stack) exists or not or if array is full for current last stack. In both cases we create a new stack as temp. temp points to NULL, since it will be last stack and has no data at present so num = 0 for temp and make pos to point to base of arr.

Now if stack doesnt exist then assign temp as head of stack since we will add data to it. Also since this is new head, store it in backup for returning purpose, else if array has filled for current last stack attach newly created temp stack to stack by storing its address in next of curent stack and make head same as temp since we add data to newly created stack(temp) using head(head=temp).

Then add data and increment index and return backup
*/

stack* push(stack *head,int data)
{         
     stack* backup,*temp;                
     for(backup = head;head && head->next != NULL;head = head->next);               
     if(head == NULL || head->num == NUM)
     {              
           temp = (stack *)malloc(1*sizeof(stack));  
           temp->arr = (int*)malloc(NUM*sizeof(int));
           temp->next = NULL;                                  
           temp->num = 0;      
           temp->pos = temp->arr;                              
           if(backup == NULL)
                backup = head = temp;
           else if(head->num == NUM)
                head = head->next = temp;
     }                                        

     head->arr[head->num++] = data
    
     return backup;
}

//POP FUNCTION: we pass head as pointer and data as pointer here.
//save backup as head;
//Read data at pos. pos is where queue starts
//since data at pos is read, now we will read next element next time so //pos++
//and take data in pointer passed, which is collected in main
//here we check if array of current last stack has become empty, if so
//second last stack, use temp to make second last stack to point to NULL. //Hence stack
//pointed by temp is now the last stack. Free memory of stack to be deleted.
//NOTE THAT stack is deleted only when no data is left
//whether updated or not return backup which is collected as head in main //program

stack* pop(stack *head,int *data)
{        
stack* backup,*temp=NULL;

     backup = head;                                 
     *data = *head->pos;       
     head->pos++;              
     --head->num;                   
if(head->num == 0)
{                    
temp = head->next;
           free(head->arr);    
           free(head);               
           backup = temp;           
}         
     return backup; 
}

void display(stack *head)
{   
     int *p,i;                                 
    
     printf("\nCURRENT STACK: ");
    
     if(!head)
           printf("DOESN'T EXIST");
    
     while(head)
{
           for(i=0,p=head->pos;i<head->num;p++,i++)
                printf("%d ",*p);
           head = head->next;
     }
}

void main()
{
     stack *head=NULL;
     int data,run=1;
     char ch;

     while(run)
{
           display(head);
           printf("\n\nWHAT TO DO ?");
           printf("\n1. PUSH\n2. POP\n3. DISPLAY\n4. EXIT\nYOUR OPTION : ");
           scanf(“%c”,&ch);
           switch(ch)
{
                case '1':
{
                     printf("Enter number to push: ");
                     scanf(“%d”,&data);
                     head = push(head,data);        
                     break;
                }
    
                case '2':
{                                         
                     if( (head) )
{                              
                           head = pop(head,&data);   
                           printf("DATA POPPED: %d",data);
                          
                     }
                     else
                           printf("CAN'T POP: NO DATA IN STACK");
                     break;
                }
    
                case '3':
{
                     display(head);
                     break;
                }

                case '4':
{
                     run = 0;
                     break;
                }
               
                default:
{
                     printf("\nENTER VALID OPTION");
                     break;
                }
           }
     }

     printf("\n\n");
}

A STACK PROGRAM EXAMPLE.

PROBLEM : we must create a stack using linked list with following specifications:
1. USING LINKED LIST
2. DYNAMIC IN SIZE
3. EACH STACK NODE CONTAINS AN ARRAY OF N(=5 in code) SIZE.

SAMPLE DIAGRAM


The code is shown below:


//TITLE         DYNAMIC STACK

//AUTHOR        VINAY CHOUDHARY

//DATE          26 OCT 2009





//This is a C program for DYNAMIC STACK



#include<stdio.h>

#include<stdlib.h>

#include<conio.h>





#define NUM 5



//pointer to array which is allocated memory at run-time. Can be //replaced by static

//array. Just comment out part where we are using malloc() for array //in push(). "num"

//tells how much data is present. "*next" is pointer to next stack



typedef struct blk

{

     int *arr;                 

     int num;                  

     struct blk *next;         

}stack;



//PUSH FUCTION : we pass head as pointer and data here.

//head is stored in backup for returning new value when

//stack is created for first time, else it contains old head value.

//In for loop we check if head exists and go to last stack,which has //next == null

//here we check if head(stack) exists or not or if array is

//full for current last stack. In both cases we create a new stack

//as temp. temp points to NULL, since it will be last stack

//and has no data at present so num = 0 for temp.

//now if stack doesnt exist then assign temp as head of stack since //we will add data to it. Also since this is new head store it in //backup for returning purpose,else if array has filled for current //last stack attach newly created temp stack to stack by storing its //address in next of curent stack and make head same as temp since //we add data to newly created stack(temp) using head(head=temp)



//add data

//and increment index. THIS INDEX CAN BE USED AS STACK POINTER



stack* push(stack *head,int data)

{         

     stack* backup,*temp;                

                                                    

     for(backup = head;head && head->next != NULL;head = head->next);               

    

     if(head == NULL || head->num == NUM){          

           temp = (stack *)malloc(1*sizeof(stack));  

           temp->arr = (int*)malloc(NUM*sizeof(int));

           temp->next = NULL;                                  

           temp->num = 0; 

           if(backup == NULL)             

                backup = head = temp;

           else if(head->num == NUM)      

                head = head->next = temp; 

     }                                              



     head->arr[head->num] = data;   

     head->num = head->num + 1;     



     return backup;

}



//POP FUNCTION: we pass head as pointer and data as pointer here.

//temp will have first stack if there is only one stack else it //stores second last stack address

//in loop above we intialise temp = head and go to last stack //structure.

//decrement index. THIS INDEX CAN BE USED AS STACK POINTER

//and take data in pointer passed, which is collected in main.

//here we check if array of current last stack has become empty, if //so we need to delete it. But if there was only one stack (then //temp == head), make backup point to NULL and return it later, //since existing stack will //be removed.

//if there were more than one stacks, then delete last one. Since //temp has address of

//second last stack, use temp to make second last stack to point to //NULL. Hence stack pointed by temp is now the last stack. Free //memory of stack to be deleted.



stack* pop(stack *head,int *data)

{   

     stack* backup=NULL,*temp=NULL;

    

     for(backup = head,temp = head;head->next != NULL;temp = head,head = head->next);

    

     head->num = head->num - 1;     

     *data = head->arr[head->num];  



     if(head->num == 0)

{         

           if(temp == head)    

                backup = NULL; 

           temp->next=NULL;    

           free(head->arr);    

           free(head);               

     }

     return backup;

}



void display(stack *head)

{

     int i;

    

     printf("\nCURRENT STACK: ");

    

     if(!head)

           printf("DOESN'T EXIST");

    

     while(head)

{

           for(i=0;i<head->num;i++)

                printf("%d ",head->arr[i]);

           head = head->next;

     }

}



void main()

{

     stack *head=NULL;

     int data,run=1,cls=0;

     char ch;



     while(run)

{

           display(head);

           printf("\n\nWHAT TO DO ?");

           printf("\n1. PUSH\n2. POP\n3. DISPLAY\n4. EXIT\nYOUR OPTION : ");

           scanf(“%c”,&ch);

           switch(ch)

{

                case '1':{

                     printf("Enter number to push: ");

                     scanf(“%d”,&data);

                     head = push(head,data);        

                     break;

                }

    

                case '2':{                                

                     if( (head) )

{                              

                           head = pop(head,&data);   

                           printf("DATA POPPED: %d",data);

                     }

                     else

                           printf("CAN'T POP: NO DATA IN STACK");

                     break;

                }

    

                case '3':{

                     display(head);

                     break;

                }



                case '4':{

                     run = 0;

                     break;

                }

               

                default:{

                     system("cls");

                     printf("\nENTER VALID OPTION");

                     break;

                }

           }

     }



     printf("\n\n\);

}

Starting with DS : Dynamic queue in c

//This is a C program for DYNAMIC STACK

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

#define NUM 5
 /*
*pos  :     we will use "pos" to point to top element in array, used in pop, value updates in push.
*arr  :    pointer to array which is allocated memory at run-time. Can be replaced by static array Just       comment out part where we are using malloc() for array in push().
num   :    "num" tells how much data is present.
*next :    "*next" is pointer to next stack element.
*/


typedef struct blk{
    int *pos;   
    int *arr;    
    int num;   
    struct blk *next;       
}stack;

//PUSH FUCTION : we pass head as pointer and data here.
stack* push(stack *head,int data){       stack* backup,*temp;                //head is stored in backup for returning new value when
                                        //stack is created for first time, else it contains old head value.
    for(backup = head;head && head->next != NULL;head = head->next);           
    //in loop above we check if head exists and go to last stack,which has next == null
    if(head == NULL || head->num == NUM){            //here we check if head(stack) exists or not or if array is
        temp = (stack *)malloc(1*sizeof(stack));    //full for current last stack. In both cases we create a new stack
        temp->arr = (int*)malloc(NUM*sizeof(int));    //as temp. temp points to NULL, since it will be last stack
        temp->next = NULL;                            //and has no data at present so num = 0 for temp.
        temp->num = 0;       
        temp->pos = temp->arr;                        //make pos to point to base of arr   
        if(backup == NULL)            //now if stack doesnt exist then assign temp as head of stack since we will add
            backup = head = temp;    //data to it. Also since this is new head store it in backup for returning purpose
        else if(head->num == NUM)        //else if array has filled for current last stack attach newly created temp stack
            head = head->next = temp;    //to stack by storing its address in next of curent last stack and make head
    }                                    //same as temp since we add data to newly created stack(temp) using head(head=temp)

    head->arr[head->num++] = data;    //add data and increment index.
   
    return backup;        //whether updated or not return backup which is collected as head in main program
}

stack* pop(stack *head,int *data){    //POP FUNCTION: we pass head as pointer and data as pointer here.
    stack* backup,*temp=NULL;

    backup = head;            //save backup as head;               
    *data = *head->pos;        //Read data at pos. pos is where queue starts
    head->pos++;            //since data at pos is read, now we will read next element next time so pos++
    --head->num;            //and take data in pointer passed, which is collected in main
    if(head->num == 0){        //here we check if array of current last stack has become empty, if so
        temp = head->next;
        free(head->arr);    //second last stack, use temp to make second last stack to point to NULL. Hence stack
        free(head);            //pointed by temp is now the last stack. Free memory of stack to be deleted.
        backup = temp;        //NOTE THAT stack is deleted only when no data is left
    }       
    return backup;    //whether updated or not return backup which is collected as head in main program
}

void display(stack *head,int clear){    //DISPLAY FUNCTION: its quite simple, clear is just a flag
    int *p,i;                            //to use system("cls"), to clear the screen. See main and u will
                                        //know, or execute the program
    if(clear)    system("cls");   
    printf("\nCURRENT STACK: ");
   
    if(!head)
        printf("DOESN'T EXIST");
   
    while(head){
        for(i=0,p=head->pos;i<head->num;p++,i++)
            printf("%d ",*p);
        head = head->next;
    }
}

void main(){
    stack *head=NULL;
    int data,run=1,cls=0;
    char ch;

    while(run){
        display(head,cls);
        cls = 0;                        //cls is made 0 so that if it was 1 (since we called display())
        printf("\n\nWHAT TO DO ?");
        printf("\n1. PUSH\n2. POP\n3. DISPLAY\n4. EXIT\nYOUR OPTION : ");
        cin>>ch;
        switch(ch){
            case '1':{
                printf("Enter number to push: ");
                cin>>data;
                system("cls");
                head = push(head,data);       
                break;
            }
   
            case '2':{
                system("cls");                               
                if( (head) ){                    //pop only if stack exists   
                    head = pop(head,&data);   
                    printf("DATA POPPED: %d",data);
                   
                }
                else
                    printf("CAN'T POP: NO DATA IN STACK");
                break;
            }
   
            case '3':{
                cls = 1;                    //make cls=1 since we are calling this function
                display(head,cls);
                break;
            }

            case '4':{
                run = 0;
                break;
            }
           
            default:{
                system("cls");
                printf("\nENTER VALID OPTION");
                break;
            }
        }
    }

    printf("\n\n\n");
    system("pause");
}

Sunday, June 26, 2011

My First Post!

Hi everyone,
This is my first blog and here I'll be sharing my programs written in c for
1) DATA STRUCTURES
2) OS/LINUX
3) COMPILER DESIGN
4) MISC C programs
5) ASSEMBLY (8051)

Hope it'll help guys starting to program.










Monday, October 18, 2010

My First balance Mod for Life is Feaudal Forrest Village

Hi All,

I have created a re-balance MOD. It has following changes:

Game Play changes:
- Increased Upgraded Housing Capacity: 2x (6,10,20 for shacks, small house and house respectively)
- Increased Capacity for Hospital & Tavern ( to 20)
- Increased Storage for Barn and Warehouse (2x: 16000 and 12000 respectively)
- Increase Milk and eggs production ( by 2x and 2.66x)
- Decreased Bread Production time by 3x and Changed Required amount of Water to produce bread (2.5 instead of 3)
- Reduced Pyre Burn time by 6x (Bodies burn rather quickly than depicted in game)
- Reduced starting resourced limits by 10x
- Increased Logs output from trees by 1.5x


Starting condition changes:
- Start with 10 adults instead of 6
- start with 3-4 small houses instead of shacks
- Increased starting resources
- Better placement of building to start with

--------------------------------------------------------------------------------------------------------------------------
Finally, you can help me in creating and maintaining by donating some amount of money to my PayPal account (you might need to create an account :), here: PAY ME HERE.
--------------------------------------------------------------------------------------------------------------------------

*********************************************************************************
Instructions:
  1. Download here: Vinays_rebalance_mod_v1_0.9.4457
  2. Download here: Vinays_rebalance_mod_v1_0.9.4513
  3. Download here: Vinays_rebalance_mod_v1_0.9.4540
Extract the "cfg" folder in .rar file and put in game root directory. That's it :)
*********************************************************************************