Linked list stack and queue

  • Follow


Can someone guide me in the right direction on how to enqueue and
dequeue/pop and push within a linked list?  I've figured out the basic
idea, but getting the other options in it seems ot be a problem.

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

struct info {
        char name[16];
        int  age;
        struct info *next;  // pointer to next data item in list
} prsn;

struct info *top;     // establish start of list

// proto types
struct info *sort_store(struct info *new, struct info *top);
void display(struct info *start);


int main()
{    struct info *person, *sort_store();
    system("cls");
        printf("What would you like to do?\n");
        printf("1 - Push to the stack\n");
        printf("2 - Pop from the stack\n");
        printf("3 - Display the stack\n");
        printf("\n - Quit\n");
   system("cls");
        printf("What would you like to do?\n");
        printf("1 - Push to the stack\n");
        printf("2 - Pop from the stack\n");
        printf("3 - Display the stack\n");
        printf("\n0 - Quit\n");
        scanf("%i", &intChoice);


    case: 1
    (
    );break;

    case: 2
    (
    );break;
    case: 3
    (
    );break;
    case
        printf("\nEnter names and ages:\n");
        for (;;)
        {
                person = (struct info *) malloc(sizeof(prsn));
                if (!person)
                {
                        puts("Stack is full. Cannot Push!\n\n");
                        break;
                }
                printf("\nEnter name : ");
                scanf("%s",person->name);
                // flush the input stream in case of bad input
                fflush(stdin);
                // mimic an AND situation
                if (strlen(person->name) == 1)
                {
                        if (person->name[0] == 'q') break;
                }
                printf("Enter age  : ");
                scanf("%d",&person->age);
                // flush the input stream in case of bad input
                fflush(stdin);

                // store data and update top of list
                top = sort_store(person,top);
        }
        // display the sorted list from the top
        display(top);

        getchar();  // wait
        return 0;
}

//
// insert new data to the list in sorted order
//
struct info *sort_store(struct info *new, struct info *top)
{
        static struct info *last = NULL;
        struct info *old, *start;

        start = top;
        if (!last)
        {
                new->next = NULL;
                last      = new;
                return (new);
        }
        old = NULL;
        while (top)
        {
                // sort by name in ascending order
                if (strcmp(top->name, new->name) < 0)
                {
                        old = top;
                        top = top->next;
                }
                else
                {
                        if (old)
                        {
                                old->next = new;
                                new->next = top;
                                return (start);
                        }
                        new->next = top;
                        return (new);
                }
        }
        last->next = new;
        new->next  = NULL;
        last       = new;
        return (start);
}

//
// walk through the linked list and display the content
//
void display(struct info *start)
{
        while (start)
        {
                printf(" [%s  , %2d]", start->name, start->age);
                start = start->next;
        }
        printf("\n");
}

0
Reply AMRaymo (1) 4/12/2005 9:31:15 PM

