数据结构-单链表(c++实现)

前言

顺序表用一段地址连续的存储单元存储数据元素,最大的缺点就是插入和删除时需要移动大量元素,耗费时间。链式存储线性表时,存储单元可以是连续的也可以是不连续的,通过“链”建立起数据元素之间的逻辑关系,因此插入和删除元素操作不需要移动元素,而只需要修改指针,但也会失去顺序表可随机存取的优点。我们将存储数据元素的域称为数据域,把存储后继位置的域称为指针域,这两部分信息组成结点。而此链表每个结点只含有一个指针域,所以叫做单链表。

一、单链表概念图

单链表每个结点只含有一个指针域。注意:头指针是链表的必要元素,头结点不一定是链表的必要元素。

二、C++单链表实现(完整代码)

代码如下(部分操作未做相关判断可自行添加,小白实现可能会有部分不足请见谅):

#include<iostream>
using namespace std;

typedef struct Node {
    int val;
    struct Node *next;
}ListNode, List;

//初始化链表
void InistList(List* &L)
{
    cout << "初始化链表" << endl;
    L->val = 0;
    L->next = NULL;
}

//头插法
void InsertListFront(List* &L, int elem)
{
    cout << "头插法" << endl;
    if (!L) {
        cout << "链表为空" << endl;
        return;
    }
    ListNode* q = NULL;
    q = new ListNode;  //为结点开辟空间
    q->val = elem;
    q->next = L->next;
    L->next = q;
}

//尾插法
void InsertListBack(List* &L, int elem)
{
    cout << "尾插法" << endl;
    if (!L) {
        cout << "链表为空" << endl;
        return;
    }
    ListNode* q = NULL;
    q = new ListNode;
    q->val = elem;
    ListNode* last = NULL;
    last = L;
    while (last->next) //将结点指到链表最后
    {
        last = last->next;
    }
    q->next = last->next;
    last->next = q;
}

//按位插入
void InsertListPose(List* &L, int pos, int elem) //pos为下标
{
    cout << "在" << pos << "位插入" << endl;
    List* L1 = NULL;
    L1 = L;
    int index = 0;
    while (index < pos && L1->next)  //遍历链表到pos前面一位
    {
        L1 = L1->next;
        index++;
    }
    ListNode* q = NULL;
    q = new ListNode;
    q->val = elem;
    q->next = L1->next;
    L1->next = q;
}

//删除位置结点
void DeleteLostPose(List* &L, int pos)
{
    cout << "删除" << pos << "位置结点" << endl;
    List* L1 = NULL;
    L1 = L;
    
    int index = 0;
    while (index < pos && L1->next)  //遍历链表到pos前面一位
    {
        L1 = L1->next;
        index++;
    }
    ListNode* q = NULL;
    q = new ListNode;
    q = L1->next;  //临时保存被删结点的地址以备释放空间
    L1->next = q->next;
    delete q;  //释放被删除结点的空间
}

//遍历链表
void PrintList(List* &L)
{
    cout << "遍历链表" << endl;
    if (!L){
        cout << "链表为空" << endl;
        return;
    }
    List* q = NULL;
    q = L->next;
    while (q)
    {
        cout << q->val << "  ";
        q = q->next;
    }
    cout << endl;
}

//销毁链表
void DeleteList(List* &L)
{
    cout << "销毁链表" << endl;
    ListNode* q = NULL;
    q = L;
    while (q)
    {
        L = L->next;
        delete q;  //释放被删除结点的空间
        q = L;
    }
}

int main()
{
    List *L = new List;
    InistList(L);
    for (int i = 0; i < 3; i++)
    {
        InsertListBack(L, i);
    }
    InsertListPose(L, 2, 22);
    PrintList(L);
    DeleteLostPose(L, 1);
    PrintList(L);
    DeleteList(L);
    PrintList(L);
    return 0;
}

总结

以上为单链表的创建等一系列操作,本人小白,如有错误,欢迎大佬们指点出来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
单链表是一种常见的数据结构,用于存储一系列的节点连接起来的数据。 在C语言中,我们可以使用结构体来定义一个节点,包含一个数据域和一个指向下一个节点的指针域。代码如下: ```c struct Node { int data; struct Node* next; }; ``` 然后,我们可以定义一个指向链表头部的指针,表示整个链表的起始位置。初始化链表时,这个指针可以指向NULL。 ```c struct Node* head = NULL; ``` 接下来,我们可以实现一些基本的操作,例如插入节点、删除节点、遍历链表等。 插入节点的过程包括创建一个新节点,并将其插入到链表中适当的位置。 ```c void insertNode(int value) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = value; newNode->next = NULL; if (head == NULL) { head = newNode; } else { struct Node* curr = head; while (curr->next != NULL) { curr = curr->next; } curr->next = newNode; } } ``` 删除节点的过程需要找到目标节点,并调整前后节点的指针。 ```c void deleteNode(int value) { if (head == NULL) { return; } if (head->data == value) { struct Node* temp = head; head = head->next; free(temp); return; } struct Node* prev = head; struct Node* curr = head->next; while (curr != NULL && curr->data != value) { prev = curr; curr = curr->next; } if (curr != NULL) { prev->next = curr->next; free(curr); } } ``` 遍历链表的过程是从头节点开始,依次打印每个节点的数据。 ```c void printList() { struct Node* curr = head; while (curr != NULL) { printf("%d ", curr->data); curr = curr->next; } printf("\n"); } ``` 这是一个简单的单链表实现示例,你可以根据需要进一步扩展和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值