在C中,如何将一个节点添加到列表的开头?

时间:2015-03-07 21:11:14

标签: c struct linked-list malloc nodes

我一直在试图弄清楚如何将一个节点添加到列表的开头,但我似乎无法使其工作,我通过我的代码编写了评论,解释了我遇到的问题,我找不到任何好的教程对我有用,因为我一直有错误,我对将要发生的事情有一个公平的理解,但还没有弄明白。

到目前为止我的代码:

#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'
}

4 个答案:

答案 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;