鱼C论坛

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

C语言实现单链表

[复制链接]
发表于 2021-8-8 17:26:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# include <stdio.h>
#include <stdlib.h>
//定义节点
typedef struct NODE
{
        int data;
        struct NODE* next;
}node;
//初始化链表
node *initLinkTable()
{
        //创建一个头指针
        node *head = NULL;
        return head;
}
//展示列表元素
void displayEle(node* head)
{
        while (head)
        {
                printf("链表元素:%d\n", head->data);
                head = head->next;
        }
}
//增加节点,尾插法
void addNode(node* head,int data)
{
        node *n = (node *)malloc(sizeof(node));
        if (!n)
        {
                printf("申请内存失败");
                return;
        }
        n->data = data;
        n->next = NULL;
        node* temp = head;
        if (!head)
        {
                head = n;
        }
        else
        {
                while (temp)
                {
                        temp = temp->next;
                }
                temp = n;
        }
}
void main(void)
{
        node *head = initLinkTable();
        for (int i = 0; i < 5; i++)
        {
                addNode(head, i);
        }
        displayEle(head);//为什么无输出

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

使用道具 举报

 楼主| 发表于 2021-8-8 17:28:31 | 显示全部楼层
为什么没有插入节点?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-8 18:05:38 | 显示全部楼层
1. 代码逻辑不对
2. 申请了内存不释放
3. node *n = (node *)malloc(sizeof(node));
这里为什么不写成这样?
node *n = malloc(sizeof(node));

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

  3. //定义节点
  4. typedef struct NODE
  5. {
  6.     int data;
  7.     struct NODE* next;
  8. }node;

  9. //初始化链表
  10. node *initLinkTable()
  11. {
  12.     //创建一个头指针
  13.     node *head = NULL;
  14.     return head;
  15. }

  16. //展示列表元素
  17. void displayEle(node* head)
  18. {
  19.     while (head)
  20.     {
  21.         printf("链表元素:%d\n", head->data);
  22.         head = head->next;
  23.     }
  24. }

  25. //增加节点,尾插法
  26. void addNode(node **head, int data)
  27. {
  28.     //node *n = (node *)malloc(sizeof(node));
  29.     node *n = malloc(sizeof(node));
  30.     if (!n)
  31.     {
  32.         printf("申请内存失败");
  33.         return;
  34.     }
  35.     n->data = data;
  36.     n->next = NULL;

  37.     if(!*head) {*head = n; return;}
  38.     node* temp = *head;
  39.     while(temp->next) temp = temp->next;
  40.     temp->next = n;

  41.     /*
  42.     node* temp = head;
  43.     if (!head)
  44.     {
  45.         head = n;
  46.     }
  47.     else
  48.     {
  49.         while (temp)
  50.         {
  51.             temp = temp->next;
  52.         }
  53.         temp = n;
  54.     }
  55.     */
  56. }

  57. void free_list(node *n) {
  58.     while(n) {
  59.         node *temp = n; n = temp->next;
  60.         free(temp);
  61.     }
  62. }

  63. int main(void)
  64. {
  65.     node *head = initLinkTable();
  66.     for (int i = 0; i < 5; i++)
  67.     {
  68.         addNode(&head, i);
  69.     }
  70.     displayEle(head);//为什么无输出
  71.     free_list(head);
  72.     return 0;
  73. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-8 19:05:53 | 显示全部楼层
第三点是类型的强制转换啊。
逻辑就是,初始化时设置了指向null的头指针;addNode中,根据头指针是不是指向null来设置。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-8 20:33:08 | 显示全部楼层
麻烦各位大佬看看。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-8 20:54:19 | 显示全部楼层
wuxianbiao 发表于 2021-8-8 19:05
第三点是类型的强制转换啊。
逻辑就是,初始化时设置了指向null的头指针;addNode中,根据头指针是不是指 ...

为什么要强制转换?不转换不行吗?
不转换可以,为什么要转换?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-8 20:54:53 | 显示全部楼层
wuxianbiao 发表于 2021-8-8 20:33
麻烦各位大佬看看。

都说了你代码逻辑不对,不能那样写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-8 23:24:23 | 显示全部楼层
# include <stdio.h>
# include <stdlib.h>
//定义节点
typedef struct NODE
{
        int data;
        struct NODE* next;
}node;
//初始化链表
node *initLinkTable()
{
        //创建一个头节点
        node *head = (node *)malloc(sizeof(node));
        if (!head)
        {
                printf("申请内存失败");
                return;
        }
        head->next = NULL;
        return head;
}
//展示列表元素
void displayEle(node* head)
{
        node* temp = head;
        while (temp->next)
        {
                printf("111");
                printf("链表元素:%d\n", temp->next->data);
                temp = temp->next;
        }
}
//增加节点,尾插法
void addNode(node* head,int data)
{
        node *n = (node *)malloc(sizeof(node));
        if (!n)
        {
                printf("申请内存失败");
                return;
        }
        n->data = data;
        n->next = NULL;
        node* temp = head;
        while (temp->next)
        {
                temp = temp->next;
        }
        temp->next = n;
}
void main(void)
{
        node* head = initLinkTable();
        for (int i = 0; i < 5; i++)
        {
                addNode(head, i);
        }
        displayEle(head);
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-8 23:26:15 | 显示全部楼层
理解错了结构体指针的含义,上面的可以得到想要的结果。应该是将结构体指针的next指向新加入的节点,而不是将结构体指针指向新加入的节点。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 21:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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