球最佳~
在Insert函数中未正确分配内存给新节点:
您在Insert函数中尝试使用node指针来存储新节点的数据,但node在分配内存之前是指向NULL的。这会导致访问空指针的成员,从而产生未定义行为(通常是崩溃)。
在Display函数中访问最后一个节点的Next指针:
在Display函数中,当node指向最后一个节点时,您尝试访问node->Next(这将是NULL),然后没有打印换行符或分隔符。这会导致输出在同一行连续显示,并且由于while循环的条件是node->Next,实际上最后一个元素不会被打印。
循环结束条件设置问题:
您的Insert函数中的循环结束条件依赖于用户输入0来退出循环,但您实际上读取的是j的值。这可能不是最佳实践,因为用户可能需要输入非零值来退出循环。不过,这本身不是导致死循环的原因,但可能导致逻辑混乱。
- #include <stdio.h>
- #include <stdlib.h>
-
- typedef struct ListNode {
- int data;
- struct ListNode* Next;
- } ListNode;
-
- void InitList(ListNode *L) {
- L->data = 0; // 通常头节点的数据不使用
- L->Next = NULL;
- }
-
- void Insert(ListNode* L) {
- int i;
- int j = 1;
- while (j) {
- printf("你要输入的数值(输入0结束):");
- scanf("%d", &i);
- if (i == 0) {
- j = 0;
- continue;
- }
- ListNode* node = (ListNode*)malloc(sizeof(ListNode)); // 分配内存
- if (!node) {
- perror("内存分配失败");
- exit(EXIT_FAILURE);
- }
- node->data = i;
- node->Next = L->Next;
- L->Next = node;
- }
- }
-
- void Display(ListNode* L) {
- ListNode* node = L->Next; // 从头节点的下一个节点开始
- printf("表中数据:");
- while (node) {
- printf("%d ", node->data);
- node = node->Next;
- }
- printf("\n"); // 添加换行符
- }
-
- int main(void) {
- ListNode *Head = (ListNode*)malloc(sizeof(ListNode));
- if (!Head) {
- perror("内存分配失败");
- exit(EXIT_FAILURE);
- }
- InitList(Head);
- Insert(Head);
- Display(Head);
-
- // 释放链表内存(可选,通常根据需要决定是否释放)
- // 这里略去释放链表内存的代码,因为它可能会变得复杂
-
- free(Head); // 释放头节点内存
- return 0;
- }
复制代码
注意:我添加了对malloc的返回值进行检查,以确保内存分配成功。在实际应用中,您可能还需要在适当的时候释放分配的内存,以避免内存泄漏。但请注意,在简单示例中,可能并不总是需要释放所有内存,因为这可能会使代码变得复杂。此外,我还修改了Display函数,使其从头节点的下一个节点开始遍历,并在打印完所有元素后添加一个换行符。