Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Linked list stack and queue

Reply
Thread Tools

Linked list stack and queue

 
 
AMRaymo@gmail.com
Guest
Posts: n/a
 
      04-12-2005
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");
}

 
Reply With Quote
 
 
 
 
Darius
Guest
Posts: n/a
 
      04-12-2005

(E-Mail Removed) 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

 
Reply With Quote
 
 
 
 
SM Ryan
Guest
Posts: n/a
 
      04-13-2005
http://www.velocityreviews.com/forums/(E-Mail Removed) 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.
 
Reply With Quote
 
Default User
Guest
Posts: n/a
 
      04-13-2005

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

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Program blocked in Queue.Queue.get and Queue.Queue.put Kris Python 0 01-04-2012 03:46 PM
C/C++ compilers have one stack for local variables and return addresses and then another stack for array allocations on the stack. Casey Hawthorne C Programming 3 11-01-2009 08:23 PM
Linked list within a linked list joshd C++ 12 10-02-2006 08:57 AM
Linked list, New try (was:Linked list, no out put,help) fool C Programming 14 07-03-2006 12:29 AM
Is Queue.Queue.queue.clear() thread-safe? Russell Warren Python 4 06-27-2006 03:03 PM



Advertisments