2015-03-03 155 views
0

我不明白爲什麼我得到這個錯誤:未知類型名稱'數據'。C未知類型名稱'數據'

#include <stdio.h> 
#include <stdlib.h> 

typedef int DATA; 
#include "PriorityQueue.h" 


int main(){ 
    int priority; 
    DATA value; 
    LINK *head; 
    createEmpty(&head); 
    add(&head, 1, 7); 
    checkIfEmpty(head); 
    add(&head, 5, 5); 
    add(&head, 3, 4); 
    deleteElement(&head, &priority, &value); 
    add(&head, 1, 3); 
    destroy(head); 
    createEmpty(&head); 
    add(&head, 10, 10); 
    return 0; 
} 

主要

#include <stdio.h> 
#include <stdlib.h> 

#include "PriorityQueue.h" 

void add(LINK **head, int p, DATA v){ 
    LINK *curr=(*head); 
    LINK *beforeCurr=(*head); 
    LINK *newElement=NULL; 
    if((*head)->priority==-1){ 
     (*head)->priority=p; 
     (*head)->value=v; 
    } 

    else{ 
     newElement=(LINK*)malloc(sizeof(LINK)); 
     newElement->priority=p; 
     newElement->value=v; 
     newElement->next=NULL; 

     while(p>(curr->priority) && curr->next!=NULL){ 
      beforeCurr=curr; 
      curr=curr->next; 
     } 

     if(curr->next==NULL && p>(curr->priority)) 
      curr->next=newElement; 

     else if(curr==(*head)){ 
      newElement->next=curr; 
      (*head)=newElement; 
     } 
     else{ 
      beforeCurr->next=newElement; 
      newElement->next=curr; 
     } 
    } 
} 

void deleteElement(LINK **head, int *p, DATA *v){ 
    LINK *curr=(*head); 
    LINK *currB=(*head); 
    while(curr->next!=NULL) { 
     currB=curr; 
     curr=curr->next; 
    } 
    currB->next=NULL; 
    (*p)=curr->priority; 
    (*v)=curr->value; 
    free(curr); 
} 

void checkIfEmpty(LINK *head){ 
    if(head->priority==-1) 
    printf("Queue is empty\n\n"); 
    else 
    printf("Queue is not empty\n\n"); 
} 

void destroy(LINK *head) { 
    LINK *current; 
    LINK *next; 
    current=head; 
    while(current!=NULL){ 
     next=current->next; 
     free(current); 
     current=next; 
    } 
    head=NULL; 
} 


void createEmpty(LINK **head) { 
    LINK *curr=NULL; 
    curr=(LINK*)malloc(sizeof(LINK)); 
    curr->next = NULL; 
    curr->priority = -1; 
    (*head)=curr; 
} 

功能文件

#ifndef PRIORITY_QUEUE_H_ 
#define PRIORITY_QUEUE_H_ 

typedef struct priorityQueue{ 
    int priority; 
    DATA value; 
    struct priorityQueue *next; 
}LINK; 

void createEmpty(LINK **head); 
void add(LINK **head, int p, DATA v); 
void deleteElement(LINK **head, int *p, DATA *v); 
void checkIfEmpty(LINK *head); 
void destroy(LINK *head); 
#endif 

頁眉

我使用的代碼塊一個項目進行編譯。 另外,「typedef int DATA;」主要是首選

+0

可能的重複[將主體中的定義類型傳遞給C中的標頭](http://stackoverflow.com/questions/28811140/passing-defined-type-in​​-main-to-header-in-c) – user694733 2015-03-03 07:46:41

+0

This是您以前的帖子的副本。請勿重複發帖。刪除它,並編輯你的舊帖子。 – user694733 2015-03-03 07:48:07

回答

0

您應該在頭文件中聲明typedef int DATA;並將該頭文件包含在所有源文件中。

目前沒有辦法讓其他源文件知道DATA是什麼。

+0

難道沒有辦法保持它的主要? – DevGambit 2015-03-03 07:46:22

+0

不,除非您在所有源文件中聲明'typedef int DATA;',否則無法這樣做,這與包含標頭相同。 – Vagish 2015-03-03 08:26:04

+0

感謝您的信息! :) – DevGambit 2015-03-03 10:14:26

1

typedef關鍵字服從作用域規則,爲這裏解釋: Are typedef and #define the same in c?

這意味着,如果你聲明:

typedef int DATA; 

,並且不包含在它不會在那裏宣佈另一個文件這一行。

DATA應在每個使用它的文件中聲明,或者通過包含另一個聲明它的文件或通過顯式聲明它。