C语言头插法尾插法创建单链表

前言

链表 [Linked List]:链表是由一组不必相连【不必相连:可以连续也可以不连续】的内存结构 【节点】,按特定的顺序链接在一起的抽象数据类型。
下面介绍单链表的创建:

创建节点

链表是由一个个节点构成的,首先我们就要创建节点
首先用结构体创建节点Node

typedef struct Node
{
	int data;			//数据域
	struct Node* next;  //指针域
}LNode, * Linklist;		//LNode为节点,Linklist为zhiz

头插法创建单链表

Linklist CreateFromHead() //头插法创建单链表
{
	Linklist L;			//定义头指针L
	LNode *s;			//定义节点的指针s
	int x;				//定义要输入的数据
	L = (Linklist)malloc(sizeof(Linklist));//为头指针开辟内存空间
	L->next = NULL;		//将头指针的next初始化为空
	//输入数据
	printf("请输入一个整型数:");
	scanf("%d", &x);
	//用循环继续添加数据,当输入为-1时输入完成
	while (x != -1)
	{
		s = (LNode*)malloc(sizeof(Linklist));//为新数据开辟内存空间
		s->data = x;		//将数据存入到节点的data中
		s->next = L->next;	//将新数据的next赋值为头节点的next
		L->next = s;		//将头节点指向新数据
		//继续输入新的数据
		printf("请输入一个整型数:");
		scanf("%d", &x);
	}
	return L;				//返回头节点
}

尾插法创建单链表

Linklist CreateFromTail() //尾插法创建单链表
{
	Linklist L;			//定义头指针L
	LNode *r,*s;		//定义节点的指针r和s,s指向新开辟的数据,r指向尾节点
	int x;				//定义要输入的数据
	L = (LNode*)malloc(sizeof(LNode));//为头指针开辟内存空间
	L->next=NULL;		//将头指针的next初始化为空
	r=L;				//将尾指针指向头指针L
	//输入数据
	printf("请输入一个整型数:");
	scanf("%d", &x);
	//用循环继续添加数据,当输入为-1时输入完成
	while (x != -1)
	{
		s = (LNode*)malloc(sizeof(LNode));//为新数据开辟内存空间
		s->data = x;						//将数据存入到节点的data中
		s->next = r->next;					//将新数据的next赋值为头节点的next
		r->next = s;						//将尾指针指向新数据
		r=s;								//将新插入的节点设为尾指针
		//输入数据
		printf("请输入一个整型数:");
		scanf("%d", &x);
	}
	r->next=NULL;						//将尾指针的next指向NULL
	return L;		//返回头节点
}

总结

头插法和尾插法建立单链表步骤很相似,而尾插法需要将新插入的节点重新设为尾节点,以上就是两种方法创建单链表。

### 使用 Python 实现单链表 #### 1. 定义节点类 为了构建单链表,首先需要定义一个表示节点的类。每个节点包含两个部分:数据项 `data` 和指向下一个节点的链接 `next`。 ```python class Node: def __init__(self, data=None): self.data = data # 数据域 self.next = None # 指针域,默认初始化为空 ``` 此段代码展示了如何通过面向对象的方式,在Python中创建一个新的节点实例[^1]。 #### 2. 构建单链表类 接下来定义一个名为 `LinkedList` 的类来管理这些节点,并封装各种操作函数: ```python class LinkedList: def __init__(self): self.head = None # 初始化头指针为None def append(self, new_data): # 添加新元素到列表末尾的方法 new_node = Node(new_data) if not self.head: self.head = new_node return last = self.head while last.next: last = last.next last.next = new_node ``` 上述实现了基本的追加功能,即当给定新的数据时能够将其添加至现有链条末端。 #### 3. 执行插入、删除和其他常见操作 除了简单的附加外,还可以扩展此类以支持更多的实用特性,比如按索引位置插入或者移除指定值等动作: ```python def insert_at_index(self, index, value): """在特定的位置插入""" pass def delete_by_value(self, key): """根据键名删除节点""" temp = self.head # 如果要删除的是头部节点的情况 if (temp and temp.data == key): self.head = temp.next temp = None return prev = None while (temp and temp.data != key): prev = temp temp = temp.next if temp is None: return prev.next = temp.next temp = None ``` 这里仅给出了框架性的指导;具体实现细节会依据实际需求有所不同[^5]。 #### 4. 输出整个链表的内容 最后,可以编写一个遍历并打印所有节点的方法以便于调试或展示结果: ```python def print_list(self): current = self.head while current: print(current.data, end=" -> ") current = current.next print("None") ``` 这段程序将会按照顺序访问每一个连接起来的对象,并依次输出它们所携带的信息直到遇到终止符为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值