一篇看懂链表增删改查(文末附完整文件可直接cv大法调试)

本文详细介绍了链表的创建、遍历、追加、删除、插入、修改和查找等基本操作。特别地,文章讨论了使用尾指针进行链表操作的优势,指出在初始化时,头指针和尾指针如何设置,并通过实例说明了如何高效地进行链表节点的添加操作。此外,还提供了完整的代码实现供读者调试学习。
摘要由CSDN通过智能技术生成

链表创建及功能实现
QT旧版本没搞明白怎么支持输出中文所以只能拿出散装英语了= =
语法错误勿怪哈~

ps:关于尾指针的一些心得

在头指针创建后,尾指针也创建了(其实都是一个节点指针的变量,只是头指针分配了内存,尾指针没有分配,只是一个指针变量),并指向头指针,这时候只有一个头指针,所以尾指针将指针域设置为NULL,也就是头指针的指针域设置为NULL,当要执行添加操作时,尾指针就像一个帽子,趴在目前最近的节点头上,看到NEW了一个新的节点,就将身下的节点的指针域由NULL改为NEW的节点的地址,然后喊NEW的节点把自己的指针域改为NULL,然后脱离目前这个节点-,跳到NEW的那个节点的头上,完成添加操作。

createList创建链表

//创建链表
PNODE createList()
{
   
    int len;    //有效节点的个数
    int val;    //存放临时数据

    PNODE pHead = (PNODE)malloc(sizeof(Node));
    if(NULL == pHead)
    {
   
        printf("malloc failed \n");
        exit(-1);
    }
//因为还没有新的节点,这时候尾指针和头指针指向同一个内存  
    pTail->pNext = NULL;

    printf("The len you need is: ");
    scanf("%d", &len);

    //对链表进行初始化,为所创建的len长度的链表分配内存并赋值
    for(int i=0; i<len; i++)
    {
   
        //printf里面的%d都是为逗号,后面的值服务的,在输出的时候%d就会替换为逗号后面的值,这里是逗号后面的值给前面的%d
        printf("Please enter no.%d segment val: ", i+1);
        //scanf这里是输出,是%d的值给后面的val,和printf的方向相反,这里把输入的值传递给变量val
        scanf("%d", &val);

        //为新节点分配空间
        PNODE pNew  = (PNODE)malloc(sizeof(NODE));
        {
   
            if(NULL == pNew)
            {
   
                printf("failed \n");
                exit(-1);
            }
        }
        pNew->data = val;

        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail = pNew;

    }
    return pHead;
}

遍历并输出链表内容

//遍历并输出链表内容
void traverse_list(PNODE pHead)
{
   
    PNODE p = pHead->pNext;
    printf("the value of the whole list now is :");
    while(NULL != p->pNext)
    {
   
        printf("%d ", p->data);

        p = p->pNext;
    }
    //如果p为尾节点了,就把这最后一个p的数据打印出来然后换行
    printf("%d \n \n", p->data);

    return;
}

尾部追加

//尾部追加
void append_list(PNODE pHead)
{
   
    int val;
    PNODE p = pHead->pNext;
    while(NULL != p->pNext)
    {
   
        p = p->pNext;
    }

    //创建一个新的节点
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if(pNew == NULL)
    {
   
        printf("append failed \n");
    }
    printf("scanf the data you want to append: ");
    //想要给这个变量传值就要取地址,因为这是一个临时变量而非指针
    scanf("%d", &val);

    pNew->data = val;
    //跳出循环时p就指向最后一个节点
    p->pNext = pNew;
    pNew->pNext = NULL;

   return;
}

删除指定位置节点

//删除指定位置(首节点为1)
void delete_list(PNODE pHead)
{
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值