链表的插入(向链表追加数据)

本文介绍了一种在已形成的链表中追加数据的方法。通过示例代码详细展示了如何实现链表的创建、查找指定位置及在指定位置插入新节点的过程。

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

上接—>《链表的创建(形成链表)》

该部分为形成链表之后,再向已形成链表追加数据

插入方式有很多

以下为其中一种:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct node{
	int data;
	struct node *next;
}LNode,*LinkList;
LinkList GreatLinkList(int n) { /*形成长度为n的链表*/
	LinkList p, q, listTop = NULL;
	int i;
	printf("请为链表输入值:\n");
	for (i = 1; i <= n; i++) {
		p = (LinkList)malloc(sizeof(LNode));
		if (p == NULL) exit(0);
		scanf("%d", &p->data);
		p->next = NULL;
		if (listTop == NULL)listTop = p;
		else q->next = p;
		q = p;
	}
	return listTop;
}
void addLinkList(LinkList list, LinkList q) {
	/*ListTop为待插入链表头指针,向p指出的结点后面插入新结点*/
	LinkList p;/*形成一个新的结点指针*/
	p = (LinkList)malloc(sizeof(LNode));/*生成新结点*/
	printf("要追加的新数据:");
	scanf("%d", &p->data);
	if (list == NULL) {/*要追加的链表为空表*/
		list = p;
		list->next = NULL;
	}
	else { /*在要插入位置进行操作*/
		p->next = q->next;
		q->next = p;
	}
}
LinkList FindLinkList(LinkList list) {
	/*返回要插入位置*/
	int x;
	if (list == NULL) exit(0);/*空表*/
	LinkList p;
	p = list;
	printf("选择追加数据的位置:");
	scanf("%d", &x);
	while (p)
	{
		if (p->data == x) return p;
		p = p->next;
	}
	return NULL;
}
void PrintfList(LinkList list) {
	LinkList p;
	p = list;
	printf("当前链表内容:\n");
	while (p)
	{
		printf("%d\n", p->data);
		p = p->next;
	}
}
int main() {
	int n;
	LinkList list;
	LinkList addList_q;
	printf("要形成的链表长度:");
	scanf("%d", &n);
	list = GreatLinkList(n);
	PrintfList(list);
	addList_q = FindLinkList(list);
	addLinkList(list, addList_q);
	PrintfList(list);
	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、付费专栏及课程。

余额充值