It sounds like you're talking about a simple linked list insertion. It can be done like this:
Code:
#include <stdio.h>
#include <stdlib.h>
typedef int DATA;
typedef struct List {
DATA data;
struct List* next;
} List;
List* insert(List* list, DATA item, int pos)
{
if (list == NULL)
{
list = malloc(sizeof (*list));
list->data = item;
list->next = NULL;
}
else if (pos == 0)
{
List* front = malloc(sizeof (*list));
front->data = item;
front->next = list;
list = front;
}
else
{
List* iter = list;
List* save;
while (iter->next != NULL && --pos > 0)
iter = iter->next;
save = iter->next;
iter->next = malloc(sizeof (*iter));
iter->next->data = item;
iter->next->next = save;
}
return list;
}
int main(void)
{
List* list = NULL;
List* forward;
/* After insertions: 3->5->6->4->1->2-> */
list = insert(list, 1, 0);
list = insert(list, 2, 5);
list = insert(list, 3, 0);
list = insert(list, 4, 1);
list = insert(list, 5, 1);
list = insert(list, 6, 2);
while (list)
{
forward = list->next;
printf("%d->", list->data);
free(list);
list = forward;
}
}
Note that I didn't do any error checking, you should always check the return value of malloc. But doing so means you also have to devise an error recovery strategy that makes the code longer and hides the concept.