第8章结构体与其他结构类型作业 6-2 逆序建立链表 (10分)

本文介绍了一种通过逆序输入数据来构建链表的方法。利用C语言,我们创建了一个链表,该链表的节点顺序与输入数据的顺序相反。通过使用指针和动态内存分配,我们能够有效地实现这一目标。

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

本题要求实现,建立一个链表,按输入数据的逆序输出。
函数接口定义:
struct ListNode *create();

函数create利用scanf从输入中获取一系列正整数,当读到-1时表示输入结束。按输入数据的逆序建立一个链表,并返回链表头指针。
链表节点结构定义如下:
struct ListNode {
int data;
struct ListNode *next;
};

裁判测试程序样例:

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

struct ListNode {
int data;
struct ListNode *next;
};

struct ListNode *create();

int main()
{
struct ListNode *p, *head = NULL;
head = create();
p = head;
while(p != NULL )
{
printf("%d “, p->data);
p = p->next;
}
printf(”\n");

return 0;

}

/* 你的代码将被嵌在这里 */

输入样例:
在这里给出一组输入。例如:
1 2 3 4 5 6 7 -1

输出样例:
在这里给出相应的输出。例如:
7 6 5 4 3 2 1

struct ListNode *create()
{
 struct ListNode *top;
 struct ListNode *p;
 struct ListNode *head;
 int s;
 scanf("%d",&s);
 top=NULL;
 while(s!=-1)
 {
  p=(struct ListNode *)malloc(sizeof(struct ListNode));
  p->data=s;
  p->next=top;
  top=p;
  scanf("%d",&s);
 }
 return(top);
}
### 如何通过逆序数据构建单向或双向链表 #### 单向链表逆序构建方法 在单向链表中,每个节点包含两部:一部用于存储实际的数据,另一部一个指针,指向下一个节点。如果要按照逆序的方式构建单向链表,则可以采用头插法[^1]。这种方法的核心思想是在每次插入新节点时都将它作为新的头部节点。 以下是基于 C++ 的实现代码: ```cpp #include <iostream> using namespace std; // 定义单向链表节点结构体 struct Node { int data; Node* next; }; // 创建并初始化一个新的节点 Node* createNode(int value) { Node* newNode = new Node(); newNode->data = value; newNode->next = nullptr; return newNode; } // 使用逆序数据构建单向链表 void buildReversedSinglyLinkedList(Node*& head, const int data[], int size) { for (int i = 0; i < size; ++i) { Node* newNode = createNode(data[i]); if (!head) { // 如果链表为空 head = newNode; } else { newNode->next = head; // 将当前节点设置为新的头部 head = newNode; } } } ``` #### 双向链表逆序构建方法 对于双向链表而言,除了前向指针外还增加了一个反向指针 `prev`,因此需要额外处理该字段。同样也可以利用头插法来完成逆序构建过程。 下面是具体的实现代码: ```cpp #include <iostream> using namespace std; // 定义双向链表节点结构体 struct DNode { int data; DNode* prev; DNode* next; }; // 创建并初始化一个新的双向链表节点 DNode* createDNode(int value) { DNode* newNode = new DNode(); newNode->data = value; newNode->prev = nullptr; newNode->next = nullptr; return newNode; } // 使用逆序数据构建双向链表 void buildReversedDoublyLinkedList(DNode*& head, const int data[], int size) { for (int i = 0; i < size; ++i) { DNode* newNode = createDNode(data[i]); if (!head) { // 如果链表为空 head = newNode; } else { newNode->next = head; // 新节点的下一节点设为原头结点 head->prev = newNode; // 原头结点的上一节点设为新节点 head = newNode; // 更新头结点为新节点 } } } ``` 以上展示了如何别针对单向链表和双向链表使用逆序数据进行构建的过程及其对应的 C++ 实现代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值