师--链表的结点插入

这篇博客介绍了如何进行链表的节点插入操作,包括查询、顺序插入和输出。通过示例展示了处理包含多个插入操作的链表问题,当插入位置超过链表长度时,新元素将被添加到链表末尾。题目给出了输入输出格式,并提供了一个被接受的代码示例。

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

think:
1链表的查询操作+ 链表的顺序插入操作+链表的输出操作

sdut原题链接

师–链表的结点插入
Time Limit: 1000MS Memory Limit: 65536KB

Problem Description
给出一个只有头指针的链表和 n 次操作,每次操作为在链表的第 m 个元素后面插入一个新元素x。若m 大于链表的元素总数则将x放在链表的最后。

Input
多组输入。每组数据首先输入一个整数n(n∈[1,100]),代表有n次操作。
接下来的n行,每行有两个整数Mi(Mi∈[0,10000]),Xi。

Output
对于每组数据。从前到后输出链表的所有元素,两个元素之间用空格隔开。

Example Input
4
1 1
1 2
0 3
100 4

Example Output
3 1 2 4

Hint

Author

以下为accepted代码

#include <stdio.h>
#include <stdlib.h>
struct node
{
    int Data;
    struct node *next;
}*head;
### 如何在链表插入节点 在链表插入节点的操作需要根据链表的类型(单向链表或双向链表)以及插入位置的不同而有所变化。以下是两种常见链表类型的插入方法及其示例代码。 #### 单向链表插入节点 在单向链表插入节点时,通常需要遍历链表以找到插入的合适位置,并调整指针关系。以下是一个在已排序单向链表插入节点的示例代码[^2]: ```c #include <stdio.h> #include <stdlib.h> struct ListNode { int data; struct ListNode* next; }; void insertNode(struct ListNode** head, int value) { struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode)); newNode->data = value; newNode->next = NULL; if (*head == NULL || (*head)->data >= value) { newNode->next = *head; *head = newNode; return; } struct ListNode* current = *head; while (current->next != NULL && current->next->data < value) { current = current->next; } newNode->next = current->next; current->next = newNode; } void printList(struct ListNode* node) { while (node != NULL) { printf("%d -> ", node->data); node = node->next; } printf("NULL\n"); } int main() { struct ListNode* head = NULL; insertNode(&head, 10); insertNode(&head, 5); insertNode(&head, 15); insertNode(&head, 7); printList(head); // 输出: 5 -> 7 -> 10 -> 15 -> NULL return 0; } ``` #### 双向链表插入节点 在双向链表插入节点时,除了调整`next`指针外,还需要调整`prev`指针以确保链表结构的完整性。以下是一个在指定节点后插入节点的示例代码[^4]: ```c #include <stdio.h> #include <stdlib.h> struct DListNode { int data; struct DListNode* next; struct DListNode* prev; }; void insertAfter(struct DListNode* temp, int value) { if (temp == NULL) { printf("The given previous node cannot be NULL"); return; } struct DListNode* newNode = (struct DListNode*)malloc(sizeof(struct DListNode)); newNode->data = value; newNode->next = temp->next; newNode->prev = temp; if (temp->next != NULL) temp->next->prev = newNode; temp->next = newNode; } void printList(struct DListNode* node) { while (node != NULL) { printf("%d <-> ", node->data); node = node->next; } printf("NULL\n"); } int main() { struct DListNode* head = NULL; struct DListNode* second = NULL; struct DListNode* third = NULL; head = (struct DListNode*)malloc(sizeof(struct DListNode)); second = (struct DListNode*)malloc(sizeof(struct DListNode)); third = (struct DListNode*)malloc(sizeof(struct DListNode)); head->data = 1; head->next = second; head->prev = NULL; second->data = 2; second->next = third; second->prev = head; third->data = 3; third->next = NULL; third->prev = second; insertAfter(second, 4); printList(head); // 输出: 1 <-> 2 <-> 4 <-> 3 <-> NULL return 0; } ``` #### 插入操作的关键点 - 在单向链表插入节点时,需要找到插入位置并正确设置`next`指针[^1]。 - 在双向链表插入节点时,除了设置`next`指针外,还需要设置`prev`指针以维护链表的双向性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值