Вот пример связанного списка, надеюсь, вам поможет.Он содержит функции для вставки, добавления и печати узла.В основной функции вы можете найти, как сканировать список без рекурсии.
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
typedef struct tagNode
{
int number;
struct tagNode *next;
} NODE;
typedef struct tagList
{
NODE *head; /* pointer to first node in list */
NODE *last; /* pointer to last node in list */
} LIST;
/* func proto's */
NODE* create_node();
NODE* insert_node(LIST* l,NODE *p, int n);
NODE* add_node(LIST* l, NODE *p, int n);
void print_node(NODE *p);
int main()
{
LIST list = {NULL,NULL}; /* init list with NULLs */
/* add some nodes to list */
for( int i = 0; i < 10 ; i++ )
{
add_node(&list, create_node(),i * 5 );
}
NODE* p = list.head;
for( ;p != NULL; p = p->next )
{
print_node(p);
}
/* insert some nodes */
insert_node(&list, create_node(),33);
insert_node(&list, create_node(),23);
insert_node(&list, create_node(),13);
/* print list after inserts */
for(p = list.head; p != NULL; p = p->next )
{
print_node(p);
}
}
/* create empty node */
NODE* create_node()
{
NODE *p = malloc(sizeof(NODE));
p->next = NULL;
p->number = 0;
}
/* add node to end of list */
NODE* add_node(LIST* list, NODE* p, int num)
{
if(list->last == NULL )
{
printf("add first\n");
list->last = p;
list->head = p;
p->number = num;
}
else if( list->last->number < num )
{
printf("add num %d\n",num);
list->last->next = p;
list->last = p;
p->number = num;
p->next = NULL; /* terminate list */
}
return list->last;
}
void print_node(NODE *p)
{
printf("node number: %d\n",p->number);
}
NODE* insert_node(LIST* l, NODE *q,int num)
{
/* scan list ... */
for( NODE* p = l->head;p != NULL; p = p->next )
{
if( p->next->number > num )
{
q->next = p->next;
p->next = q;
q->number = num;
return q; /* indicate success */
}
}
return NULL; /* indicate failure */
}