Я хочу создать связанный список, который может принимать любые типы данных во время выполнения и отображать список. Проблема заключается в изменении функций отображения и управления памятью для разных типов данных. Поэтому я не знаю, как это сделать. Примеры кода будут оценены.Общая очередь в C с типами данных времени выполнения
Редактировать: ограничить проблему. это структура очереди (используя связанный список)
struct node
{
void *data;
struct node *link;
};
struct queue
{
struct node *front;
struct node *rear;
};
Теперь функций вызывающего абонента для добавления нового элемента и отображений следующим образом:
int main()
{
struct queue* q;
void *a;
char ch;
printf("do you want to add an element?(y/n)\n");
scanf("%c",&ch);
while(ch!=n)
{
printf("Enter the element\n");
scanf("%p",a);
enqueue(q,a);
display(q);
}
return 0;
}
Ниже мое определение функции Епдиеей:
void enqueue(struct queue* queue,void* item)
{
if(queue->logical_length==queue->cnt_max)
{
printf("Queue is full\n");
return;
}
else
{
struct node*temp;
temp=(struct node*)malloc(sizeof(struct node));
temp->data=malloc(queue->data_size);
temp->link=NULL;
memcpy(temp->data,item,queue->data_size);
if(queue->front==NULL)
{
queue->rear=queue->front=temp;
queue->logical_length=queue->logical_length+1;
return;
}
queue->rear->link=temp;
queue->rear=temp;
queue->logical_length=queue->logical_length+1;
}
}
Здесь проблема в том, как распределить память в поле данных, если я даже не знаю тип данных. Поэтому, если есть какой-то способ найти тип данных введенных значений времени выполнения, это будет лучше.
Ниже моя функция отображения:
void display(struct queue* queue)
{
struct node* temp;
if(queue->front==NULL)
{
printf("Queue is empty\n");
return;
}
else
{
temp=queue->front;
while(temp->link!=NULL)
{
printf("%p \t",*(void *)temp->data);
temp=temp->link;
}
printf("%p \t",*(void *)temp->data);
}
}
Здесь выход всегда есть некоторые случайные числа.
Вы должны подумать и рассказать нам немного больше о том, что вы пытаетесь сделать, и, возможно, установить некоторые ограничения. В полной общности, то, о чем вы говорите, похоже, может потребоваться внедрение некоторых/всех C++ поверх C. (что, безусловно, можно сделать, ведь Бьярне сделал это в первый раз, но это какая-то работа!) –
C - это «строго типизированный» язык. Хотя есть способы победить его, это правильный язык для вас? –
FWIW: ядро Linux имеет несколько * общих * LL, реализованных с набором макросов. – wildplasser