链接列表C插入功能

时间:2014-11-09 09:20:01

标签: c pointers linked-list

我明天在数据结构中考试,我想在这段代码中找出插入函数。请问您能在函数Insert中向我解释为什么temp->next = head

#include <stdio.h>
#include <stdlib.h>

struct Node {

    int data;
    struct Node* next;
};

struct Node* head;

void Insert(int x) {

    struct Node *temp = (struct Node*)malloc(sizeof(struct Node));
    temp->data = x;
    temp->next = NULL;
    if(head != NULL) { temp->next = head;}
    head = temp;


}

void Print() {

    struct Node* temp = head;
    printf("List is: ");

    while(temp != NULL) {

        printf(" %d",temp->data);
        temp = temp->next;

    }
    printf("\n");

}


int main() {

     head = NULL;

     Insert(1);
     Insert(2);
     Insert(3);
     Insert(4);
     Insert(5);

     Print();



    return 0;
}

4 个答案:

答案 0 :(得分:1)

根据你的评论 -

  

“但是当我们删除这部分时为什么程序不起作用?是吗?   保留旧头的地址打印清单?

不,不是。因为这里......

if(head != NULL) { temp->next = head;}
head = temp;

...我们看到,如果我们删除head = temp;您将会删除您的列表,因为如果head == NULL它仍然是NULL。如果没有,则您没有指向temp的链接,因此您孤立temp以及所有其他insert

if(head != NULL) { temp->next = head;}语句确保,如果您有一个,您的列表会附加到新的head,但如果没有head = temp;语句则不会物质

答案 1 :(得分:0)

void Insert(int x) {

    struct Node *temp = (struct Node*)malloc(sizeof(struct Node));
    temp->data = x;
    temp->next = NULL;
    if(head != NULL) { temp->next = head;}
    head = temp;


}

让我们看一下例子: -

insert(1);

将创建新节点并将其数据字段设置为1.然后它检查head是否为NULL。是的,因为这是我们插入的第一个元素。所以它突出了这个元素。这意味着在此之后

head -> 1

现在你做

insert(2);

在同一行上它将创建节点以容纳2.接下来它检查head是否为NULL。它不是那么执行

temp->next = head;

表示临时节点(即2)接下来将指向head(现在为1)。在此声明之后

2 -> 1 (head)

然后你执行

head = temp;

这将使头部指向2(新创建的节点)

(head) 2->1

通过这种方式,您将继续添加元素并保持头指针指向添加到列表中的最新元素。这将帮助您稍后使用头指针遍历列表。

答案 2 :(得分:0)

通过替换头部,在列表的前面插入新节点。新头将是新分配的节点temp,旧头将是列表中的第二个节点,因此temp->next

这些概念可以通过铅笔和纸张的帮助轻松想出来。或者使用ASCII草图,其中->表示通过next指针的链接,|表示指向不是节点链接的节点的直接指针:

head
 | 
 3 -> 2 -> 1 -> NULL

插入4后,但在分配新头之前:

temp head
 |    |
 4 -> 3 -> 2 -> 1 -> NULL

分配新头后:

head 
 |   
 4 -> 3 -> 2 -> 1 -> NULL

现在您有了一个正确的列表,您可以通过headnext指针访问所有添加的节点。如果您没有重新签名head,则只能访问旧节点。

这也适用于head == NULL的空列表,但您无法访问head->next

答案 3 :(得分:0)

在链接列表中添加新元素后会发生这种情况。当你添加新元素时,你必须将新元素作为头部,所以你必须指向前一个头作为链表中的下一个项目。