2015-07-01 3 views
1

Я хочу создать связанный список, который может принимать любые типы данных во время выполнения и отображать список. Проблема заключается в изменении функций отображения и управления памятью для разных типов данных. Поэтому я не знаю, как это сделать. Примеры кода будут оценены.Общая очередь в 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); 
    } 
} 

Здесь выход всегда есть некоторые случайные числа.

+1

Вы должны подумать и рассказать нам немного больше о том, что вы пытаетесь сделать, и, возможно, установить некоторые ограничения. В полной общности, то, о чем вы говорите, похоже, может потребоваться внедрение некоторых/всех C++ поверх C. (что, безусловно, можно сделать, ведь Бьярне сделал это в первый раз, но это какая-то работа!) –

+0

C - это «строго типизированный» язык. Хотя есть способы победить его, это правильный язык для вас? –

+0

FWIW: ядро ​​Linux имеет несколько * общих * LL, реализованных с набором макросов. – wildplasser

ответ

0

Вы можете хранить данные двумя способами.

  1. Функция вызова insert передает управление хранением в очередь; функция extract возвращает управление обратно вызывающему коду. Это означает, что очередь не должна знать, сколько данных указано.
  2. Вы указываете функцию insert, насколько большой объем данных, а также где он хранится(). Однако это означает, что вы ограничены структурами данных, которые можно скопировать (используя memmove() или эквивалент) безопасно. Многие структуры не могут быть скопированы так (мыслить структуры, содержащие указатели).

Для первого механизма, функция display() изменяется в apply() функции, которая задана функция указателя:

void apply(struct queue *queue, void *data, void (*function)(const void *item, void *data)); 

queue пересечена, и функция вызывается с текущим элементом из очередь плюс данные, переданные функции apply. Эти данные являются указателем на любой контекст, необходимый для правильной работы функции. Для отображения это может быть FILE *, или это может быть более сложная структура. В любом случае функция (которая указана указателем функции function) знает, что делать с данными, поскольку она настроена на тип данных.

+0

2-й способ на самом деле невозможен, поскольку я упомянул, что мы не можем определить размер данных. о первом, я действительно не понял. вы можете уточнить –