By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
424,961 Members | 1,333 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,961 IT Pros & Developers. It's quick & easy.

Linked list stack and queue

P: n/a
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");
}

Nov 14 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a

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

Nov 14 '05 #2

P: n/a
AM*****@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.
Nov 14 '05 #3

P: n/a

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

Nov 14 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.