AMRa...@gmail.com wrote:
> Can someone guide me in the right direction on how to enqueue and
> dequeue/pop and push within a linked list?  I've figured out the
basic
> idea, but getting the other options in it seems ot be a problem.
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
>
> struct info {
>         char name[16];
>         int  age;
>         struct info *next;  // pointer to next data item in list
> } prsn;
>
> struct info *top;     // establish start of list
>
> // proto types
> struct info *sort_store(struct info *new, struct info *top);
> void display(struct info *start);
>
>
> int main()
> {    struct info *person, *sort_store();
>     system("cls");
>         printf("What would you like to do?\n");
>         printf("1 - Push to the stack\n");
>         printf("2 - Pop from the stack\n");
>         printf("3 - Display the stack\n");
>         printf("\n - Quit\n");
>    system("cls");
>         printf("What would you like to do?\n");
>         printf("1 - Push to the stack\n");
>         printf("2 - Pop from the stack\n");
>         printf("3 - Display the stack\n");
>         printf("\n0 - Quit\n");
>         scanf("%i", &intChoice);
>
>
>     case: 1
>     (
>     );break;
>
>     case: 2
>     (
>     );break;
>     case: 3
>     (
>     );break;
>     case
>         printf("\nEnter names and ages:\n");
>         for (;;)
>         {
>                 person = (struct info *) malloc(sizeof(prsn));
>                 if (!person)
>                 {
>                         puts("Stack is full. Cannot Push!\n\n");
>                         break;
>                 }
>                 printf("\nEnter name : ");
>                 scanf("%s",person->name);
>                 // flush the input stream in case of bad input
>                 fflush(stdin);
>                 // mimic an AND situation
>                 if (strlen(person->name) == 1)
>                 {
>                         if (person->name[0] == 'q') break;
>                 }
>                 printf("Enter age  : ");
>                 scanf("%d",&person->age);
>                 // flush the input stream in case of bad input
>                 fflush(stdin);
>
>                 // store data and update top of list
>                 top = sort_store(person,top);
>         }
>         // display the sorted list from the top
>         display(top);
>
>         getchar();  // wait
>         return 0;
> }
>
> //
> // insert new data to the list in sorted order
> //
> struct info *sort_store(struct info *new, struct info *top)
> {
>         static struct info *last = NULL;
>         struct info *old, *start;
>
>         start = top;
>         if (!last)
>         {
>                 new->next = NULL;
>                 last      = new;
>                 return (new);
>         }
>         old = NULL;
>         while (top)
>         {
>                 // sort by name in ascending order
>                 if (strcmp(top->name, new->name) < 0)
>                 {
>                         old = top;
>                         top = top->next;
>                 }
>                 else
>                 {
>                         if (old)
>                         {
>                                 old->next = new;
>                                 new->next = top;
>                                 return (start);
>                         }
>                         new->next = top;
>                         return (new);
>                 }
>         }
>         last->next = new;
>         new->next  = NULL;
>         last       = new;
>         return (start);
> }
>
> //
> // walk through the linked list and display the content
> //
> void display(struct info *start)
> {
>         while (start)
>         {
>                 printf(" [%s  , %2d]", start->name, start->age);
>                 start = start->next;
>         }
>         printf("\n");
> }


knuth vol 1

0
Reply ranveerkunal (24) 4/12/2005 10:04:45 PM


AMRaymo@gmail.com wrote:
# Can someone guide me in the right direction on how to enqueue and
# dequeue/pop and push within a linked list?  I've figured out the basic
# idea, but getting the other options in it seems ot be a problem.

typedef struct Cell Cell,*pCell;
typedef struct List List;

struct Cell {
	pCell next;
	...
};
struct List {
	pCell first,last;
};

pCell newcell(void) {
	pCell x =  malloc(sizeof(Cell));
	memset(x,0,sizeof(Cell));
	return x;
}

pCell push(List *list) {
	pCell x = newCell();
	x->next = list->first;
	if (!list->first) list->last = x;
	list->first = x;
	return x;
}

pCell pop(List *list) {
	if (list->first) {
		pCell x = list->first;
		list->first = x->next;
		return x;
	}else {
		return 0;
	}
}

pCell top(List *list) {
	return list->first;
}

#define empty(list) (!top(list))

pCell append(List *list) {
	pCell x = newcell();
	if (list->first) list->first = x;
	else list->last->next = x;
	list->last = x;
	return x;
}

pCell bottom(List *list) {
	return list->first ? list->last : 0;
}

--
SM Ryan http://www.rawbw.com/~wyrmwif/
I think that's kinda of personal; I don't think I should answer that.
0
Reply wyrmwif (945) 4/13/2005 1:34:27 AM

Darius wrote:

[HUGE snip]

> knuth vol 1


Is there some reason you felt the need to quote over 100 lines just to
add on rather cryptic statement?




Brian

0
Reply defaultuserbr (3657) 4/13/2005 5:37:36 PM

3 Replies
34 Views

(page loaded in 0.141 seconds)


Reply: