我对用c编码相当陌生,偶然发现了一个问题。下面的代码是我到目前为止拥有的代码。
我遇到的麻烦是语法,更具体地说是如何遍历列表。在过去的一周里,我一直在研究不同的资源,但没有一个解释如何使用类似的结构数据类型。我尝试循环浏览列表的方式导致错误,并且由于列表的顺序递增 - 基于参考编号,因此我在正确的位置添加作业时遇到了问题。
我遇到的另一个问题是在函数 5 中。我不太确定如何通过字符指针返回整数和字符值,除非您只返回整个job_node。截至目前,我已经将节点的值转换为字符。
由于我没有用 c 编写太多代码 - 关于如何在不更改函数值的情况下使代码更有效的任何其他建议都将非常有帮助。
链表是节点的容器,每个节点都有一些数据有效载荷。通常,每个数据记录都有一个键,一个用于比较两个记录的值。在学生的作业中,数据通常是一个简单的字母或数字。在您的情况下是指向"职位发布"的指针。
下面我将向您展示另一种写他的方式。但首先...
请务必注意,该列表是节点的容器,而不是职位列表。列表不是节点,节点不是列表,数据也不是节点。
像在程序中那样混合这些东西只会导致问题:例如,您将无法使用列表来包含其他数据。在不更改数据的情况下更改列表的实现时会遇到问题。如果您更改职位发布中的字段,则需要更改列表功能。 只有问题。
例
bool job_insert(int refNum, char job_name[], struct job_list * list);
应该像
int insert_l( Job* job_post ,List* the_list ,int(*compare_function)(void*,void*));
为什么?
使用- 前一种方法,您可以只使用指向
Job
---的指针,通常您应该使用void*
,以便您可以使用数据记录中的任何内容,而无需更改参数列表。 - 这样,如果您将字段添加到
Job
或将参考编号更改为char[]
以添加校验位,则无需在此处更改内容 compare_function()
比较两个Job
,如果第一个更大,则返回 -1,如果第二个更大,则返回 1,或者 0。这样,您可以随时更改排序条件,只需编写一个新的 10 行函数,并按新条件插入记录。Cqsort()
使用这个,C++sort()
使用这个,Borland Turbo Pascal在80年代使用这个。它简单而灵活。- 该功能可以像
int compare_reference(void* a, void* b)
{
int first = ((Job*) a)->reference_number;
int second = ((Job*) b)->reference_number;
if (first < second ) return 1;
if (first > second ) return -1;
return 0;
};
并像这样使用
int res = insert_l( one_job, new_jobs, compare_reference );
如果res
0
one_job
则插入new_jobs
正确的位置。它也更容易阅读:根据标准将记录插入列表。
如果在任何时候你需要使用降序或按其他条件排序,你只需要传递一个新函数。这意味着您可以使用与列表相关的相同函数来包含任何数据。这也是仅使用指向数据元素的无效指针的原因......
返回程序
这可能是一个测试文件来驱动测试:
1 engineer
2 magician
3 astronaut
4 actress
5 truck driver
6 writer
结构
typedef struct
{
int reference_number;
char* job_name;
} Job;
typedef struct node_
{
Job* info; // pointer to data record
struct node_ *next;
struct node_ *prev;
} Node;
typedef struct
{
unsigned size; // actual size
unsigned capacity; // limit in # of nodes
Node* head;
Node* tail;
} List;
你有一个List
是Node
的集合。每个Node
都有一个指针info
指向一个Job
,即数据记录。在Job
内,您有参考编号和工作名称。reference_number
之所以称为key
,是因为它是用于比较Job
记录的字段。
List
没有提到Job
,只提到Node
。Node
没有数据,只有一个指针。因此,使用List
来包含歌曲、汽车或书籍,例如下一行作业很容易;)
函数
List* create_l(unsigned); // return new List
List* delete_l(List*); // erase one
int insert_l( Job*,List*,int(*)(void*,void*)); // insert based on function
List* merge_l(List*,List*,int(*)(void*,void*) ); // merge 2 lists into a 3rd
int remove_by_ref_l(int,List*); // delete a record
char* search_job_l(int,List*); // search for job description for a reference#
我相信现在你会看到一些额外的便利:
insert()
只接收一个指向Job
和List
的指针,以及要比较 2 的函数的名称。create()
返回指向新List
的指针,其限制设置为最大 # 个节点remove()
获取一个参考编号,如果在List
中找到它,则删除记录并返回 0search()
的工作方式相同
我建议你这样写。如果您需要帮助,我可以提供更多代码。我今天没有时间写一个完整的例子。