c语言实现链表的创建、插入、删除、查找、遍历的基本操作完整代码
时间: 2023-09-30 22:05:41 浏览: 191
以下是基于单链表的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
//定义链表结构体
struct ListNode {
int val; //存储节点的值
struct ListNode *next; //指向下一个节点的指针
};
//创建一个新节点
struct ListNode *createNode(int val) {
struct ListNode *newNode = (struct ListNode *)malloc(sizeof(struct ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
//在链表末尾插入一个节点
void insertNodeAtEnd(struct ListNode **head, int val) {
struct ListNode *newNode = createNode(val);
if (*head == NULL) {
*head = newNode;
return;
}
struct ListNode *tail = *head;
while (tail->next != NULL) {
tail = tail->next;
}
tail->next = newNode;
}
//在链表头部插入一个节点
void insertNodeAtHead(struct ListNode **head, int val) {
struct ListNode *newNode = createNode(val);
newNode->next = *head;
*head = newNode;
}
//删除链表中第一个值为val的节点
void deleteNode(struct ListNode **head, int val) {
if (*head == NULL) {
return;
}
if ((*head)->val == val) {
*head = (*head)->next;
return;
}
struct ListNode *prev = *head;
struct ListNode *curr = (*head)->next;
while (curr != NULL && curr->val != val) {
prev = curr;
curr = curr->next;
}
if (curr != NULL) {
prev->next = curr->next;
free(curr);
}
}
//查找链表中是否存在值为val的节点
int searchNode(struct ListNode *head, int val) {
struct ListNode *curr = head;
while (curr != NULL) {
if (curr->val == val) {
return 1;
}
curr = curr->next;
}
return 0;
}
//遍历链表并输出所有节点的值
void printList(struct ListNode *head) {
struct ListNode *curr = head;
while (curr != NULL) {
printf("%d ", curr->val);
curr = curr->next;
}
printf("\n");
}
int main() {
struct ListNode *head = NULL;
insertNodeAtEnd(&head, 1);
insertNodeAtEnd(&head, 2);
insertNodeAtEnd(&head, 3);
insertNodeAtHead(&head, 0);
printList(head); // 0 1 2 3
deleteNode(&head, 2);
printList(head); // 0 1 3
printf("%d\n", searchNode(head, 1)); // 1
printf("%d\n", searchNode(head, 2)); // 0
return 0;
}
```
这里我们定义了一个结构体`ListNode`来表示链表中的节点,每个节点包含一个`val`成员来存储节点的值,还有一个`next`指针成员来指向下一个节点。我们使用`createNode`函数来创建一个新节点,并使用`insertNodeAtEnd`和`insertNodeAtHead`函数来在链表末尾和头部插入新节点。`deleteNode`函数可以删除链表中第一个值为`val`的节点,而`searchNode`函数用于查找链表中是否存在值为`val`的节点。最后,我们使用`printList`函数来遍历链表并输出所有节点的值。在`main`函数中,我们演示了如何使用这些函数来操作链表。
阅读全文