单链表的尾插、头插、遍历、删除及清空

 代码预览:

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

typedef struct slist//创建节点结构体并重命名
{
    int id;
    struct slist* next;
}L;//也可以分开写:typedef struct slist L

//创建一个节点
L* creat_node(int data)
{
    //给每个节点分配结构体所需大小的空间
    L* p = (L*)malloc(sizeof(L));//类似int *p=(int*)malloc(sizeof(L))
    if (p == NULL)
    {
        perror;
        return NULL;
    }
    //把分配的空间数据清零
    memset(p, 0, sizeof(L));//memset(链表名称,赋值的值,空间大小)
    //初始化节点数据
    p->id = data;
    //把节点指针后续指向为NULL
    p->next = NULL;
    //返回指向这个节点的指针:p
    return p;
}

//链表尾插
void tail_insert(L* pH, L* n)
//参数为:指向链表的指针(头结点)、指向需插入节点的指针
{
    //获取当前节点的位置,访问头节点
    L* p = pH;
    //判断当前节点是否为尾节点
    while (NULL != p->next)
    {
        p = p->next;//移动到下一节点
    }
    //循环结束说明当前节点为尾节点
    p->next = n;//将新节点插入至尾节点
}

//链表头插
void top_insert(L* pH, L* n)//参数为:指向链表的指针(头结点)、指向需插入节点的指针
{
    //获取当前节点的位置,访问头节点
    L* p = pH;
    //获取第一个节点的位置
    p = p->next;//头结点后一位即首元节点,即第一个节点的位置
    n->next = p;
    //头结点指针再指向当前节点
    pH->next = n;
}

//单链表遍历
void Print_node(L* pH)//参数为:头结点
{
    //获取当前节点的位置,访问头节点
    L* p = pH;
    //获取第一个节点的位置,即首元节点的位置
    p = p->next;//头结点后一位即首元节点,即第一个节点的位置
    //判断当前节点是否为尾节点
    while (NULL != p->next)
    {
        printf("%d  ", p->id);//打印该节点的数据域
        p = p->next;//移动到下一节点
    }
    //循环结束说明当前节点为尾节点
    printf("%d\n", p->id);//打印尾节点的数据域
}

//单链表删除
int delate_list_node(L* pH, int data)//参数为:头结点、需删除节点的数据域;
                                     //需要返回值判断有无完成删除,所以用int
{
    //获取当前节点的位置,访问头节点
    L* p = pH;
    //定义一个指针保留当前节点
    L* prev = NULL;
    //判断当前节点是否为尾节点
    while (NULL != p->next)
    {
        //保留当前节点
        prev = p;
        //指针移动到下一节点
        p = p->next;
        if (p->id == data)
        {
            if (p->next != NULL)//当前节点不为尾节点
            {
                prev->next = p->next;
                free(p);
            }
            else//当前节点为尾节点
            {
                prev->next = NULL;
                free(p);
            }
            return 1;
        }
    }
    printf("没有需删除的节点\n");
    return 0;
}

//链表清空
int Free_list_node(L* pH)
{
    L* p;
    while (pH != NULL)
    {
        p = pH->next;
        free(pH);
        pH = p;
    }
    return 0;
}

int main()
{
    //创建一个节点
    int i;
    L* header = creat_node(0);
    for (i = 0; i < 10; i++)
    {
        tail_insert(header, creat_node(i));
    }
    Print_node(header);

    delate_list_node(header, 5);
    Print_node(header);

    top_insert(header, creat_node(5));
    Print_node(header);

    //清空链表
    Free_list_node(header);

    return 0;
}

先声明头文件,需用到三个

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

 1、创建节点结构体(可重命名)

typedef struct slist//创建节点结构体并重命名
{
    int id;
    struct slist* next;
}L;
//重命名部分也可以分开写:typedef struct slist L;
//这里是将struct slist重命名为L;

2、编写链表相关功能程序

2.1.创建节点

//创建一个节点
L* creat_node(int data)
{
    //给每个节点分配结构体所需大小的空间
    L* p = (L*)malloc(sizeof(L));//类似int *p=(int*)malloc(sizeof(L))
    if (p == NULL)
    {
        perror;
        return NULL;
    }
    //把分配的空间数据清零
    memset(p, 0, sizeof(L));//memset(链表名称,赋值的值,空间大小)
    //初始化节点数据
    p->id = data;
    //把节点指针后续指向为NULL
    p->next = NULL;
    //返回指向这个节点的指针:p
    return p;
}

2.2.单链表的尾插

//链表尾插
void tail_insert(L* pH, L* n)//参数为:指向链表的指针(头结点)、指向需插入节点的指针
{
    //获取当前节点的位置,访问头节点
    L* p = pH;
    //判断当前节点是否为尾节点
    while (NULL != p->next)
    {
        p = p->next;//移动到下一节点
    }
    //循环结束说明当前节点为尾节点
    p->next = n;//将新节点插入至尾节点
}

2.3.单链表的头插

//链表头插
void top_insert(L* pH, L* n)//参数为:指向链表的指针(头结点)、指向需插入节点的指针
{
    //获取当前节点的位置,访问头节点
    L* p = pH;
    //获取第一个节点的位置
    p = p->next;//头结点后一位即首元节点,即第一个节点的位置
    n->next = p;
    //头结点指针再指向当前节点
    pH->next = n;
}

2.4.单链表的遍历

//单链表遍历
void Print_node(L* pH)//参数为:头结点
{
    //获取当前节点的位置,访问头节点
    L* p = pH;
    //获取第一个节点的位置,即首元节点的位置
    p = p->next;//头结点后一位即首元节点,即第一个节点的位置
    //判断当前节点是否为尾节点
    while (NULL != p->next)
    {
        printf("%d  ", p->id);//打印该节点的数据域
        p = p->next;//移动到下一节点
    }
    //循环结束说明当前节点为尾节点
    printf("%d\n", p->id);//打印尾节点的数据域
}

2.5.单链表的删除

//单链表删除
int delate_list_node(L* pH, int data)//参数为:头结点、需删除节点的数据域;需要返回值判断有无完成删除,所以用int
{
    //获取当前节点的位置,访问头节点
    L* p = pH;
    //定义一个指针保留当前节点
    L* prev = NULL;
    //判断当前节点是否为尾节点
    while (NULL != p->next)
    {
        //保留当前节点
        prev = p;
        //指针移动到下一节点
        p = p->next;
        if (p->id == data)
        {
            if (p->next != NULL)//当前节点不为尾节点
            {
                prev->next = p->next;
                free(p);
            }
            else//当前节点为尾节点
            {
                prev->next = NULL;
                free(p);
            }
            return 1;
        }
    }
    printf("没有需删除的节点\n");
    return 0;
}

2.6.单链表的清空

//链表清空
int Free_list_node(L* pH)
{
    L* p;
    while (pH != NULL)
    {
        p = pH->next;
        free(pH);
        pH = p;
    }
    return 0;
}

3、创建主函数引用

int main()
{
    //创建一个节点
    int i;
    L* header = creat_node(0);
    for (i = 0; i < 10; i++)
    {
        tail_insert(header, creat_node(i));
    }
    Print_node(header);

    delate_list_node(header, 5);
    Print_node(header);

    top_insert(header, creat_node(5));
    Print_node(header);

    //清空链表
    Free_list_node(header);

    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值