c中的链表



我对用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 );

如果res0one_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;

你有一个ListNode的集合。每个Node都有一个指针info指向一个Job,即数据记录。在Job内,您有参考编号和工作名称。reference_number之所以称为key,是因为它是用于比较Job记录的字段。

List没有提到Job,只提到NodeNode没有数据,只有一个指针。因此,使用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()只接收一个指向JobList的指针,以及要比较 2 的函数的名称。
  • create()返回指向新List的指针,其限制设置为最大 # 个节点
  • remove()获取一个参考编号,如果在List中找到它,则删除记录并返回 0
  • search()的工作方式相同

我建议你这样写。如果您需要帮助,我可以提供更多代码。我今天没有时间写一个完整的例子。

相关内容

  • 没有找到相关文章

最新更新