顺利建立链表

本文介绍如何通过输入的一系列整数顺序构建单链表,并遍历该链表输出整数序列。采用C++实现,确保不使用数组辅助。

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



数据结构实验之链表一:顺序建立链表

Time Limit: 1000MS Memory limit: 65536K

题目描述

输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据。

输入

第一行输入整数的个数N;
第二行依次输入每个整数。

输出

输出这组整数。

示例输入

8
12 56 4 6 55 15 33 62

示例输出

12 56 4 6 55 15 33 62

提示

不得使用数组!

来源

 数据结构走起。
#include<iostream>
using namespace std;
struct list
{

    int i;
    list *next;
};

int main()
{
    list *head,*p;
    int n;
    cin>>n;
    head=p=new list;
    cin>>p->i;
    n--;
    while(n--)
    {
        p->next=new list;
        p=p->next;
        cin>>p->i;
    }
    p->next=NULL;

    for(p=head;; p=p->next)
    {
        cout<<p->i<<" ";
        if(p->next==NULL)
            break;
    }
    return 0;
}

### 如何在链表中插入节点 #### 单向链表的插入操作概述 链表是一种线性的数据结构,其中每个节点由两部分组成:一部分用于存储实际的数据,另一部分则保存下一个节点的地址(即指针)。为了在单向链表中插入新节点,通常需要考虑以下几个方面: 1. **头结点的存在与否**:如果链表为空,则需将新节点设置为头结点[^1]。 2. **目标位置的选择**:根据需求决定是在头部、尾部还是中间某个特定位置插入节点[^2]。 以下是针对不同场景下的具体实现方法及其代码示例。 --- #### 头部插入节点 当希望在链表开头处新增加一个节点时,只需调整原首节点成为次节点即可完成整个过程。这种方法效率较高因为仅涉及少量指针修改工作量较小。 ```c void InsertAtHead(struct Node** head_ref, int new_data) { struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); new_node->data = new_data; new_node->next = *head_ref; // 新建节点指向原来的头节点 *head_ref = new_node; // 更新头指针至新的节点 } ``` 此处`InsertAtHead()`函数接受两个参数一个是双层间接寻址形式传来的头指针另一个是要存入的新数值通过动态内存分配创建了一个全新的节点并将其链接到了现有列表之前最后再改变全局意义上的起始点使其指向最新加入的那个实体从而实现了所谓的“前插”。 --- #### 尾部追加节点 对于某些应用场景而言可能更倾向于把待处理项附加到序列末端这种情况下就需要遍历整条链条直至找到最终一项然后建立连接关系形成扩展后的整体布局图样如下所示: ```c void Append(struct Node** head_ref, int new_data) { struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); struct Node* last = *head_ref; new_node->data = new_data; new_node->next = NULL; if (*head_ref == NULL) { // 若当前链表为空 *head_ref = new_node; // 则直接让new_node作为首个元素 return; } while (last->next != NULL) // 寻找最后一个节点 last = last->next; last->next = new_node; // 把新节点挂载到最后面去 } ``` 这里定义了辅助变量`last`用来追踪目前所到达的位置一旦发现其后续字段值等于零就意味着已经抵达终点于是就可以安全地执行赋值动作建立起必要的关联路径以便继续往后延伸下去[^2]. --- #### 中间任意位置插入 有时候我们还需要能够在既定顺序内部某固定索引附近安插额外的信息这就要求先定位好确切的目标然后再实施相应的结构调整措施比如下面这个例子展示了怎样基于给定关键字k寻找匹配对象之后在其右侧添加额外的内容进去. ```c bool InsertAfterKey(struct Node* prev_node, int key, int new_data){ if(prev_node==NULL || prev_node->data!=key){return false;} struct Node* new_node=(struct Node *)malloc(sizeof(struct Node)); new_node->data=new_data; new_node->next=prev_node->next;//使新节点指向旧节点原本指向的地方 prev_node->next=new_node; //更新之前的那个节点让它现在指向我们的新节点 return true; } ``` 在这个版本里首先验证所提供的前置条件是否满足如果不成立的话就立即返回错误标志告知调用方无法顺利完成预定的任务反之则按照常规流程构建一个新的实例并将之无缝嵌套进原有的框架之中同时保持原有逻辑的一致性和连贯性不受破坏[^1]. --- ### 总结说明 以上分别介绍了三种典型的关于如何向单向链表当中插入新成员的技术手段每种方式各有优劣适用于不同的实际情况开发者应当依据具体的业务背景灵活选用最合适的解决方案以达到最佳效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值