鱼C论坛

 找回密码
 立即注册
查看: 5456|回复: 8

[已解决]C链表插入不成功, 排查了一下午实在是查不出来了

[复制链接]
发表于 2021-7-18 16:49:29 | 显示全部楼层 |阅读模式
5鱼币

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

  3. typedef struct node {
  4.         int             data;
  5.         struct node*    next;
  6. } Node;

  7. void insert(Node* head, int data){
  8.         // create new node
  9.         Node* newNode = (Node*)malloc(sizeof(Node));
  10.         newNode->data = data;
  11.         newNode->next = NULL;


  12.         if(head->next == NULL){
  13.                 head->next = newNode;
  14.         }else{
  15.                 Node* temp = head->next;
  16.                 while(temp){
  17.                         printf("%x \n", temp);
  18.                         temp = temp->next;
  19.                 }
  20.                 temp = newNode;
  21.         }

  22. }

  23. int main(){

  24.         Node head;
  25.         head.data = -1;
  26.         head.next = NULL;


  27.         insert(&head, 10);
  28.         insert(&head, 11);
  29.         insert(&head, 12);

  30.         Node* temp = head.next;
  31.         while(temp != NULL){
  32.                 printf("%d \n", temp->data);
  33.                 temp = temp->next;
  34.         }
  35. }
复制代码
最佳答案
2021-7-18 16:49:30

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

  3. typedef struct node {
  4.         int             data;
  5.         struct node*    next;
  6. } Node;

  7. void insert(Node* head, int data){
  8.         // create new node
  9.         Node* newNode = (Node*)malloc(sizeof(Node));
  10.         newNode->data = data;
  11.         newNode->next = NULL;


  12.         if(head->next == NULL){
  13.                 head->next = newNode;
  14.         }else{
  15.                 Node* temp = head->next;
  16.                 //修改如下 输出结果为12 11 10
  17.                 newNode->next=temp;
  18.                 head->next=newNode;
  19.                                
  20.                                
  21.        while(temp){
  22.                         printf("%x \n", temp);
  23.                         temp = temp->next;
  24.                 }
  25.         }
  26. //                                temp = newNode;

  27. }

  28. int main(){

  29.         Node head;
  30.         head.data = -1;
  31.         head.next = NULL;


  32.         insert(&head, 10);
  33.         insert(&head, 11);
  34.         insert(&head, 12);

  35.         Node* temp = head.next;
  36.         while(temp != NULL){
  37.                 printf("%d \n", temp->data);
  38.                 temp = temp->next;
  39.         }
  40. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-18 16:49:30 | 显示全部楼层    本楼为最佳答案   

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

  3. typedef struct node {
  4.         int             data;
  5.         struct node*    next;
  6. } Node;

  7. void insert(Node* head, int data){
  8.         // create new node
  9.         Node* newNode = (Node*)malloc(sizeof(Node));
  10.         newNode->data = data;
  11.         newNode->next = NULL;


  12.         if(head->next == NULL){
  13.                 head->next = newNode;
  14.         }else{
  15.                 Node* temp = head->next;
  16.                 //修改如下 输出结果为12 11 10
  17.                 newNode->next=temp;
  18.                 head->next=newNode;
  19.                                
  20.                                
  21.        while(temp){
  22.                         printf("%x \n", temp);
  23.                         temp = temp->next;
  24.                 }
  25.         }
  26. //                                temp = newNode;

  27. }

  28. int main(){

  29.         Node head;
  30.         head.data = -1;
  31.         head.next = NULL;


  32.         insert(&head, 10);
  33.         insert(&head, 11);
  34.         insert(&head, 12);

  35.         Node* temp = head.next;
  36.         while(temp != NULL){
  37.                 printf("%d \n", temp->data);
  38.                 temp = temp->next;
  39.         }
  40. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-18 17:43:09 | 显示全部楼层
你源代码打算采用什么插入方式?我是看不出你是想用那种方式插入
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-18 21:42:11 | 显示全部楼层
作者的思路呢应该是采用尾插法,但是在遍历链表时,temp最终会指向NULL,最后直接temp = newNode,相当于赋值,当然链表是连接不上的。
  1. void insert(Node* head, int data){
  2.         // create new node
  3.         Node* newNode = (Node*)malloc(sizeof(Node));
  4.         newNode->data = data;
  5.         newNode->next = NULL;


  6.         if(head->next == NULL){
  7.                 head->next = newNode;
  8.         }else{
  9.                 Node* temp = head->next;
  10.                 while(temp->next != NULL){
  11.                         printf("%x \n", temp);
  12.                         temp = temp->next;
  13.                 }
  14.                 temp->next = newNode;
  15.         }

  16. }
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
怪胎 + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-18 22:39:43 | 显示全部楼层
你的 insert 函数的参数是 Node* 类型的,但是没有函数返回值
intsert 函数可以是这两种
1.参数是 Node**,函数没有返回值。
2.参数是 Node*,函数的返回值 是 Node* 把头指针返回或者把头指针删除了(free函数),返回第一个有数据的结点
通过你的 insert 函数看出 你对单链表和指针还不是很清楚

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
怪胎 + 2 + 2 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-22 09:49:13 | 显示全部楼层
@Max472 @love_qj  @大马强  感谢三位朋友的指点, 已经通过刷B站视频解决了, 还是链表这一块基础太差了, 想根据自己的想法写出链表, 结果...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-22 09:49:50 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct node{
  4.         int data;
  5.         struct node* next;
  6. } Node;

  7. int main(){
  8.         // 初始化一个头节点
  9.         Node head;
  10.         head.data = -1;
  11.         head.next = NULL;

  12.         // 循环5次并创建五个节点插入到链表中
  13.         int i;
  14.         for(i=0; i<5; i++){
  15.                 Node* newNode = (Node*)malloc(sizeof(Node));
  16.                 newNode -> data = i;
  17.                 // 核心算法: 下面的两句代码
  18.                 newNode -> next = head.next; // 1. 新节点指向头结点指向的节点
  19.                 head.next = newNode;             // 2, 再让头结点指向新节点
  20.                
  21.         }
  22.        
  23.         // 根据头结点遍历链表
  24.         Node* temp = head.next;
  25.         while(temp != NULL){
  26.                 printf("%d \n", temp->data);
  27.                 temp = temp->next;
  28.         }
  29. }       
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-22 09:50:39 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

typedef struct node{
        int data;
        struct node* next;
} Node;

int main(){
               
        Node* head;
        Node* rear;

        head = rear = (Node*)malloc(sizeof(Node));
       
        head->data = -1;
        head->next = NULL;
        rear = head;

        // 利用尾插法循环创建五个节点
        int i;
        for(i=0; i<5; i++){
                // 创建一个新节点
                Node* newNode = (Node*)malloc(sizeof(Node));
                newNode->data = i;
                // 尾插法的核心三行代码
                newNode->next = rear->next;
                rear->next = newNode;
                rear = newNode;
        }
       
        // 遍历并输出已生成好的链表
        Node* temp = head->next;
        while(temp){
                printf("%d \n", temp->data);
                temp = temp->next;
        }
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-22 15:12:05 | 显示全部楼层
加油加油,一起进步
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 20:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表