C语言两种方式创建链表(头插法与尾插法)

标题 C语言两种方式创建链表(头插法与尾插法)

……不多解释了,都在代码注释里
1.头插法

//头插法创建链表
#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
    int data;
    struct node *next;
}Node;
int main()
{
    Node *head,*p,*q,*t;
    head=(Node*)malloc(sizeof(Node));//创建头结点
    head->next=NULL;//初始化为空链表
    int a,n;//要输入的数以及要创建的结点个数
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        p=(Node *)malloc(sizeof(Node));
        p->data=a;;
        p->next=head->next;//头插法类似于插入排序,将原本头结点指向的内容赋值给要插入的结点的后继指针
        head->next=p;//再使得头结点指向要插入的结点
        //每一次新插入的结点都在头结点的后面,所以输出顺序和输入顺序是逆序
    }
    t=head->next;//从首结点处开始遍历
    while(t!=NULL)
    {
        cout<<t->data<<" ";
        t=t->next;
    }
    cout<<endl;
}

运行结果:
在这里插入图片描述

2.尾插法

//尾插法创建链表
#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
    int data;
    struct node *next;
}Node;
int main()
{
    Node *head,*p,*q,*t;
    head=(Node*)malloc(sizeof(Node));//创建头结点
    head->next=NULL;//初始化为空链表
    int a,n;//要输入的数以及要创建的结点个数
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        //动态申请一个空间用于存放结点
        p=(Node*)malloc(sizeof(Node));
        p->data=a;;
        p->next=NULL;//设置当前结点的下一个结点为空
        if(head->next==NULL)
        head->next=p;//如果这是第一个创建的结点,则将头结点的后继指针指向当前结点
        else
            q->next=p;//如果不是,则将上一个结点的后继指针指向当前结点
        q=p;//指针q也必须指向当前结点,尾插法的关键
    }
    t=head->next;//从首节点处开始遍历输出
    while(t!=NULL)
    {
        cout<<t->data<<" ";
        t=t->next;
    }
    cout<<endl;
}

运行结果
在这里插入图片描述
以上内容若有错误或需要改进之处,欢迎在评论区提出,共同进步。()

  • 28
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
链表是一种常见的数据结构,其中每个节点包含一个数据部分和一个指向下一个节点的指针部分。链表通常通过指针连接起来,形成一个链式结构。对于链表插入操作,常见的有头插法尾插法两种方法。 头插法是将新节点插入链表头部,也就是成为新的头结点,如下面的代码所示: ```c typedef struct node { int data; struct node *next; } Node; // 头插法 void insert_head(Node **head, int data) { Node *new_node = (Node*)malloc(sizeof(Node)); // 创建新节点 new_node->data = data; // 将数据复制到节点中 new_node->next = *head; // 将新节点的next指针指向原头结点 *head = new_node; // 将新节点设置为新的头结点 } ``` 尾插法是将新节点插入链表尾部,也就是成为新的尾结点,如下面的代码所示: ```c // 尾插法 void insert_tail(Node **head, int data) { Node *new_node = (Node*)malloc(sizeof(Node)); // 创建新节点 new_node->data = data; // 将数据复制到节点中 new_node->next = NULL; // 将新节点的next指针设置为NULL if (*head == NULL) { // 如果链表为空 *head = new_node; // 新节点成为头结点 } else { // 如果链表不为空 Node *p = *head; while (p->next != NULL) { // 遍历链表,找到最后一个节点 p = p->next; } p->next = new_node; // 将新节点插入链表末尾 } } ``` 以上两个函数中,都使用了双重指针来修改头结点指针的值。在头插法中,我们将新节点的next指针指向原头结点,再将新节点设置为新的头结点;在尾插法中,我们遍历链表找到最后一个节点,然后将新节点插入到末尾。 当然,以上两种方法都有各自的优缺点,需要根据具体情况来选择使用哪种方法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值