2016-03-16 40 views
0

我已經給出了一些用於實現鏈接列表的現有C代碼(一個頭文件和一些源代碼),並且已經給了一個任務用它來實現一個隊列。使用鏈接列表的現有實現來實現隊列:錯誤的文件編號錯誤

這是我一直在考慮相關的功能描述中的頭文件的一部分:

/* List is a pointer to a list_t struct */ 
typedef struct list_t* List; 

struct list_t { 
    void *data; 
    List next; 
}; 

/* Pushes data as the new head of list. May be used to create a new list: 
* new_list = push(NULL, data) */ 
extern List push(List list, void *data); 

/* Pop the head off the list */ 
extern void *pop(List *list); 

/* Return the length of the list */ 
extern int len(List list); 

/* Returns a reversed copy of list */ 
List reverse(List list); 

/* Prepend data to list and update list */ 
extern List prepend(List *list, void *data); 

/* Append l1 to the end of l2 */ 
void append(List l1, List *l2); 

/* Inserts data into the tail of list */ 
void insert(void *data, List *list); 

/* Inserts data into the tail of list or position equal to the next element  */ 
void insert_by(bool (*eq)(void *data, void *node), void *data, List *list); 

/* Inserts data into the tail of list. Returns true if sucessful, 
* false if it finds an element already equal to data */ 
bool insert_if(bool (*eq)(void *data, void *node), void *data, List *list); 

/* Returns the node equal to aim in list, returns NULL if not found */ 
extern List find(bool (*eq)(void *aim, void *node), void *aim, List list); 

/* Removes and returns the element equal to aim in list, 
* returns NULL if not found */ 
extern void *del(bool (*eq)(void *aim, void *node), void *aim, List *list); 

/* Returns a new list that passes the predicate p */ 
List filter(bool (*p)(void *data), List list); 

/* Print list to f by applying print to each node that is not NULL */ 
extern void print_list(void (*print)(FILE *f, void *data), FILE *f, List node); 

/* Free the memory allocated to each list node */ 
extern void free_list(List node); 

我知道,爲了實現一個隊列,我需要至少兩個功能,enqueue()dequeue()。我繼續創建了這些功能和隊列的類型定義我自己的頭文件,使用列表類型從上面的頭文件:

//Queue.h 
#include "list.h" 

typedef List Queue; 

//Add item to queue... 
void enqueue(Queue q, void *data); 

//removes and returns an item from the queue... 
void dequeue(Queue *q); 

然後我繼續在queue.c實現的源代碼。我只爲實現enqueue現在,因爲我想確保它在移動之前的工作:

#include "queue.h" 

void enqueue(Queue q, void *data){ 
    if (q == NULL){ 
     q = push(q, data); 
    } 
    else { 
     insert(data, &q); 
    } 
} 

真不簡單,我知道了。我打算用下面的文件,main.c所測試的隊列:

#include <stdio.h> 
#include "queue.h" 

int main(int argc, char **argv){ 
    Queue q = NULL; 
    int i; 
    for (i = 0; i < 10; i++){ enqueue(q, &i); } //one line for brevity 
    return 0; 
} 

在這一點上我不希望看到任何輸出,當我跑main.c,所有我的預期是該方案與沒有錯誤運行然後停下來。一切編譯正常,但是當我跑main.c所有我得到的是:

sh: ./main.exe: bad file number 

這是什麼意思和任何人可以查明這可能是造成這個問題呢?

編輯:源代碼被編譯爲這樣:

gcc -c list.c 
gcc -c queue.c 
gcc -c main.c -o main.exe 
+0

請問你可以像這樣編譯 - > gcc list.c queue.c main.c -o main .exe –

回答

0

這不完全是關於C編程問題,但對不正確調用編譯器COMMANDE。

您的編譯命令不完整。

使用此:

gcc -c list.c 
gcc -c queue.c 
gcc -c main.c 
gcc list.o main.o queue.o -o main.exe 
./main.exe 

說明:

gcc -c list.c       produces list.o 
gcc -c queue.c       produces queue.o 
gcc -c main.c       produces main.o 
gcc list.o main.o queue.o -o main.exe invokes the linker that links the .o files 
             together producing main.exe 

./main.exe        run the program 

有可能是在你的C代碼,其他編程相關的問題。

0

您的enqueue功能打破push方法的合同。

push方法返回新的頭。

你將需要:

Queue enqueue(Queue q, void *data){ 
    return push(q, data); 
} 

而且在您的來電:

for (i = 0; i < 10; i++){ 
    q = enqueue(q, &i); 
} 

但請注意,這將推動相同的指針每次迭代。如果更改i,您將更改隊列中每個節點的值。這可能不是你想要的!

另請注意,排隊本地(自動)變量的地址可能是一件壞事,當變量超出範圍時可能會導致堆棧問題。 (在你的情況下,imain中聲明,所以在程序結束之前它不會超出範圍。)

+0

我繼續前進並更改了'enqueue'函數,但它仍不會將元素添加到隊列中。你能看到這個問題嗎? – JavascriptLoser

+0

添加第一個元素時,隊列的頭部從「NULL」更改爲第一個隊列項目。您需要以某種方式更新隊列指針。我建議你返回新的地址,但是你還沒有這樣做,所以'main'中'q'的值永遠不會從最初的'NULL'值改變。 –