我一直在试图弄清楚如何将一个节点添加到列表的开头,但我似乎无法使其工作,我通过我的代码编写了评论,解释了我遇到的问题,我找不到任何好的教程对我有用,因为我一直有错误,我对将要发生的事情有一个公平的理解,但还没有弄明白。
到目前为止我的代码:
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
}
void addToStart(struct node **head);
int main(){
int choice;
// This is how you initialize nodes, right?
struct node *head = (struct node *)malloc( sizeof(struct node) );
struct node *listPtr;;
head->data= 0;
head->next = NULL;
listPtr = head;
printf("Pick one of the following:\n");
printf("1) add node to start\n");
printf("2) add node to end\n");
printf("3) display all nodes\n");
printf("4) display length\n");
printf("5) search list\n");
scanf("%d", choice);
switch(choice){
case 1:
addToStart();
break;
}
}
/* This is ment to be a funct to add a node to the start? I got it from my
college notes but not sure if im using it right, am I ment to pass
something through it? if so what? */
void addToStart (struct node **head)
{
struct node *newNode;
newNode = (struct node*)malloc(sizeof(struct node));
printf("\nEnter data for this node");
scanf("%d", &newNode->data);
/*What is happening in these 2 lines below? it looks confusing and makes me
feel like im doing the same thing twice, from what I understand we are giving the next in the node newNode the address of head,
the starting node, but then we
point head to new node? wut?*/
newNode->next = *head;
*head = newNode; // transfer the address of newNode' to 'head'
}
答案 0 :(得分:0)
head指向列表中的第一个节点。因此,它获取新分配节点的地址。另一行将前一个节点连接成第二个节点(头部的下一个节点)。
您应该仅通过将列表指针设置为NULL来初始化列表。然后,您所要做的就是使用您的函数添加节点。
struct node *head = NULL;
addToStart(&head);
head->data = 42; // assuming you want to assign 42 in the first node
答案 1 :(得分:0)
您希望在列表的开头添加一个新节点,这意味着您必须创建一个新节点,并将列表开头的节点(列表的第一个节点 - 头部)分配为刚刚创建的新节点的下一个节点..
列表的头部是列表的第一个节点 - 因为你必须能够从内存中获取节点,然后你可以在每个节点指向另一个节点时遍历节点。直到你找到一个没有指向任何节点的节点(node-&gt; next == NULL) - 这是列表的末尾..
更难的是,如果你不得不在列表的开头和末尾插入节点......想象你已经有了10个节点的列表,你需要将节点插入第五个节点在列表中......在这种情况下,您必须创建一个新节点,您将分配您节点列表的第五个节点作为新创建节点的下一个节点(因为您新创建的节点必须是在列表的第5个位置,因此前第5个节点将成为第6个节点),您必须重新指定节点列表的第4个节点以指向新创建的节点,因为它是下一个节点节点..
我知道这有点令人困惑,记得我在大学一开始就挣扎于此......
答案 2 :(得分:0)
(C ++风格,但在适当的时候更改为malloc)
// head points to the first node in the list
head = new Node(value, head);
// now head points to a new Node whose next pointer is the node which head pointed to before
C样式:
Node* newNode = (Node*) malloc(sizeof(Node));
newNode->value = val;
newNode->next = head;
head = newNode;
答案 3 :(得分:0)
示例代码:
node * head;
node * newnode;
/* ... */
newnode = malloc(sizeof(node));
node->data = ... ;
node->next = head;
head = node;