Implementing a stack using a linked-list
Clash Royale CLAN TAG#URR8PPP
up vote
2
down vote
favorite
In my intro CS class we're reviewing data structures. I'm currently working on implementing a stack using a linked list (LIFO) in C. I'd appreciate a review of the implementation as well as of my understanding of how a stack should work.
// This program is implementation of stack data structure
// via linked list (LAST IN FIRST OUT STRUCTURE) LIFO
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
char string[20];
struct node *next;
node;
node *push(char *element, node *head);
node *pop(node *head);
void destroy_stack(node *p);
int main(void)
// create new stack
node *stack = NULL;
// push 6 "functions" to the stack
char *function[6] = "first funct", "second funct", "third funct",
"fourth funct", "fifth funct", "sixt funct";
for (int i = 0; i < 6; i++)
printf("function is : %sn",function[i]);
stack = push(function[i], stack);
if (!stack)
fprintf(stderr,"Not enough memory space for new list");
return 1;
// display the stack
for (node *temp = stack; temp != NULL; temp = temp -> next)
printf("Elements of the stack are: %sn", temp -> string);
// pop the elements from the stack
while (stack != NULL)
printf("Popped elemet is: %sn", stack -> string);
stack = pop(stack);
destroy_stack(stack);
return 0;
node *push(char *element, node *head)
// create space for new element on stack
node *temp = malloc(sizeof(node));
if (!temp)
return NULL;
// if stack is empty
if (head == NULL)
strcpy(temp -> string, element);
temp -> next = NULL;
return temp;
strcpy(temp -> string, element);
temp -> next = head;
return temp;
node *pop(node * head)
// create a new head
node *newHead = head->next;
// pop the element from stack
free(head);
return newHead;
void destroy_stack(node *p)
if ( p == NULL )
return;
else
destroy_stack(p -> next);
free(p);
c linked-list stack
New contributor
add a comment |Â
up vote
2
down vote
favorite
In my intro CS class we're reviewing data structures. I'm currently working on implementing a stack using a linked list (LIFO) in C. I'd appreciate a review of the implementation as well as of my understanding of how a stack should work.
// This program is implementation of stack data structure
// via linked list (LAST IN FIRST OUT STRUCTURE) LIFO
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
char string[20];
struct node *next;
node;
node *push(char *element, node *head);
node *pop(node *head);
void destroy_stack(node *p);
int main(void)
// create new stack
node *stack = NULL;
// push 6 "functions" to the stack
char *function[6] = "first funct", "second funct", "third funct",
"fourth funct", "fifth funct", "sixt funct";
for (int i = 0; i < 6; i++)
printf("function is : %sn",function[i]);
stack = push(function[i], stack);
if (!stack)
fprintf(stderr,"Not enough memory space for new list");
return 1;
// display the stack
for (node *temp = stack; temp != NULL; temp = temp -> next)
printf("Elements of the stack are: %sn", temp -> string);
// pop the elements from the stack
while (stack != NULL)
printf("Popped elemet is: %sn", stack -> string);
stack = pop(stack);
destroy_stack(stack);
return 0;
node *push(char *element, node *head)
// create space for new element on stack
node *temp = malloc(sizeof(node));
if (!temp)
return NULL;
// if stack is empty
if (head == NULL)
strcpy(temp -> string, element);
temp -> next = NULL;
return temp;
strcpy(temp -> string, element);
temp -> next = head;
return temp;
node *pop(node * head)
// create a new head
node *newHead = head->next;
// pop the element from stack
free(head);
return newHead;
void destroy_stack(node *p)
if ( p == NULL )
return;
else
destroy_stack(p -> next);
free(p);
c linked-list stack
New contributor
add a comment |Â
up vote
2
down vote
favorite
up vote
2
down vote
favorite
In my intro CS class we're reviewing data structures. I'm currently working on implementing a stack using a linked list (LIFO) in C. I'd appreciate a review of the implementation as well as of my understanding of how a stack should work.
// This program is implementation of stack data structure
// via linked list (LAST IN FIRST OUT STRUCTURE) LIFO
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
char string[20];
struct node *next;
node;
node *push(char *element, node *head);
node *pop(node *head);
void destroy_stack(node *p);
int main(void)
// create new stack
node *stack = NULL;
// push 6 "functions" to the stack
char *function[6] = "first funct", "second funct", "third funct",
"fourth funct", "fifth funct", "sixt funct";
for (int i = 0; i < 6; i++)
printf("function is : %sn",function[i]);
stack = push(function[i], stack);
if (!stack)
fprintf(stderr,"Not enough memory space for new list");
return 1;
// display the stack
for (node *temp = stack; temp != NULL; temp = temp -> next)
printf("Elements of the stack are: %sn", temp -> string);
// pop the elements from the stack
while (stack != NULL)
printf("Popped elemet is: %sn", stack -> string);
stack = pop(stack);
destroy_stack(stack);
return 0;
node *push(char *element, node *head)
// create space for new element on stack
node *temp = malloc(sizeof(node));
if (!temp)
return NULL;
// if stack is empty
if (head == NULL)
strcpy(temp -> string, element);
temp -> next = NULL;
return temp;
strcpy(temp -> string, element);
temp -> next = head;
return temp;
node *pop(node * head)
// create a new head
node *newHead = head->next;
// pop the element from stack
free(head);
return newHead;
void destroy_stack(node *p)
if ( p == NULL )
return;
else
destroy_stack(p -> next);
free(p);
c linked-list stack
New contributor
In my intro CS class we're reviewing data structures. I'm currently working on implementing a stack using a linked list (LIFO) in C. I'd appreciate a review of the implementation as well as of my understanding of how a stack should work.
// This program is implementation of stack data structure
// via linked list (LAST IN FIRST OUT STRUCTURE) LIFO
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
char string[20];
struct node *next;
node;
node *push(char *element, node *head);
node *pop(node *head);
void destroy_stack(node *p);
int main(void)
// create new stack
node *stack = NULL;
// push 6 "functions" to the stack
char *function[6] = "first funct", "second funct", "third funct",
"fourth funct", "fifth funct", "sixt funct";
for (int i = 0; i < 6; i++)
printf("function is : %sn",function[i]);
stack = push(function[i], stack);
if (!stack)
fprintf(stderr,"Not enough memory space for new list");
return 1;
// display the stack
for (node *temp = stack; temp != NULL; temp = temp -> next)
printf("Elements of the stack are: %sn", temp -> string);
// pop the elements from the stack
while (stack != NULL)
printf("Popped elemet is: %sn", stack -> string);
stack = pop(stack);
destroy_stack(stack);
return 0;
node *push(char *element, node *head)
// create space for new element on stack
node *temp = malloc(sizeof(node));
if (!temp)
return NULL;
// if stack is empty
if (head == NULL)
strcpy(temp -> string, element);
temp -> next = NULL;
return temp;
strcpy(temp -> string, element);
temp -> next = head;
return temp;
node *pop(node * head)
// create a new head
node *newHead = head->next;
// pop the element from stack
free(head);
return newHead;
void destroy_stack(node *p)
if ( p == NULL )
return;
else
destroy_stack(p -> next);
free(p);
c linked-list stack
c linked-list stack
New contributor
New contributor
edited 1 hour ago
Dannnno
5,4321749
5,4321749
New contributor
asked 3 hours ago
Ivan Stimac
111
111
New contributor
New contributor
add a comment |Â
add a comment |Â
3 Answers
3
active
oldest
votes
up vote
1
down vote
Redundant Code
In your push()
function, you have these two cases which are redundant:
// if stack is empty
if (head == NULL)
strcpy(temp -> string, element);
temp -> next = NULL;
return temp;
strcpy(temp -> string, element);
temp -> next = head;
return temp;
You can just remove the special case for head == NULL
and be left with this, which handles both cases:
strcpy(temp -> string, element);
temp -> next = head;
return temp;
Better to iterate than recurse
Your destroy_stack()
function is recursive, and that could be a problem if the stack has millions of elements because it could cause your program stack to overflow. It is easy enough to write an iterative version of that function instead, like this:
void destroy_stack(node *p)
while (p != NULL)
node *next = p->next;
free(p);
p = next;
Minor issues
- In
push()
, usingstrcpy()
is unsafe becauseelement
might exceed 20 characters and you will overflow your buffer. - In
push()
, ifmalloc()
returnsNULL
, you returnNULL
and thus destroy/leak the rest of the stack. Perhaps you should just returnhead
instead, to preserve the rest of the stack. - In
pop()
, you might want to check forhead == NULL
, otherwise you must depend on the caller to never passNULL
to your function.
Stop typing that fast!
â vnp
2 hours ago
add a comment |Â
up vote
1
down vote
push
handles both branches in a curiously similar way. The only difference is thattemp->next
becomesNULL
whenhead
isNULL
, andhead
otherwise. You should see the redundancy. It always becomeshead
no matter whathead
has been before. Consolidate the branches:node *push(char *element, node *head)
// create space for new element on stack
node *temp = malloc(sizeof(node));
if (!temp)
return NULL;
strcpy(temp -> string, element);
temp -> next = head;
return temp;Failure to allocate a node results in the entire list being lost. It seems a bit too drastic.
I do not endorse a recursive solution when a straightforward iterative one is available. Consider rewriting
destroy_stack
iteratively.
Shouldn'ttemp->next = head
notNULL
?
â Dannnno
13 mins ago
@Dannnno Whoops. Thank you. Fixed.
â vnp
12 mins ago
add a comment |Â
up vote
0
down vote
You really need to create a walk
function. The code you have in main
to display the contents 'knows' the internal structure of your stack. Instead you need a function that returns the next item on the stack given a current item
add a comment |Â
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
Redundant Code
In your push()
function, you have these two cases which are redundant:
// if stack is empty
if (head == NULL)
strcpy(temp -> string, element);
temp -> next = NULL;
return temp;
strcpy(temp -> string, element);
temp -> next = head;
return temp;
You can just remove the special case for head == NULL
and be left with this, which handles both cases:
strcpy(temp -> string, element);
temp -> next = head;
return temp;
Better to iterate than recurse
Your destroy_stack()
function is recursive, and that could be a problem if the stack has millions of elements because it could cause your program stack to overflow. It is easy enough to write an iterative version of that function instead, like this:
void destroy_stack(node *p)
while (p != NULL)
node *next = p->next;
free(p);
p = next;
Minor issues
- In
push()
, usingstrcpy()
is unsafe becauseelement
might exceed 20 characters and you will overflow your buffer. - In
push()
, ifmalloc()
returnsNULL
, you returnNULL
and thus destroy/leak the rest of the stack. Perhaps you should just returnhead
instead, to preserve the rest of the stack. - In
pop()
, you might want to check forhead == NULL
, otherwise you must depend on the caller to never passNULL
to your function.
Stop typing that fast!
â vnp
2 hours ago
add a comment |Â
up vote
1
down vote
Redundant Code
In your push()
function, you have these two cases which are redundant:
// if stack is empty
if (head == NULL)
strcpy(temp -> string, element);
temp -> next = NULL;
return temp;
strcpy(temp -> string, element);
temp -> next = head;
return temp;
You can just remove the special case for head == NULL
and be left with this, which handles both cases:
strcpy(temp -> string, element);
temp -> next = head;
return temp;
Better to iterate than recurse
Your destroy_stack()
function is recursive, and that could be a problem if the stack has millions of elements because it could cause your program stack to overflow. It is easy enough to write an iterative version of that function instead, like this:
void destroy_stack(node *p)
while (p != NULL)
node *next = p->next;
free(p);
p = next;
Minor issues
- In
push()
, usingstrcpy()
is unsafe becauseelement
might exceed 20 characters and you will overflow your buffer. - In
push()
, ifmalloc()
returnsNULL
, you returnNULL
and thus destroy/leak the rest of the stack. Perhaps you should just returnhead
instead, to preserve the rest of the stack. - In
pop()
, you might want to check forhead == NULL
, otherwise you must depend on the caller to never passNULL
to your function.
Stop typing that fast!
â vnp
2 hours ago
add a comment |Â
up vote
1
down vote
up vote
1
down vote
Redundant Code
In your push()
function, you have these two cases which are redundant:
// if stack is empty
if (head == NULL)
strcpy(temp -> string, element);
temp -> next = NULL;
return temp;
strcpy(temp -> string, element);
temp -> next = head;
return temp;
You can just remove the special case for head == NULL
and be left with this, which handles both cases:
strcpy(temp -> string, element);
temp -> next = head;
return temp;
Better to iterate than recurse
Your destroy_stack()
function is recursive, and that could be a problem if the stack has millions of elements because it could cause your program stack to overflow. It is easy enough to write an iterative version of that function instead, like this:
void destroy_stack(node *p)
while (p != NULL)
node *next = p->next;
free(p);
p = next;
Minor issues
- In
push()
, usingstrcpy()
is unsafe becauseelement
might exceed 20 characters and you will overflow your buffer. - In
push()
, ifmalloc()
returnsNULL
, you returnNULL
and thus destroy/leak the rest of the stack. Perhaps you should just returnhead
instead, to preserve the rest of the stack. - In
pop()
, you might want to check forhead == NULL
, otherwise you must depend on the caller to never passNULL
to your function.
Redundant Code
In your push()
function, you have these two cases which are redundant:
// if stack is empty
if (head == NULL)
strcpy(temp -> string, element);
temp -> next = NULL;
return temp;
strcpy(temp -> string, element);
temp -> next = head;
return temp;
You can just remove the special case for head == NULL
and be left with this, which handles both cases:
strcpy(temp -> string, element);
temp -> next = head;
return temp;
Better to iterate than recurse
Your destroy_stack()
function is recursive, and that could be a problem if the stack has millions of elements because it could cause your program stack to overflow. It is easy enough to write an iterative version of that function instead, like this:
void destroy_stack(node *p)
while (p != NULL)
node *next = p->next;
free(p);
p = next;
Minor issues
- In
push()
, usingstrcpy()
is unsafe becauseelement
might exceed 20 characters and you will overflow your buffer. - In
push()
, ifmalloc()
returnsNULL
, you returnNULL
and thus destroy/leak the rest of the stack. Perhaps you should just returnhead
instead, to preserve the rest of the stack. - In
pop()
, you might want to check forhead == NULL
, otherwise you must depend on the caller to never passNULL
to your function.
answered 2 hours ago
JS1
27.1k32876
27.1k32876
Stop typing that fast!
â vnp
2 hours ago
add a comment |Â
Stop typing that fast!
â vnp
2 hours ago
Stop typing that fast!
â vnp
2 hours ago
Stop typing that fast!
â vnp
2 hours ago
add a comment |Â
up vote
1
down vote
push
handles both branches in a curiously similar way. The only difference is thattemp->next
becomesNULL
whenhead
isNULL
, andhead
otherwise. You should see the redundancy. It always becomeshead
no matter whathead
has been before. Consolidate the branches:node *push(char *element, node *head)
// create space for new element on stack
node *temp = malloc(sizeof(node));
if (!temp)
return NULL;
strcpy(temp -> string, element);
temp -> next = head;
return temp;Failure to allocate a node results in the entire list being lost. It seems a bit too drastic.
I do not endorse a recursive solution when a straightforward iterative one is available. Consider rewriting
destroy_stack
iteratively.
Shouldn'ttemp->next = head
notNULL
?
â Dannnno
13 mins ago
@Dannnno Whoops. Thank you. Fixed.
â vnp
12 mins ago
add a comment |Â
up vote
1
down vote
push
handles both branches in a curiously similar way. The only difference is thattemp->next
becomesNULL
whenhead
isNULL
, andhead
otherwise. You should see the redundancy. It always becomeshead
no matter whathead
has been before. Consolidate the branches:node *push(char *element, node *head)
// create space for new element on stack
node *temp = malloc(sizeof(node));
if (!temp)
return NULL;
strcpy(temp -> string, element);
temp -> next = head;
return temp;Failure to allocate a node results in the entire list being lost. It seems a bit too drastic.
I do not endorse a recursive solution when a straightforward iterative one is available. Consider rewriting
destroy_stack
iteratively.
Shouldn'ttemp->next = head
notNULL
?
â Dannnno
13 mins ago
@Dannnno Whoops. Thank you. Fixed.
â vnp
12 mins ago
add a comment |Â
up vote
1
down vote
up vote
1
down vote
push
handles both branches in a curiously similar way. The only difference is thattemp->next
becomesNULL
whenhead
isNULL
, andhead
otherwise. You should see the redundancy. It always becomeshead
no matter whathead
has been before. Consolidate the branches:node *push(char *element, node *head)
// create space for new element on stack
node *temp = malloc(sizeof(node));
if (!temp)
return NULL;
strcpy(temp -> string, element);
temp -> next = head;
return temp;Failure to allocate a node results in the entire list being lost. It seems a bit too drastic.
I do not endorse a recursive solution when a straightforward iterative one is available. Consider rewriting
destroy_stack
iteratively.
push
handles both branches in a curiously similar way. The only difference is thattemp->next
becomesNULL
whenhead
isNULL
, andhead
otherwise. You should see the redundancy. It always becomeshead
no matter whathead
has been before. Consolidate the branches:node *push(char *element, node *head)
// create space for new element on stack
node *temp = malloc(sizeof(node));
if (!temp)
return NULL;
strcpy(temp -> string, element);
temp -> next = head;
return temp;Failure to allocate a node results in the entire list being lost. It seems a bit too drastic.
I do not endorse a recursive solution when a straightforward iterative one is available. Consider rewriting
destroy_stack
iteratively.
edited 12 mins ago
answered 2 hours ago
vnp
37.4k12993
37.4k12993
Shouldn'ttemp->next = head
notNULL
?
â Dannnno
13 mins ago
@Dannnno Whoops. Thank you. Fixed.
â vnp
12 mins ago
add a comment |Â
Shouldn'ttemp->next = head
notNULL
?
â Dannnno
13 mins ago
@Dannnno Whoops. Thank you. Fixed.
â vnp
12 mins ago
Shouldn't
temp->next = head
not NULL
?â Dannnno
13 mins ago
Shouldn't
temp->next = head
not NULL
?â Dannnno
13 mins ago
@Dannnno Whoops. Thank you. Fixed.
â vnp
12 mins ago
@Dannnno Whoops. Thank you. Fixed.
â vnp
12 mins ago
add a comment |Â
up vote
0
down vote
You really need to create a walk
function. The code you have in main
to display the contents 'knows' the internal structure of your stack. Instead you need a function that returns the next item on the stack given a current item
add a comment |Â
up vote
0
down vote
You really need to create a walk
function. The code you have in main
to display the contents 'knows' the internal structure of your stack. Instead you need a function that returns the next item on the stack given a current item
add a comment |Â
up vote
0
down vote
up vote
0
down vote
You really need to create a walk
function. The code you have in main
to display the contents 'knows' the internal structure of your stack. Instead you need a function that returns the next item on the stack given a current item
You really need to create a walk
function. The code you have in main
to display the contents 'knows' the internal structure of your stack. Instead you need a function that returns the next item on the stack given a current item
edited 12 mins ago
Dannnno
5,4321749
5,4321749
answered 2 hours ago
pm100
41625
41625
add a comment |Â
add a comment |Â
Ivan Stimac is a new contributor. Be nice, and check out our Code of Conduct.
Ivan Stimac is a new contributor. Be nice, and check out our Code of Conduct.
Ivan Stimac is a new contributor. Be nice, and check out our Code of Conduct.
Ivan Stimac is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f205176%2fimplementing-a-stack-using-a-linked-list%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password