C 中的头链表
先决条件:链表、循环链表
头节点是位于列表开头的特殊节点。包含这种类型节点的列表称为头链表。当需要在每个节点中找到的信息以外的信息时,这种类型的列表很有用。
例如,假设有一个应用程序,其中经常计算列表中的项目数。通常,总是遍历列表以查找列表的长度。但是,如果当前长度保持在附加的头节点中,则可以轻松获得该信息。
头链表的类型
- 接地头链表
它是一个列表,其最后一个节点包含NULL指针。在头链表中,起始指针总是指向头节点。 start -> next = NULL表示接地头链表为空。在这种类型的链表上可能的操作是插入、删除和遍历。 - 循环头链表
最后一个节点指向头节点的链表称为循环链表。链不指示第一个或最后一个节点。在这种情况下,外部指针提供了一个参考框架,因为循环链表的最后一个节点不包含NULL指针。这种类型的链表可能的操作是插入、删除和遍历。
// C program for a Header Linked List
#include
#include
// Structure of the list
struct link {
int info;
struct link* next;
};
// Empty List
struct link* start = NULL;
// Function to create a header linked list
struct link* create_header_list(int data)
{
// Create a new node
struct link *new_node, *node;
new_node = (struct link*)
malloc(sizeof(struct link));
new_node->info = data;
new_node->next = NULL;
// If it is the first node
if (start == NULL) {
// Initialize the start
start = (struct link*)
malloc(sizeof(struct link));
start->next = new_node;
}
else {
// Insert the node in the end
node = start;
while (node->next != NULL) {
node = node->next;
}
node->next = new_node;
}
return start;
}
// Function to display the
// header linked list
struct link* display()
{
struct link* node;
node = start;
node = node->next;
while (node != NULL) {
printf("%d ", node->info);
node = node->next;
}
printf("\n");
return start;
}
// Driver code
int main()
{
// Create the list
create_header_list(11);
create_header_list(12);
create_header_list(13);
// Print the list
display();
create_header_list(14);
create_header_list(15);
// Print the list
display();
return 0;
}
输出:
11 12 13
11 12 13 14 15
头链表的应用
多项式
- 头链表经常用于维护内存中的多项式。头节点用于表示零多项式。
- 假设我们有
F(x) = 5x 5 – 3x 3 + 2x 2 + x 1 +10x 0 - 从由 F(x) 表示的多项式可以清楚地看出,该多项式有两部分,系数和指数,其中, x是形式参数。因此,我们可以说多项式是项的总和,每项都由一个系数和一个指数组成。
- 计算机实现需要将多项式实现为系数和指数对的列表。这些对中的每一个都将构成一个结构,因此多项式将表示为结构列表。
- 如果想借助链表来表示 F(x),那么该链表将包含 5 个节点。当我们链接每个节点时,我们得到一个表示多项式F(x) 的链表结构。
多项式相加
- 要添加两个多项式,我们需要扫描它们一次。
- 如果在两个多项式中找到具有相同指数的项,则将系数相加,否则,我们将较大指数的项复制到总和中并继续。
- 当我们到达多项式之一的末尾时,另一个多项式的剩余部分被复制到总和中。
- 假设我们有两个多项式,如图所示,我们必须执行这些多项式的加法。
- 当我们扫描两个多项式的第一个节点时,我们发现第二个多项式中第一个节点的指数幂大于第一个多项式的第一个节点的指数幂。
- 这里第二个多项式的第一个节点的指数更大,因此我们必须将第二个多项式的第一个节点复制到总和中。
- 然后我们考虑第一个多项式的第一个节点,并再次将第一个多项式的第一个节点值与第二个多项式的第二个节点值进行比较。
- 这里第一多项式的第一节点指数值大于第二多项式的第二节点指数值。我们将第一个多项式的第一个节点复制到总和中。
- 现在考虑第一个多项式的第二个节点并将其与第二个多项式的第二个节点进行比较。
- 这里第二个多项式的第二个节点的指数值大于第一个多项式的第二个节点,因此我们将第二个列表的第二个节点复制到总和中。
- 现在我们考虑第二个多项式的第三个节点指数,并将其与第一个多项式的第二个节点指数值进行比较。我们发现两者相等,因此将它们的系数相加并复制到总和中。
- 这个过程一直持续到两个多项式的所有节点都用完为止。例如将上述两个多项式相加后,我们得到如下所示的结果多项式。
进一步参考:添加两个多项式
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。