链式存储——链表的创建和遍历

本文详细解析了链表的创建与遍历过程,重点介绍了使用C++如何创建链表并进行遍历输出,探讨了在创建链表时为何需要使用引用以及遍历时为何不需要的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
using namespace std;
//链表结构体
struct LNode
{
    int data;
    LNode* next;
};
//创建一个含有n个结点的链表,L1为头结点
//结点data元素从1开始递增,步长为1
void create(LNode &L1,int n)
{
    int i = 2;
    LNode *p = &L1;              //p指向头结点
    L1.data = 1;
    while(n!=1)
    {
        LNode *temp = new LNode;
        if (n!=2)
        {
            p->next = temp;
            temp->data = i;
            p = temp;
        }
        else
        {
            p->next = temp;
            temp->data = i;
            temp->next = NULL;
        }
        n--;i++;
    }
}

//遍历链表
void print(LNode L1)
{
    LNode *p = &L1; 
    while(p)            //若p不等于NULL
    {
            cout<<p->data<<endl;
        p = p->next;
    }
}

int main()
{
    LNode a;
    create(a,15);
    print(a);
}

上述代码最终将输出1,2,3……14,15;

思考:为什么创建链表时需要引用,遍历时不需要?

创建链表时以某个结点作为头结点开始创建,倘若不用引用,形参L1是暂态的,实参单纯地给形参赋了值,接下来的操作和实参没有任何关系,当函数调用完后,形参会被释放,因此并不能通过该实参找到整个链表;

遍历链表时,因为打印都是在函数里实现的,因此只需将头结点的data和next传递给形参,形参得到了实参的next,即可通过此找到以该实参为头结点的整个链表;

链表是一种数据结构,它通过链接节点而不是连续的内存地址来存储元素。每个节点包含两个部分:一个是存储数据的数据域,另一个是指向下一个节点的指针域。链表的操作通常涉及创建、插入、删除节点以及遍历列表等。 对于链表的基本操作,你可以创建一个名为`LinkedList`或`ListManager`的主函数,例如在C++中: ```cpp #include <iostream> using namespace std; // 定义链表节点结构体 struct Node { int data; // 节点存储的数据 Node* next; // 指向下一个节点的指针 }; // 创建新的链表节点 Node* createNode(int value) { Node* newNode = new Node(); if (newNode != nullptr) { newNode->data = value; newNode->next = nullptr; } return newNode; } // 插入节点到链表 void insertNode(Node** head, int value, int position) { if (*head == nullptr) { *head = createNode(value); } else { Node* newNode = createNode(value); Node* current = *head; for (int i = 0; i < position - 1 && current != nullptr; ++i) { current = current->next; } if (current != nullptr) { newNode->next = current->next; current->next = newNode; } } } // 删除节点 void deleteNode(Node** head, int value) { if (*head != nullptr && (*head)->data == value) { Node* temp = *head; *head = (*head)->next; delete temp; } else { Node* current = *head, *prev = nullptr; while (current != nullptr && current->data != value) { prev = current; current = current->next; } if (current != nullptr) { prev->next = current->next; delete current; } } } // 遍历打印链表 void printList(Node* head) { if (head != nullptr) { while (head != nullptr) { cout << head->data << " "; head = head->next; } cout << endl; } else { cout << "链表为空" << endl; } } int main() { Node* head = nullptr; // 示例操作:插入节点、打印链表、删除节点 insertNode(&head, 1, 0); // 在开头插入1 insertNode(&head, 2, 1); // 在第二个位置插入2 printList(head); // 输出:1 2 deleteNode(&head, 2); // 删除值为2的节点 printList(head); // 输出:1 return 0; } ``` 这个例子展示了基本的链表操作,包括创建链表、插入节点、删除节点以及打印链表内容。当然,这只是一个简化版本,实际应用中可能会有更复杂的需求,比如处理动态大小的链表等。记得在使用完链表后释放内存,避免内存泄漏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值