|
|
Linked list stack and queue
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)
|
|
|
|
|
|
|
|
|