鱼C论坛

 找回密码
 立即注册
查看: 1356|回复: 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);//为什么无输出

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-8 17:28:31 | 显示全部楼层
为什么没有插入节点?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-8 18:05:38 | 显示全部楼层
1. 代码逻辑不对
2. 申请了内存不释放
3. node *n = (node *)malloc(sizeof(node));
这里为什么不写成这样?
node *n = malloc(sizeof(node));
#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));
    node *n = malloc(sizeof(node));
    if (!n)
    {
        printf("申请内存失败");
        return;
    }
    n->data = data;
    n->next = NULL;

    if(!*head) {*head = n; return;}
    node* temp = *head;
    while(temp->next) temp = temp->next;
    temp->next = n;

    /*
    node* temp = head;
    if (!head)
    {
        head = n;
    }
    else
    {
        while (temp)
        {
            temp = temp->next;
        }
        temp = n;
    }
    */
}

void free_list(node *n) {
    while(n) {
        node *temp = n; n = temp->next;
        free(temp);
    }
}

int main(void)
{
    node *head = initLinkTable();
    for (int i = 0; i < 5; i++)
    {
        addNode(&head, i);
    }
    displayEle(head);//为什么无输出
    free_list(head);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2021-8-8 20:33:08 | 显示全部楼层
麻烦各位大佬看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

为什么要强制转换?不转换不行吗?
不转换可以,为什么要转换?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

都说了你代码逻辑不对,不能那样写
想知道小甲鱼最近在做啥?请访问 -> 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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 12:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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