namarino namarino - 1 year ago 92
C Question

Printing linked List infinite loop C

I'm trying to print a linked list after having added a node. I have a dummy node to start the list

Node **nodeArray;
nodeArray = malloc(10 * sizeof(Node *));

int i;
for (i = 0; i < 10; i++) {
nodeArray[i] = malloc(sizeof(Node));

if (userChoice == 'a')
add(&nodeArray, setNumber);

void add(Node ***nodeArray, int setNumber) {
char userString[5];
printf("Please enter some data: ");
scanf("%s", userString);

Node *head = *nodeArray[setNumber]; /* head pointer to first element of array (dummy) */
Node *newNode = malloc(sizeof(Node)); /* new node to be added to array */

strncpy(newNode->data, userString, sizeof(newNode->data)); /* copies string entered by the user to data field of new node */
newNode->next = NULL; /* initializes next field of new node to NULL */

Node *tmp = head; /* pointer to head of list */

while (!tmp->next) {
tmp->next = newNode; /* inserts new node into array */
tmp = newNode; /* points head to newly added node */

tmp = head; /* points tmp back to head of list */

printf("List is: ");
while (tmp->next) {
printf("%s", (tmp->data));
tmp = tmp->next;

But when I print, I get an infinite loop printing out the data field of the newly added node. Terrible with linked lists....what am I doing wrong?

Answer Source
while (tmp->next) {
   tmp->next = newNode;    /* inserts new node into array */
   tmp = newNode;      /* points head to newly added node */

In this snippet you're losing the refrence to the next node, and just adding the newNode next to the head. For instance you have the following list:


And you want to push a new element into that list: [4], what happens when you execute your push function (the snippet above) is:

tmp = head; // tmp = [1]
while(tmp->next) {
    tmp->next = newNode; // [1]->next = [4]
    tmp = newNode; // tmp = [4]

So the next time '(tmp->next)' is evaluated it will be evaluated as: [4]->next and it will be NULL, breaking the loop. Your list will then be:


The other elements are lost because you don't have a reference pointing to them anymore, this is called a memory leak because you won't be able to free them later.

You could write your push function this way:

tmp = head;
    tmp = tmp->next;
tmp->next = newNode // Adds new node to the tail of the linked list
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download