单链表(详细代码)

概述

链表是数据结构中线性表的一种,和顺序表不同,其在内存中的数据是非连续存储的。

 数组顺序表顺序存储的,也就是内存是连续的;而链表是通过指针将不连续的内存连接起来,实现链式储存的。

链表特点:

1.没有固定的长度,可以自由增加节点

2.能够实现快速的插入删除数据

3.尾节点的后继必定指向空

代码实现

一、单链表的存储结构

//节点数据结构
struct Node
{
    int data;
    Node *next;
};
//单链表数据结构
typedef struct
{
    int len;//链表长
    Node *pHead;//头节点
}LinkList;

二、单链表的构建

//---构造空链表L---
bool InitList(LinkList *L)
{   //1.动态开辟辅助节点
    Node *p = (Node *)malloc(sizeof(Node));
    p->next = nullptr;
    p->data =0;
    //2.动态开辟辅助链表
    LinkList *l = (LinkList*)malloc(sizeof(LinkList));
    l->pHead = p;//头指针指向头节点
    l->len =0;
    //3.将辅助链表拷贝到原链表
    *L = *l;
    return true;
}

三、单链表的插入

//---在单链表第n个位置之前插入m---
bool Insert(LinkList *L,int n,int m)
{
    //1.插入位置不在范围内
    if (n<1 || n>L->len+1)
        return false;
    //2.在头节点前插入
    if (n == 1)
    {
        Node *p = L->pHead;//辅助节点
        //动态开辟插入节点   
        Node *pThis = (Node *)malloc(sizeof(Node));
        pThis->next = p;
        pThis->data = m;
        L->pHead = pThis;
        L->len++;
        return true;
    }
    //3.开始插入
    Node *p = L->pHead;//辅助节点
    for (int i = 1; i < n-1; i++)
    {
        p = p->next;//寻找插入位置
    }
    //动态开辟插入节点
    Node *pThis = (Node *)malloc(sizeof(Node));
    pThis->next = p->next;
    pThis->data = m;
    p->next = pThis;
    L->len++;
    return true;
}

四、单链表的删除 

//---将单链表第n个位置的数删除---
bool Delete(LinkList *L,int n)
{
    //1.链表为空
    if (L->len == 0)
        return false;
    //2.删除位置不在范围内
    if (n<1 || n>L->len)
        return false;
    //3.删除头节点
    if (n == 1)
    {
        Node *p = L->pHead;//辅助节点
        L->pHead = p->next;
        L->len--;
        delete [] p;//释放辅助节点
        return true;
    }
    //4.开始删除
    Node *p = L->pHead;//辅助节点
    for (int i = 1; i < n-1; i++)
    {
        p = p->next;//寻找删除位置
    }
    Node *pThis = p->next;//删除节点
    p->next = pThis->next;
    L->len--;
    delete [] pThis;//释放删除节点
    return true;
}

五、清空单链表 

//---将单链表清空---
bool Clear(LinkList *L)
{
    Node *pThis = L->pHead->next;//辅助节点
    Node *p;//清除节点
    while (pThis)
    {
        L->pHead->next = pThis->next;
        p = pThis;
        pThis = pThis->next;
        delete [] p;//释放清除节点
    }
    L->pHead->next = nullptr;
    L->len = 0;
    return true;
}

六、遍历单链表 

//---将单链表遍历---
void OutPut(LinkList *L)
{
    printf("链表长为%d\n",L->len);
    Node *pThis = L->pHead;
    for (int i = 0; i < L->len; i++)
    {
        printf("%d\n",pThis->data);
        pThis = pThis->next;
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
单链表是一种常见的数据结构,它由多个节点组成。每个节点包含两个部分:数据域和指针域。数据域用于存储节点中的数据,指针域用于指向下一个节点的地址。通过指针,多个节点可以组成一个链表,形成一种线性结构。 下面是一个简单的单链表代码实现: ```C++ #include <iostream> using namespace std; // 定义节点结构体 struct ListNode { int val; // 数据域 ListNode *next; // 指针域 ListNode(int x) : val(x), next(NULL) {} // 构造函数 }; // 定义链表类 class LinkedList { public: LinkedList() : head(NULL) {} // 构造函数 ~LinkedList(); // 析构函数 void insert(int val); // 插入节点 void remove(int val); // 删除节点 void print(); // 打印链表 private: ListNode *head; // 头指针 }; // 析构函数 LinkedList::~LinkedList() { ListNode *p = head; while (p != NULL) { ListNode *q = p->next; delete p; p = q; } } // 插入节点 void LinkedList::insert(int val) { ListNode *node = new ListNode(val); if (head == NULL) { head = node; } else { ListNode *p = head; while (p->next != NULL) { p = p->next; } p->next = node; } } // 删除节点 void LinkedList::remove(int val) { if (head == NULL) { return; } if (head->val == val) { ListNode *p = head; head = head->next; delete p; } else { ListNode *p = head; while (p->next != NULL && p->next->val != val) { p = p->next; } if (p->next != NULL) { ListNode *q = p->next; p->next = q->next; delete q; } } } // 打印链表 void LinkedList::print() { ListNode *p = head; while (p != NULL) { cout << p->val << " -> "; p = p->next; } cout << "NULL" << endl; } // 测试代码 int main() { LinkedList list; list.insert(1); list.insert(2); list.insert(3); list.print(); list.remove(2); list.print(); return 0; } ``` 在这个实现中,我们定义了一个 ListNode 结构体,其中包含了一个整数类型的数据域和一个指针类型的指针域。同时,我们定义了一个 LinkedList 类,用于实现单链表的基本操作。 在 insert 方法中,我们首先创建一个新的节点,然后遍历链表,找到最后一个节点,将新节点插入到链表的末尾。 在 remove 方法中,我们首先判断头节点是否是要删除的节点,如果是,直接删除头节点。否则,遍历链表,找到要删除的节点,将其从链表中移除。 最后,在 print 方法中,我们遍历链表,将每个节点的值打印出来。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你怎么知道我头发乌黑浓密

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

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

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

打赏作者

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

抵扣说明:

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

余额充值