我已經給出了一些用於實現鏈接列表的現有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
請問你可以像這樣編譯 - > gcc list.c queue.c main.c -o main .exe –