C语言单链表带头

C语言带头链表

第二章:带头链表


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

   上一章我们讲述用C语言描述了一个不带头的链表,以及实现了它的增删改查,这章,我将用C语言描述一个带头结点链表的创建。


提示:结尾部分附加整体程序

一、头结点的作用

   头结点可以用来存储一些关于链表的长度,大小等相关信息,方便了操作的统一。

二、描述

1.定义结构体

代码如下(示例):

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

typedef struct Node *head;//头指针用它定义
typedef struct Node List;//结点用它来定义
struct Node
{
    int data;
    struct Node *next;
};

int main(int *argc, char **argv)
{
    List *node=NULL;//定义结点
    head Head=NULL;//头
    //{}这里添加相关链表操作
    return 0}

2.初始化头结点

代码如下(示例):

void List_Init(head *p)//初始化
{
    *p=(head)malloc(sizeof(List));//申请一个头指针空间
    (*p)->next=NULL;
}

3:用头插法创建链表

在这里插入图片描述

void List_create(head p)
{
    List *node;
    int a=0;
    while(1)
    {
        scanf("%d",&a);
        if(a<0)return;
        node = (List *)malloc(sizeof(List));
        node->data = a;
        node->next=p->next;//从前边插入
        p->next=node;//指向新插入的结点
    }
}

尾插法

在这里插入图片描述

void List_create_tail(head p)//尾插法
{
    List *node,*tail;
    int a=0;
    tail=p;
    while(tail->next)//移动到尾巴结点
    {
        tail=tail->next;
    }
    while(1)
    {
        scanf("%d",&a);
        if(a>=0)
        {
            node = (List *)malloc(sizeof(List));
            node->data=a;
            tail->next=node;
            printf("p=%p tail=%p\n",p,tail);
            tail=node;
            printf("tail=%p  node=%p  p=%p\n",tail,node,p);
        }
        else
        {
            tail->next=NULL;//将最后一个一定要置空最后一步操作是tail=node;
            //tail->next=p;//循环链表
            return;
        }
    }
    return;
}

4:打印

void List_printf(head p)//P指向上一个node;
{   
    List *x;
    int i=0;
    x=p->next;//让X指向第一个结点
    while(x!=NULL)
    {
        printf("第%d个=%d\n",++i,x->data);
        x=x->next;
    }
    return;
}

总结

   提示:带头结点的链表在结构上不同于不带头的链表,但是操作方法上依然相吻合,不带都结点的增删改查依然适用于带头结点,这里就不再多写,如果有想学习的伙伴可以看我的上一节内容,不带头的链表,里边详细介绍了增删改查的流程。
   下面是以上程序的整个工程文件,复制可用

/*
作者:亿只萌新
年龄:21
婚姻状况:单身
程序内容:带头结点的链式存储链表
*/
#include <stdio.h>
#include <stdlib.h>

typedef struct Node *head;//头指针用它定义
typedef struct Node List;//结点用它来定义
struct Node
{
    int data;
    struct Node *next;
};

void List_Init(head *p)//初始化
{
    *p=(head)malloc(sizeof(List));//申请一个头指针空间
    (*p)->next=NULL;
}
void List_create(head p)
{
    List *node;
    int a=0;
    while(1)
    {
        scanf("%d",&a);
        if(a<0)return;
        node = (List *)malloc(sizeof(List));
        node->data = a;
        node->next=p->next;//从前边插入
        p->next=node;//指向新插入的结点
    }
}
void List_create_tail(head p)//尾插法
{
    List *node,*tail;
    int a=0;
    tail=p;
    while(tail->next)//移动到尾巴结点
    {
        tail=tail->next;
    }
    while(1)
    {
        scanf("%d",&a);
        if(a>=0)
        {
            node = (List *)malloc(sizeof(List));
            node->data=a;
            tail->next=node;
            printf("p=%p tail=%p\n",p,tail);
            tail=node;
            printf("tail=%p  node=%p  p=%p\n",tail,node,p);
        }
        else
        {
            tail->next=NULL;//将最后一个一定要置空最后一步操作是tail=node;
            //tail->next=p;//循环链表
            return;
        }
    }
    return;
}
void List_printf(head p)//P指向上一个node;
{   
    List *x;
    int i=0;
    x=p->next;//让X指向第一个结点
    while(x!=NULL)
    {
        printf("第%d个=%d\n",++i,x->data);
        x=x->next;
    }
    return;
}
int main(int *argc, char **argv)
{
    List *node=NULL;//定义结点
    head Head=NULL;//头
    List_Init(&Head);//初始化
    List_create(Head);//头插入
    List_create(Head);
    List_create_tail(Head);//尾插入
    List_create_tail(Head);
    List_printf(Head);
    return 0;
}

还没有点收藏的小伙伴不要愣着了哦,下一期我们更新双链表和广义表。

  

上一章:最完整C语言链表不带头【点击学习】

下一章:C语言双链表带头(增,删,改,查,排序)

加QQ群:928357277

想要了解更多内容,欢迎加群讨论

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亿只萌新

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值