ПРИМЕЧАНИЕ: это чисто ответ С.
Я хотел бы начать с этой структуры данных:
typedef struct heterogeneous_list
{
enum { CHAR, STRING, FLOAT, INT } type;
void *item;
struct heterogeneous_list *next;
}
Когда я получал элемент от пользователя, я сохранял его в списке (при условии, что текущие точки находятся в конце списка):
current->next = malloc(sizeof(heterogeneous_list));
case (/* whether the user entered a char, string, float, or int */
{
case /* char */:
current->next.item = malloc(sizeof(char));
current->next.type = CHAR;
current->next.next = NULL;
break;
/* and so forth, for string, int, and float */
}
current = current->next;
При переборе списка теперь легко обрабатывать то, что находится в списке, на основе типа. В следующем коде предполагается, что current
является текущим элементом списка, который просматривается в итерации (цикл for, проходящий по списку):
char currentItemChar;
char * currentItemString;
float currentItemFloat;
int currentItemInt;
case (current->type)
{
case CHAR:
currentItemChar = *((char*) current->item);
// process a character
break;
case STRING:
currentItemString = (char*) current->item;
// process a string
break;
case FLOAT:
currentItemFloat = *((float*) current->item);
// process a float
break;
.
.
.
};
Я бы так и сделал.