在学习链表的时候,在插入链表的时候,使用头插法遇到了问题。

问题遇到的现象和发生背景

在学习链表的时候,使用头插法遇到了问题。

问题相关代码,请勿粘贴截图

#include
#include

struct Node {
int date;
struct Node* next;
};

/*创建链表头 /
struct Node createList()
{
struct Node
headNode = (struct Node
)malloc(sizeof(struct Node));

headNode->date = 1;
headNode->next = NULL;
return headNode;

}

/创建节点/
struct Node* createNode(int data)
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->date = data;
newNode->next = NULL;

return newNode;

}
/打印链表/
void printList(struct Node* headNode)
{
struct Node* pmove;
pmove = headNode->next;

while (pmove)
{
    printf("%d", pmove->date);
    pmove = pmove->next;

}
printf("\n");

}

/插入节点,插入哪个链表,插入节点的数据是多少,头插法/
void inserNodebyHead(struct Node* headNode, int data)
{
/创建新的节点/
struct Node* newNode = createNode(data);

newNode->next = headNode->next;
//newNode = headNode->next;   ** //使用这一句代码时,不能正常打印出链表的成员,而下面那句代码却可以**
headNode->next = newNode;

}

int main()
{
struct Node* list = createList();

inserNodebyHead(list, 1);
inserNodebyHead(list, 2);
inserNodebyHead(list, 3);
printList(list);
  

return 0;

}
/正确运行的输出结果是321,而使用那句问题代码时,却什么都没有打印,好想知道问题出在哪/

这是带头结点的链表,headNode->next 指向链表的第一个结点,而void inserNodebyHead(struct Node* headNode, int data)插入函数是头插法,newNode 是待插入的新结点,所以头插法就是:newNode->next = headNode->next; 这句将新结点尾指针 newNode->next 指向链表的第一个结点,即headNode->next; 指向的结点。
headNode->next = newNode; 这句实现将头结点的尾指针指向待插入新结点 newNode,让 newNode 成为链表的第一个结点。所谓头插法,是每次把新结点插入到链表的第一个结点位置,所以上面的代码没问题。

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

struct Node {
    int date;
    struct Node* next;
};

//创建链表头
struct Node* createList()
{
    struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
    headNode->date = 1;
    headNode->next = NULL;
    return headNode;
}

//创建节点
struct Node* createNode(int data)
{
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->date = data;
    newNode->next = NULL;
    return newNode;
}
//打印链表
void printList(struct Node* headNode)
{
    struct Node* pmove;
    pmove = headNode->next;
    while (pmove)
    {
        printf("%d", pmove->date);
        pmove = pmove->next;
    }
    printf("\n");
}

//插入节点,插入哪个链表,插入节点的数据是多少,头插法
void inserNodebyHead(struct Node* headNode, int data)
{
    //创建新的节点
    struct Node* newNode = createNode(data);
    newNode->next = headNode->next; //将新结点尾指针 newNode->next 指向链表的第一个结点,即headNode->next;
    //newNode = headNode->next; //这句是使新结点的指针newNode 指向头结点的尾指针 headNode->next?
    headNode->next = newNode;//将头结点的尾指针headNode->next指向待插入新结点  newNode,让 newNode 成为链表的第一个结点。
}

int main()
{
    struct Node* list = createList();

    inserNodebyHead(list, 1);
    inserNodebyHead(list, 2);
    inserNodebyHead(list, 3);
    printList(list);

    return 0;
}