用头插法创建一个链表
时间: 2024-03-13 17:35:51 浏览: 115
使用头插法创建链表的步骤如下:
1. 创建一个头结点,将其指针指向空。
2. 逐个插入节点,每次插入一个新节点时,将新节点的指针指向头结点的下一个节点,然后将头结点的指针指向新节点。
3. 重复第2步,直到插入完所有的节点。
下面是用头插法创建链表的示例代码:
```python
class Node:
def __init__(self, data):
self.data = data
self.next = None
def create_linked_list(elements):
head = Node(None)
for element in elements:
new_node = Node(element)
new_node.next = head.next
head.next = new_node
return head.next
```
相关问题
用头插法创建一个单向链表,并对此单向链表实现插入,删除,查找等操作,用c语言
下面是头插法创建单向链表,并实现插入、删除和查找操作的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct node {
int data;
struct node* next;
} Node;
// 创建一个空链表
Node* createList() {
Node* head = (Node*)malloc(sizeof(Node)); // 创建头结点
head->next = NULL; // 初始化为空链表
return head;
}
// 在链表头部插入一个元素
void insertHead(Node* head, int data) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新节点
newNode->data = data; // 设置新节点数据
newNode->next = head->next; // 新节点指向原先的第一个节点
head->next = newNode; // 头结点指向新节点
}
// 在链表尾部插入一个元素
void insertTail(Node* head, int data) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新节点
newNode->data = data; // 设置新节点数据
newNode->next = NULL; // 新节点指向空
Node* cur = head;
while (cur->next != NULL) { // 找到最后一个节点
cur = cur->next;
}
cur->next = newNode; // 最后一个节点指向新节点
}
// 查找链表中是否存在某个元素,返回找到的节点指针,不存在返回NULL
Node* find(Node* head, int data) {
Node* cur = head->next;
while (cur != NULL) {
if (cur->data == data) {
return cur;
}
cur = cur->next;
}
return NULL;
}
// 删除链表中某个元素,成功返回1,失败返回0
int delete(Node* head, int data) {
Node* pre = head;
Node* cur = head->next;
while (cur != NULL) {
if (cur->data == data) {
pre->next = cur->next; // 前一个节点指向后一个节点
free(cur); // 释放被删除的节点
return 1; // 删除成功
}
pre = cur;
cur = cur->next;
}
return 0; // 删除失败
}
// 打印链表
void printList(Node* head) {
Node* cur = head->next;
while (cur != NULL) {
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}
int main() {
Node* head = createList(); // 创建一个空链表
insertHead(head, 1); // 在头部插入元素1
insertHead(head, 2); // 在头部插入元素2
insertTail(head, 3); // 在尾部插入元素3
insertTail(head, 4); // 在尾部插入元素4
printList(head); // 打印链表:2 1 3 4
Node* node = find(head, 3); // 查找是否存在元素3
if (node != NULL) {
printf("Find 3\n");
} else {
printf("Not find 3\n");
}
delete(head, 1); // 删除元素1
printList(head); // 打印链表:2 3 4
return 0;
}
```
在代码中,我们使用了头插法创建单向链表,头结点不存储任何数据,仅仅作为链表的起点。插入操作可以在链表头部和尾部进行,删除操作通过查找元素找到需要删除的节点,然后释放该节点的内存空间即可。查找操作返回找到的节点指针,不存在返回NULL。
头插法创建链表c语言
头插法创建链表是一种在链表头部插入新节点的方法。在C语言中,可以使用以下代码实现头插法创建链表:
```c
typedef struct Lnode {
char data;
struct Lnode* next;
} Lnode, *Linklist;
Linklist Establish_Linklist_head1(void) {
char arr\[5\] = {'a', 'b', 'c', 'd', 'e'};
int i = sizeof(arr) / sizeof(arr\[0\]);
Linklist l = (Linklist)malloc(sizeof(Lnode));
l->next = NULL;
l->data = arr\[i - 1\];
while (i--) {
Lnode* p = (Linklist)malloc(sizeof(Lnode));
p->data = arr\[i - 1\];
p->next = l;
l = p;
}
return l;
}
```
这段代码会创建一个带有头结点和头指针的链表,其中头结点的数据域为空,头指针指向第一个节点。通过循环将数组中的元素依次插入链表的头部,最后返回链表的头指针。
方法1和方法2都是使用头插法创建链表,它们的最终结果是一样的。方法1是在头结点之后插入新节点,而方法2是在链表的最前面插入新节点。方法2在产生头结点时可能会出现跨界访问的问题,但是编译器可能不会报错或警告。为了避免非法访问,可以改变循环条件,并在循环之后再插入一个头结点。方法2仅供参考,学习链表时建议使用方法1。
希望对你有帮助!
#### 引用[.reference_title]
- *1* *2* *3* [c语言单链表的创建(头插法和尾插法)](https://blog.csdn.net/m0_69251699/article/details/129103530)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文