| | |
Link list Query
![]() |
•
•
Join Date: Mar 2006
Posts: 4
Reputation:
Solved Threads: 0
I am trying to delete the first node in the singly link list but cant seem to do so? My Code is below... Could someone please suggest something.
thanks.
This program has an enqueue function which works.
*p is a pointer to a node which has been allocated using malloc.
The descriptions are given below for reference.
typedef struct Node
{
int element;
struct Node *next;
} Node;
typedef struct Queue
{
Node *front;
Node *rear;
} Queue;
Now this is the function I am having problems with.
int q_dequeue ( Queue *theQ, int *value)
{
Node *p;
if( theQ -> front == NULL)
{
printf ("Queue is empty. Cannot dequeue.\n");
return 0;
}
p = theQ -> front;
*value = p -> element;
if(theQ -> front != NULL && theQ -> rear == NULL)
{
theQ -> front = NULL;
theQ -> rear = NULL;
free(p);
}
else
{
theQ -> front = p -> next;
free(p);
}
return 1;
}
thanks.
This program has an enqueue function which works.
*p is a pointer to a node which has been allocated using malloc.
The descriptions are given below for reference.
typedef struct Node
{
int element;
struct Node *next;
} Node;
typedef struct Queue
{
Node *front;
Node *rear;
} Queue;
Now this is the function I am having problems with.
int q_dequeue ( Queue *theQ, int *value)
{
Node *p;
if( theQ -> front == NULL)
{
printf ("Queue is empty. Cannot dequeue.\n");
return 0;
}
p = theQ -> front;
*value = p -> element;
if(theQ -> front != NULL && theQ -> rear == NULL)
{
theQ -> front = NULL;
theQ -> rear = NULL;
free(p);
}
else
{
theQ -> front = p -> next;
free(p);
}
return 1;
}
•
•
Join Date: Mar 2006
Posts: 4
Reputation:
Solved Threads: 0
•
•
•
•
Originally Posted by Salem
Well that seems to be OK in itself.
Perhaps the problem is with the way you create the queue in the first place, and this is just where you notice that it doesn't work.
Post some more code please.
PS.
Use the [code][/code] tags when posting code.
C Syntax (Toggle Plain Text)
/* * queue.c */ #include <stdlib.h> #include<stdio.h> #include "queue.h" /* * Initialize the queue. Must be called before any other * queue function */ void q_init ( Queue *theQ ) { theQ -> front = NULL; theQ -> rear = NULL; } /* * Add value to the back of the queue * returns 1 on success, 0 on failure */ int q_enqueue ( Queue *theQ, int value ) { Node *p = (Node *)malloc(sizeof(Node)); if(!p) { printf("Malloc Failed.\n"); return 0; } else { //make the element of the new node = value p -> element = value; p -> next = NULL; } if(theQ -> front == NULL) //change where the front and rear { //pointers point theQ -> front = p; theQ -> rear = p -> next; } else { theQ -> rear = p; theQ -> front -> next = theQ -> rear; } return 1; } /* * Remove the first element from the queue * returns 1 on success, 0 on failure */ int q_dequeue ( Queue *theQ, int *value) { Node *p; if( theQ -> front == NULL) { printf ("Queue is empty. Cannot dequeue.\n"); return 0; } p = theQ -> front; *value = p -> element; if(theQ -> front == theQ -> rear) { theQ -> front = NULL; theQ -> rear = NULL; free(p -> element); free(p); } else { theQ -> front = p -> next; free(p -> element); free(p); } return 1; } /* * Is the queue empty? * returns 1 if the queue is empty, 0 otherwise */ int q_isEmpty ( Queue *theQ ) { if(theQ -> front == NULL) { //printf ("Queue is empty.\n"); return 1; } else { return 0; } }
Other files used to implement this code:
C Syntax (Toggle Plain Text)
/* * queue.h */ #ifndef __QUEUE_H__ #define __QUEUE_H__ /* * This structure holds the individual nodes * in the queue structure */ typedef struct Node { int element; struct Node *next; } Node; /* * This is the actual Queue. Notice there * are two Node pointers. One points to * the front of the queue and one points to * the rear of the queue */ typedef struct Queue { Node *front; Node *rear; } Queue; /* * Initialize the queue. Must be called before any other * queue function */ void q_init ( Queue *theQ ); /* * Add value to the back of the queue * returns 1 on success, 0 on failure */ int q_enqueue ( Queue *theQ, int value ); /* * Remove the first element from the queue * returns 1 on success, 0 on failure */ int q_dequeue ( Queue *theQ, int *value); /* * Is the queue empty? * returns 1 if the queue is empty, 0 otherwise */ int q_isEmpty ( Queue *theQ ); #endif
This is my test file:
C Syntax (Toggle Plain Text)
/* * queuetest.c */ #include <stdio.h> #include <stdlib.h> #include "queue.h" int main ( ) { /* Here are two different ways to create a queue. * the first one allocates the queue on the stack, so we * need to pass the address of this queue to the q_ methods * * The second one uses a pointer, and allocates storage for the * queue dynamically. This means we have to call free on the * pointer to deallocate the memory. */ Queue q1; Queue *q2 = (Queue *)malloc (sizeof(Queue)); Queue *q3 = (Queue *)malloc (sizeof(Queue)); int i, j, passed; if (!q2 || !q3) { printf ("Failed allocation.\n"); return 0; } q_init (&q1); /* Note the use of the & operator */ q_init (q2); q_init (q3); /* * Make sure that newly created queues are empty */ if (q_isEmpty(&q1)) printf ("Test 1 passed. Queue is empty.\n"); else printf ("Test 1 failed. Newly created queue is not empty\n"); if (q_isEmpty(q2)) printf ("Test 2 passed. Queue is empty.\n"); else printf ("Test 2 failed. Newly created queue is not empty\n"); /* * Enqueue 1000 integers and verify that the values * are dequeued in the correct order */ passed = 1; for ( i = 0; i < 1000; i++ ) { if ( !q_enqueue(&q1, i) ) { passed = 0; break; } } if (passed) { for ( i = 0; i < 1000; i++ ) { int val; if (!q_dequeue (&q1, &val) ) { passed = 0; break; } if ( val != i ) { passed = 0; break; } } if (passed) printf ("Test 3 passed. Enqueue and Dequeue\n"); else printf ("Test 3 failed. Dequeue\n"); } else { printf ("Test 3 failed. Didn't enqueue.\n"); } /* * enqueue 1 item, then dequeue it. * then enqueue two more items and dequeue them. * then verify the queue is empty. */ if (q_enqueue (q2, 7)) { if (q_isEmpty(q2)) { printf ("Test 4 failed. empty after enqueue\n"); } else { int val; if (q_dequeue(q2, &val)) { if (val == 7) { if (q_enqueue(q2, 9)) { if (q_enqueue(q2, 11)) { int val1, val2; if (q_dequeue(q2,&val1)) { if (q_dequeue(q2,&val2)) { if (val1 == 9 && val2 == 11 && q_isEmpty(q2) ) { printf ("Test 4 passed.\n"); } else { printf ("Test 4 failed. 9 & 11\n"); } } else { printf ("Test 4 failed. dequeue 11\n"); } } else { printf ("Test 4 failed. dequeue 9.\n"); } } else { printf("Test 4 failed. enqueue 11\n"); } } else { printf ("Test 4 failed. enqueue 9\n"); } } else { printf ("Test 4 failed. dequeue != 7\n"); } } else { printf("Test 4 failed. dequeue 7\n"); } } } else { printf ("Test 4 failed. enqueue 7.\n"); } if (q_isEmpty(q3)) printf ("Test 5 passed. Queue is empty.\n"); else printf ("Test 5 failed. Newly created queue is not empty\n"); passed = 1; for ( i = 0; i < 10; i++ ) { q_enqueue(q3, i); } for ( j = 0; j < 5; j++ ) { int val; if ( !q_dequeue (q3, &val) ) { passed = 0; } else { if ( val != j ) { passed = 0; break; } } } if ( passed ) { int val; for ( i = 10; i < 20; i++ ) { q_enqueue ( q3, i); } for ( j = 5; j < 20 ; j++ ) { if ( !q_dequeue (q3, &val)) { passed = 0; break; } else { if ( val != j ) { passed = 0; break; } } } } if ( passed ) printf ("Test 6 passed.\n"); else printf ("Test 6 failed.\n"); /* Not technically required since we're about to end the program * but it is a good habit to free any memory you malloc */ free(q2); free(q3); return 0; }
![]() |
Similar Threads
- Link List Sorting Problem (C++)
- Link List Insert problems (C++)
- how to reverse link list using recurtion (C)
- Using a class to add/delete/show numbers in a Link List (C++)
- circular link list (C)
Other Threads in the C Forum
- Previous Thread: Segmentation Fault
- Next Thread: recent programming technologies used in mobile phones
| Thread Tools | Search this Thread |
adobe ansi api array asterisks binarysearch calculate centimeter changingto char convert copyanyfile copyimagefile copypdffile cprogramme creafecopyofanytypeoffileinc createcopyoffile createprocess() csyntax database directory fflush file fork forloop frequency givemetehcodez global grade graphics gtkgcurlcompiling hacking highest histogram homework i/o inches infiniteloop input interest iso kernel kilometer km linked linkedlist linux linuxsegmentationfault list locate looping loopinsideloop. lowest match meter microsoft mysql number open opendocumentformat openwebfoundation owf pattern pdf performance posix power probleminc process program programming pyramidusingturboccodes radix read recv repetition research reversing scanf scheduling segmentationfault send sequential socket socketprograming stack standard string suggestions systemcall threads turboc unix user variable voidmain() wab win32api windows.h windowsapi






