用头插法创建一个单向链表,并对此单向链表实现插入,删除,查找等操作,用c语言
时间: 2023-06-12 20:07:35 浏览: 108
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。
阅读全文