单项链表的实现(尾插法和头插法)

链表是一种不连续的线性表,在内存中表现为1:1的联系方式。

链表是由一个个节点组成的,节点分为两部分:一部分是数据区域,一部分是指针域。

记住实现链表有两个步骤:

1.分配空间

2.产生联系(每个节点的指针指向下一个节点)

 

1.尾插法:每次将新来的空间放入到尾节点之后,头节点保持不变

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

struct nd;
struct student;
typedef struct student dtype;
typedef struct nd node;
typedef struct nd* pnode;

struct student
{
        char name[10];
        int id;
};
struct nd
{
        dtype data;
        pnode next;
};

bool insert(pnode* pph,dtype data)
{
        pnode pnew=malloc(sizeof(note));
        if(NULL==pnew)
                return false;
        pnew->data=data;
        pnew->next=NULL;
        if(*pph==NULL)
                *pph=pnew;
        else
        {
                pnode prear=*pph;
                while(prear->next!=NULL)prear=prear->next;
                prear->next=pnew;
        }
        return true;
}

头插法:每次将新空间放到头节点之前,生成新的头结点。

bool insert(node** pph,dtype data)
{
        node* pnew=malloc(sizeof(node));
        if(pnew==NULL)
                return false;
        pnew->data=data;
        pnew->next=*pph;
        *pph=pnew;
        return true;
}

 

在C语言中,链表是一种动态数据结构,常用于存储一系列元素,不需要预先确定其大小。头插法(insert at head)尾插法(insert at tail)是链表操作的基本方法。 1. **头插法(Insert at Head)**: - 函数原型通常可以这样定义:`void insertAtHead(struct Node* *head, int data)`,其中`struct Node* *head`是头节点指针的指针,`data`是要插入的新值。 - 创建一个新的节点,并将其`next`字段设置为原来的头节点。 - 更新头节点指针指向新节点。 - 如果头节点本身就是新创建的,则不会改变原有链表。 2. **尾插法(Insert at Tail)**: - 函数原型类似:`void insertAtTail(struct Node* *head, int data)`。 - 步骤: - 创建新的节点并将它设为`NULL`,然后将新节点的`next`指针设置为当前最后一个节点。 - 如果链表为空(即头节点`*head`为`NULL`),则新节点同时作为头节点尾节点。 - 否则,遍历链表找到最后一个节点并更新它的`next`指针。 下面是一个简单的示例代码片段: ```c // 假设链表节点结构如下 typedef struct Node { int data; struct Node* next; } Node; // 头插法函数 void insertAtHead(Node** head, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = *head; *head = newNode; } // 尾插法函数 void insertAtTail(Node** head, int data) { if (*head == NULL) { insertAtHead(head, data); } else { Node* current = *head; while (current->next != NULL) current = current->next; current->next = (Node*)malloc(sizeof(Node)); current->next->data = data; current->next->next = NULL; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值