我开始学习链表。我已经将我的代码粘贴在下面。我有一个疑问。当我在前面插入一个节点时,我把它做成一个头。所以每当我想打印时,我都会调用打印列表(头(。如果我想从第二个节点打印,该怎么办?最初我把它命名为头。现在会是什么?我还了解到链表中不可能随机访问。但是我可以从任何我想要的节点打印。请澄清。
#include <stdlib.h>
#include <stdio.h>
struct node{
char data;
struct node* next;
};
void printlist(struct node* n)
{
while(n!=NULL)
{
printf("%cn",n->data);
n=n->next;
}
}
void InsertNodeAtFirst(struct node** head_ref)
{
printf("Node insertion at firstn");
struct node* newnode = (struct node*)malloc(sizeof(struct node*));
newnode->data='a';
newnode->next= *head_ref;
*head_ref = newnode;
printf("n");
printlist(newnode);
}
void InsertNodeAfter(struct node* previous_node)
{
if(previous_node==NULL)
printf("Previous node cannot be blank or NULLn");
printf("Node insertion at middlen");
struct node* middlenode = (struct node*)malloc(sizeof(struct node*));
middlenode->data='c';
middlenode->next=previous_node->next;
previous_node->next = middlenode;
printf("n");
printlist(previous_node);
}
void InsertNodeAtEnd(struct node** LastNode)
{
printf("Node insertion at Endn");
struct node* newnode = (struct node*)malloc(sizeof(struct node*));
struct node* last = *LastNode;
newnode->data='f';
newnode->next=NULL;
while(last->next!=NULL)
{
last=last->next;
}
last->next=newnode;
printf("n");
}
int main(void)
{
struct node* head = (struct node*)malloc(sizeof(struct node*));
struct node* second = (struct node*)malloc(sizeof(struct node*));
struct node* third = (struct node*)malloc(sizeof(struct node*));
head->data='b';
head->next=second;
second->data='d';
second->next=third;
third->data='e';
third->next=NULL;
printlist(head);
InsertNodeAtFirst(&head);
InsertNodeAfter(head);
InsertNodeAtEnd(&head);
printlist(head);
}
如果我想从第二个节点打印怎么办?为此,将特定节点地址传递给printlist()
函数。
例如,在您的主函数中,在创建链表后询问用户您要从哪个节点打印。比方说n=2
例如
InsertNodeAtFirst(&head);
struct node *temp = head;
/* make temp to point to the node which you want */
/* Find particular node address from where you want to print */
for(int row= 0; row < n; row++){
if(temp->next != NULL)
temp = temp->next;
}
现在将printlist()
称为
printlist(temp);
我还了解到,在链表中不可能进行随机访问?只有当你知道该节点的地址时,它才有可能,要得到它,你必须从head
节点遍历。
Head 将永远是你的第一个列表节点。如果您想访问第二个,您将使用head->next
.
在列表中添加新元素时,当前节点将成为新节点的下一个指针,新节点指针将成为头部。
如果你想访问第三个,那么你需要有权访问新头的下一个指针的下一个指针,这使得它head->next-next
当我在前面插入一个节点时,我把它做成一个头。所以只要我想 要打印,我将调用打印列表(头(。如果我想从 第二个节点?最初我把它命名为头。现在会是什么?
名称head
是指头部,表达式head->next
是指跟随头部的元素等。
我还了解到链表中不可能随机访问。但 我可以从任何我想要的节点打印。请澄清。
随机访问具有特殊含义。这意味着您可以有效地访问所需的任何元素,通常带有其索引。在真正的链表中不可能进行随机访问,因为如果你想访问元素 n,你需要从 head 开始,然后找到下一个,然后找到下一个,依此类推。因此,访问元素 n 的总成本是 n 个操作。这实际上效率不高,因为访问元素所需的操作数会随着该元素的索引而增加。非常常见的随机访问结构是数组。